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????
blitz051697Asked:
Who is Participating?
 
interConnect With a Mentor 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
 
altenaCommented:
I wrote a small app once where users were allowed to drag & 
drop stuff all over the place.

Make your control a "normal" delphi control. Read all the stuff
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
 
blitz051697Author Commented:
Great Example.   This helps--I failed Geometry.

blitz
0
All Courses

From novice to tech pro — start learning today.