Drawing an ArrowLine
Website : www.mayankmalik.cjb.net
Environment: VC 5-6 , Windows 95/98/2000/NT/Me
Recently I had to develop a Graphics Software and wanted to add support for drawing an Arrow Line / Measuring Line. This was essential for the software and I had no option but to go over my trigonometry fundas. After churning for a couple of hours , I came up with this technique for drawing arrowheads at the end of a line.
The Lines are drawn when you drag the mouse . The drawing mode used is R2_NOT .As long as the user is dragging the mouse , the Line is refreshing itself (by redrawing) . You need to include "math.h" in your View.cpp file .
This checks when the User Starts dragging the mouse :
void CPolygonsView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_Drag = true; // for mouse drag check
PointOrigin = point; // value when mouse drag starts
CView::OnLButtonDown(nFlags, point);
}
void CPolygonsView::OnLButtonUp(UINT nFlags, CPoint point)
{
m_Drag = false; // for mouse drag check
MotionFix=0;
CView::OnLButtonUp(nFlags, point);
}
All the drawing is invoked by the MouseMove function . First the previously drawn Line is erased (by redrawing over it - using R2_NOT) and then the new Line is drawn using the new coordinates.
The loop computes all the other coordinates using these elements and draws lines connecting one vertex to the other.
void CPolygonsView::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_Drag && PointOrigin!=point) // for mouse drag check
{
CClientDC ClientDC(this); // graphics
ClientDC.SetROP2(R2_NOT);
if (MotionFix) DrawArrow(&ClientDC,PointOrigin,PointOld);
MotionFix=1;
// MotionFix is used to prevent redrawing in case it is the
// First Element
DrawArrow(&ClientDC,PointOrigin,point);
}
PointOld = point;
CView::OnMouseMove(nFlags, point);
}
ok , that was the easy part , now the actual computation is done in the DrawArrow Function
void DrawArrow(CDC *pdc,CPoint m_One, CPoint m_Two)
{
double slopy , cosy , siny;
double Par = 10.0; //length of Arrow (>)
slopy = atan2( ( m_One.y - m_Two.y ),
( m_One.x - m_Two.x ) );
cosy = cos( slopy );
siny = sin( slopy ); //need math.h for these functions
//draw a line between the 2 endpoint
pdc->MoveTo( m_One );
pdc->LineTo( m_Two );
//here is the tough part - actually drawing the arrows
//a total of 6 lines drawn to make the arrow shape
pdc->MoveTo( m_One);
pdc->LineTo( m_One.x + int( - Par * cosy - ( Par / 2.0 * siny ) ),
m_One.y + int( - Par * siny + ( Par / 2.0 * cosy ) ) );
pdc->LineTo( m_One.x + int( - Par * cosy + ( Par / 2.0 * siny ) ),
m_One.y - int( Par / 2.0 * cosy + Par * siny ) );
pdc->LineTo( m_One );
/*/-------------similarly the the other end-------------/*/
pdc->MoveTo( m_Two );
pdc->LineTo( m_Two.x + int( Par * cosy - ( Par / 2.0 * siny ) ),
m_Two.y + int( Par * siny + ( Par / 2.0 * cosy ) ) );
pdc->LineTo( m_Two.x + int( Par * cosy + Par / 2.0 * siny ),
m_Two.y - int( Par / 2.0 * cosy - Par * siny ) );
pdc->LineTo( m_Two );
}

Comments
Unable to understand the code!
Posted by Dick on 04/24/2012 04:48ampdc-LineTo( m_One.x + int( - Par * cosy - ( Par / 2.0 * siny ) ), m_One.y + int( - Par * siny + ( Par / 2.0 * cosy ) ) ); pdc-LineTo( m_One.x + int( - Par * cosy + ( Par / 2.0 * siny ) ), m_One.y - int( Par / 2.0 * cosy + Par * siny ) ); I can't understand this part of the code,either!I would be very grateful if you could explain it.
ReplyThe mathematical formula?
Posted by vanzyf on 07/14/2011 10:27pmI don`t understand mathematical formula!
Posted by vanzyf on 07/14/2011 10:24pmMathematical formula?
Posted by Legacy on 12/03/2003 12:00amOriginally posted by: Ox
Plese explain mathematical, the formula u use for draw the arrow, and can u show how long it is the arrow?
ReplyVB Equivalent?
Posted by Legacy on 12/17/2002 12:00amOriginally posted by: Makarand
ReplyCSrollView problems...
Posted by Legacy on 10/22/2002 12:00amOriginally posted by: Pk Reddy
Hello,
ReplyI am trying to implement drawing of an arrow using mouse in a scroll view and have implemented automatic scrolling of scroll view when the mouse moves out of its bounds.
I am having a few problems in getting the arrow drawn correctly when the view is scrolled. The initial point loses it focus and continues to be drawn in the view which is visible. Can someone implement a program to show how we can draw an arrow in a scroll view with automatic scrolling.
regards
Pavan
How to change the angle of arrow?
Posted by Legacy on 07/19/2002 12:00amOriginally posted by: wham
I couldn't find the angle parameter in your arithmetic.
ReplyWould you please tell me how to change?
Is there a way to do color?
Posted by Legacy on 07/13/2002 12:00amOriginally posted by: Tenalibabu
ReplyWe need more guys like you
Posted by Legacy on 04/23/2002 12:00amOriginally posted by: Alex Ndungu
You have saved a friend of mine a load of trouble. You will be duly acknowledged.
ReplyGeronimo
Posted by Legacy on 03/20/2002 12:00amOriginally posted by: Javed Lodhi
ReplyLoading, Please Wait ...