如何画带箭头的直线???

解决方案 »

  1.   

    试试这个,也许符合你的要求
        PROCEDURE DrawArrow(CONST Canvas:  TCanvas;
                          CONST x1,y1, x2,y2:  INTEGER;
                          CONST HeadLength:  INTEGER;
                          CONST HeadFill:  BOOLEAN;
                          CONST color:  TColor);
        VAR
          Triangle        :  ARRAY[0..2] OF TPoint;
          xbase           :  INTEGER;
          xLineDelta      :  INTEGER;
          xLineUnitDelta  :  Double;
          xMiddle         :  INTEGER;
          xNormalDelta    :  INTEGER;
          xNormalUnitDelta:  Double;
          ybase           :  INTEGER;
          yLineDelta      :  INTEGER;
          yLineUnitDelta  :  Double;
          yMiddle         :  INTEGER;
          yNormalDelta    :  INTEGER;
          yNormalUnitDelta:  Double;
      BEGIN
        Canvas.Pen.Color := color;
        Canvas.Brush.Style := bsSolid;    Canvas.MoveTo(x1,y1);
        Canvas.LineTo(x2,y2);    xLineDelta := x2 - x1;
        yLineDelta := y2 - y1;    xLineUnitDelta := xLineDelta / SQRT( SQR(xLineDelta) + SQR(yLineDelta) );
        yLineUnitDelta := yLineDelta / SQRt( SQR(xLineDelta) + SQR(yLineDelta) );    // (xBase,yBase) is where arrow line is perpendicular to base of triangle.
        xBase := x2 - ROUND(HeadLength * xLineUnitDelta);
        yBase := y2 - ROUND(HeadLength * yLineUnitDelta);    xNormalDelta :=  yLineDelta;
        yNormalDelta := -xLineDelta;
        xNormalUnitDelta := xNormalDelta / SQRT( SQR(xNormalDelta) + SQR(yNormalDelta) );
        yNormalUnitDelta := yNormalDelta / SQRt( SQR(xNormalDelta) + SQR(yNormalDelta) );
        Triangle[0] := Point(x2,y2);
        Triangle[1] := Point(xBase + ROUND(HeadLength*xNormalUnitDelta),
                             yBase + ROUND(HeadLength*yNormalUnitDelta));
        Triangle[2] := Point(xBase - ROUND(HeadLength*xNormalUnitDelta),
                              yBase - ROUND(HeadLength*yNormalUnitDelta));    // Draw the arrow tip
        Canvas.Polygon(Triangle);    // Floodfill from "middle" of triangle head
        IF   HeadFill
        THEN BEGIN
          xMiddle := (Triangle[0].x + Triangle[1].x + Triangle[2].x) DIV 3;
          yMiddle := (Triangle[0].y + Triangle[1].y + Triangle[2].y) DIV 3;
          Canvas.Brush.Color := color;  // Canvas.Pixels[xMiddle, yMiddle];
          Canvas.FloodFill(xMiddle,yMiddle,
             color,
             fsBorder);
        END  END;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        DrawArrow(Form1.canvas,50,50,100,100,10,True,clblack);
    end;