# algorythm or suggestion for add arrows to Line

I'm creating a mapping program that will allow users to
link(via a line), drag/drop, and move them at runtime.  I would like to draw a small arrow at one or both ends.  As the control moves, the arrow is correctly positions.

Any Suggestions or agorhythms????
###### Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
I wrote a small app once where users were allowed to drag &
drop stuff all over the place.

about creating components in the manuals, and practice them a little. It will all fall into place.

Best advice i can give you: You will not need to do anything
"tricky" to get this working.
0
Commented:
Hi,

Try the following, I think this is what you want. If have taken a geometry(or computer graphics course before it is self explanatory). There may be more efficient way but I can code this at this time:

To DO

1 - Create a new form. Add a button
2 - Paste the following code over implentation
3 - Link Button1 to the Button1Click below run and enjoy

Note: You only need the function DrawArrow

implementation

{\$R *.DFM}
uses
Math;
//Draws an arrow give angles in degrees in to specified canvas
procedure DrawArrow(C : TCanvas;
O,P :TPoint; //start and end of line
ALen : integer;//length of each arrow tip line
AAngle:integer);//angle between arrow small lines with base line
var
M_PI_DEG : real;
function Rotate(P : TPoint;Angle:Integer):TPoint;
begin
Result.X := Round(P.X*Cos(M_PI_DEG*Angle)-P.Y*Sin(M_PI_DEG*Angle));
Result.Y := Round(P.X*Sin(M_PI_DEG*Angle)+P.Y*Cos(M_PI_DEG*Angle));
end;
function PolarToCartesian(R:Integer;Angle:Integer):TPoint;
begin
Result.X := -Round(R*Cos(M_PI_DEG*Angle));
Result.Y := Round(R*Sin(M_PI_DEG*Angle));
end;
var
BAngle : Integer; //angle between our line and X axis
Arrow  : TPoint ; //storage for our small lines
begin
M_PI_DEG := Pi/180; //for degree to radian conversion
try
// determine base angle(note that screen Y is negative of
// cartesian Y
BAngle := Round(ArcTan2(-(P.Y-O.Y),(P.X-O.X))/M_PI_DEG);
// Draw base line
C.MoveTo(O.X,O.Y);
C.LineTo(P.X,P.Y);
// Rotate tip line 1 to correct position and draw
Arrow := Rotate(PolarToCartesian(ALen, BAngle), AAngle);
C.MoveTo(P.X,P.Y);
C.LineTo(P.X+Arrow.X,P.Y+Arrow.Y);
// Rotate tip line 1 to correct position and draw
Arrow := Rotate(PolarToCartesian(ALen, -BAngle), AAngle);
C.MoveTo(P.X,P.Y);
C.LineTo(P.X+Arrow.X,P.Y-Arrow.Y);
except
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
O, P : TPoint;
begin
O := Point(100,100);
P := Point(200-Random(140),200-Random(140));
DrawArrow(Canvas, O,P, 15,15);
end;

initialization
Randomize;
end.

0

Experts Exchange Solution brought to you by