如何超难的绘图 操作 ????????????? (图)急!!!!!!!!!!我想实现的功能是: 让用户输入一个起点坐标(x,y的值)   和   一个终点坐标(x,y的值) ,  然后在 image 控件 中 按照 起点坐标 和 终点坐标 绘制一条直线 , 然后在这条直线的终点上退后50个像素!!然后在这个位置绘画一个与直线同一个方向的箭头!!!例如:1.例如:用户输入了起点坐标 x为30 ,y为40 和 输入了 终点坐标  x为110 ,y为98(下图的两个红色的小方框表示起点坐标和一个终点坐标), 绘制一条直线 ,然后在这条直线的终点上退后50个像素!!然后在这个位置绘画一个与直线同一个方向的箭头(下图的红色的大方框就是箭头):http://www.ttx.com.cn/bbs/v0qdu_2004-7/2004-12/2004123085810654.jpg
--------------------------------------
2.又例如:用户输入了起点坐标 x为110 ,y为210 和 输入了 终点坐标  x为240,y为49(下图的两个红色的小方框表示起点坐标和一个终点坐标), 绘制一条直线 ,然后在这条直线的终点上退后50个像素!!然后在这个位置绘画一个与直线同一个方向的箭头(下图的红色的大方框就是箭头):http://www.ttx.com.cn/bbs/v0qdu_2004-7/2004-12/2004123085821367.jpg---------------------------------------------
请各位高手帮忙实现这样的绘画, 提供详细的代码,最好带中文注释!!!!

解决方案 »

  1.   

    TO:  myling(AD) 你能给出代码吗???
    用户输入起点坐标 和 一个终点坐标后, 要自动生成 直线和 直线终点上退后50个像素,然后在这个位置绘画一个与直线同一个方向的箭头! 你们能写出代码吗????e-mail: [email protected]
      

  2.   

    TO:  myling(AD) 我要的是全部代码!!
      

  3.   

    请问 ocean617(海洋) LMD 组件在哪里下载?? 急!!!
    谢谢先!
    e-mail: [email protected]
      

  4.   

    你這樣試試:
     with image1.canvas do 
       begin
         moveto(st.x,st.y);
         lineto(ed.x,ed.y);
       end;
     再就只要運用你的高中數學裏面的sin,cos,tan,contan來算出箭頭的三個端點了,老大如果這樣的你也要別人幫你做就沒辦法了。
      

  5.   

    http://community.csdn.net/Expert/topic/3660/3660158.xml?temp=.4182855看这个.自已改一下代码就OK了
      

  6.   

    暈阿! 自己到本子上划划,50个像素長度就是50,直綫角度a,(ed.x-50*cosa,ed.y+50*sina).直綫斜率不同正負號可能要變。
      

  7.   

    贴一个代码;unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,Math;type
      TForm1 = class(TForm)
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
      private
        function rotateVec(P:TPoint; ang: Double;isChLen:Boolean;NewLen:Double): TPoint;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    {$R *.dfm}
    var
      PB:TPoint;PE:TPoint;
    const
      H=20;
      L=7;
      PL=10;function TForm1.rotateVec(P:TPoint; ang: Double;isChLen:Boolean;NewLen:Double): TPoint;
    var
      d:double;
      TP:TPoint;
    begin
      TP.X := Round(P.X * cos(ang) - P.Y * sin(ang));
      TP.Y := Round(P.X * sin(ang) + P.Y * cos(ang));
      Result:=TP;
      if isChlen then
      begin
        D := sqrt(TP.X * TP.X + TP.Y * TP.Y );
        Result.X := Round(TP.X / D * newLen);
        Result.Y := Round(TP.Y / D * newLen);
      end;
    end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      PB.X := X;
      PB.Y := Y;
      PE:=PB;
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      A:Double;  //旋转的角度
      AL:Double; //旋转后的长度
      P1:TPoint; //Point1点位置
      P2:TPoint; //Point2点位置
      P3:TPoint; //Point2点位置
    begin
    {
                    *p1
              |PL| /| L
            pe----*-|-------------------*pb
                   \| L
                    *p2
                  |H|}
      PE.X := X;
      PE.Y := Y;
      if (PB.X = PE.X) and (PB.Y = PE.Y) then Exit;
      A  := PI-Tan(L/H);  P3 := rotateVec(Point(PE.X-Pb.X,PE.Y-Pb.Y), PI ,True,PL);  //得到P1点与P3点的X,Y偏移值  //得到P1点和P2点的绝对座标值  P3 := rotateVec(Point(PE.X-Pb.X,PE.Y-Pb.Y), PI ,True,PL);
      p3.X := P3.x + PE.x;
      p3.Y := P3.Y + PE.Y;
      //得到斜边长
      AL := sqrt(L*L+H*H);
      P1 := rotateVec(Point(P3.X-Pb.X,P3.Y-Pb.Y), A,True,AL);
      //得到P2点与P3点的X,Y偏移值
      P2 := rotateVec(Point(P3.X-Pb.X,P3.Y-Pb.Y),-A,True,AL);
      P1.X := P1.X + P3.X;
      P1.Y := P1.Y + P3.Y;
      P2.X := P2.X + P3.X;
      P2.Y := P2.Y + P3.Y;
      //设置画笔模式 ^o^ 为了橡皮筋效果
      Canvas.Pen.Mode:= pmCopy;
      //画线PB-->PE
      Canvas.MoveTo(PB.x,PB.y);
      Canvas.lineTo(PE.X,pE.Y );
      //画线P3-->P1
      canvas.MoveTo(p3.x,p3.y);
      canvas.LineTo(P1.x,P1.y);
      //画线P3-->P2
      canvas.MoveTo(P3.X,P3.Y );
      canvas.LineTo(P2.X,P2.Y);
      //画出P3点
      canvas.Ellipse(p3.X-2,p3.Y-2,p3.X+2 ,p3.Y +2)
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
    {   传说中是橡皮筋  ^_^   }
      if not (ssLeft in Shift) then exit;
      Canvas.Pen.Mode := pmMergePenNot ;
      Canvas.MoveTo(PB.X,PB.Y);
      Canvas.LineTo(PE.X,PE.Y);
      Canvas.MoveTo(PB.X, PB.Y);
    Canvas.LineTo(X, Y);
      PE.X:= X;
    PE.Y:= Y;
    end;end.
      

  8.   

    to Allblus(爽)
    在下面这个贴子里
    http://community.csdn.net/Expert/topic/3660/3660158.xml?temp=.4182855大花猫的答案才是正解.:)我只是偷学到了点东西.嘿嘿.逮个旮旯偷笑去.