I am working on a MFC application that allows the user to draw some lines to construct a diagram that I will then analyze. I need to be able to place an arrowhead on the end of a line once the ser selects the end of the line by lifting the mouse button as he/she drags the line around the Cview screen.

I am having trouble developing an algorithm using LineTo and MoveTo functions to draw the arrowhead based on the location of the end point of the line. I need the arrowhead to be the same size for all lines. The trouble I am having is due to the fact that the line may be drawn at any angle ( 0 degrees - 360 degrees ).

Does anyone have some code or ideas on how to do this? Is there a way to do it with a bitmap if LineTo and MoveTo do not suffice?

I am having trouble developing an algorithm using LineTo and MoveTo functions to draw the arrowhead based on the location of the end point of the line. I need the arrowhead to be the same size for all lines. The trouble I am having is due to the fact that the line may be drawn at any angle ( 0 degrees - 360 degrees ).

Does anyone have some code or ideas on how to do this? Is there a way to do it with a bitmap if LineTo and MoveTo do not suffice?

something like this (mix of real and psuedocode)

// assume here that your line endpoints are know

// as x1,y1 x2,y2, and that you want the arrow at x1,y1 end

// and that int arrowsize represents how far back the arrow

// starts on the line. note that you'll want to add checks to

// make sure that the arrowhead isn't longer than the line.

// and also note that you should scale the arrow size with the

// line thickness.

// this is the angle of the line (origin at x1,y1)

double theta = atan2(x2-x1,y2-y1); // see the ref on atan2

// now find the vertical and horizontal components of

// a point located arrowsize away from x1,y1

int x3 = x1 + (arrowsize * cos(theta));

int y3 = y1 + (arrowsize * sin(theta));

// now you need to find the other points of the arrowhead:

// /A

// /

// E--M----------------------

// \

// \B

// we just got M, now we need A and B, where the fatness is

// represented by some scale of arrowsize we'll assume fatness

// is already declared, a good value might be .33

// the other points are as follows

int x4 = x3 + ((y3 - y1) * fatness);

int y4 = y3 + ((x3 - x1) * fatness);

// and

int x5 = x3 - ((y3 - y1) * fatness);

int y5 = y3 - ((x3 - x1) * fatness);

// from there, just draw away.

What i feel is if u hardcode the length of the arrow head it w'll look awkward when the

lenght of the arrow itself is very small. So i have given a length as a 20% ratio of the

line legth if u don't want this feature eliminate the if statment;

Try this

CPen penBlack;

if(penBlack.CreatePen(PS_S

{

CPen *pOldPen=pDC->SelectObject

double PI= (double(22)/double(7));

y=-y;//To reverse the default coordinate direction of windows

double theta,theta1,theta2;

theta=double(atan(y/x));

pDC->MoveTo(0,0);

if((x>=0)&&(y>=0))

theta=theta;

if((x<=0)&&(y>=0))

theta=PI+theta;

if((x<=0)&&(y<=0))

theta=PI+theta;

if((x>=0)&&(y<=0))

theta=2*PI+theta;

//radius is the length of the complex number from the origin

double radius;

radius= sqrt(x*x+y*y);

double radius2,radius1;

//radius2 is the length of the arrow

radius2=radius*0.2;

if (radius2>25) radius2=25;

//radius1 is the distance of the origin from the other tip of the arrow

radius1=sqrt((radius*radiu

double delta =asin(radius2*sin(PI/12)/r

double delta2=asin(radius2*sin(PI

theta2=theta-delta;

theta1=theta+delta;

if((x==0)&&(y>0))

{

theta1=PI/2+delta2;

theta2=PI/2-delta2;

}

if((x==0)&&(y<0))

{

theta1=3*PI/2+delta2;

theta2=3*PI/2-delta2;

}

if((y==0)&&(x>0))

{

theta1= delta2;

theta2= -delta2;

}

if((y==0)&&(x<0))

{

theta1=PI+delta2;

theta2=PI-delta2;

}

pDC->LineTo(x,y);

pDC->LineTo(radius1*cos(th

pDC->MoveTo(x,y);

pDC->LineTo(radius1*cos(th

pDC->SelectObject(pOldPen)

}

as for the arrow size, you can use whatever you want to get the arrow size.

at any rate, the code I used is from production code of a shipping product. I'm kinda burned that you won't credit my answer.

Please provide your email to receive a free trial preview!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.