如何超难的绘图 操作 ????????????? (图)急!!!!!!!!!!!!!!!!!!!!!!!!!!!! 回复内容

1 楼Allblus(爽)回复于 2004-12-30 11:28:48

這個不就是化三條綫嗎。Top

2 楼caiso(十年磨一剑)回复于 2004-12-30 11:31:47

关注中,Top

3 楼e_feeling(点击无限)回复于 2004-12-30 12:38:15

GZTop

4 楼myling(不理你)回复于 2004-12-30 13:36:26

这也叫超难?  
   
  就按照你写得步骤以条线一条线的画就行了!Top

5 楼mc43(火猴)回复于 2004-12-30 15:12:29

这也叫超难?  
   
  就按照你写得步骤以条线一条线的画就行了!Top

6 楼fsqman(q)回复于 2004-12-30 15:48:48

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

7 楼myling(不理你)回复于 2004-12-30 20:42:59

moveto    
  lineto  
  Top

8 楼fsqman(q)回复于 2004-12-30 21:36:54

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

9 楼myling(不理你)回复于 2004-12-30 21:52:54

自己留着脑子和手干什么?Top

10 楼linzhengqun(风。我回来了)回复于 2004-12-30 22:30:40

呵呵,自己学着做,能够学到更多的东西哦Top

11 楼ocean617(海洋)回复于 2004-12-30 23:09:17

建议用实现LMD组件来实现吧Top

12 楼fsqman(q)回复于 2004-12-31 08:10:29

请问   ocean617(海洋)   LMD   组件在哪里下载??   急!!!  
   
   
  谢谢先!  
  e-mail:   fsdisk@163.com  
   
   
  Top

13 楼xiaoxiao197821(你的笑对我很重要)回复于 2004-12-31 08:56:17

找一找,网上资料很多Top

14 楼Allblus(爽)回复于 2004-12-31 11:12:03

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

15 楼Allblus(爽)回复于 2004-12-31 11:13:37

自己的動手能力很重要Top

16 楼Allblus(爽)回复于 2004-12-31 11:16:52

arctan求出綫的角度Top

17 楼fsqman(q)回复于 2004-12-31 11:22:02

请问如何获得   "直线终点上退后50个像素"   的坐标   ??????       这个我想了很久也想不出来!!!!Top

18 楼10975037(猩猩)回复于 2004-12-31 11:36:41

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

19 楼Allblus(爽)回复于 2004-12-31 11:40:44

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

20 楼10975037(猩猩)回复于 2004-12-31 12:22:37

贴一个代码;  
   
  unit   Unit1;  
   
  interface  
   
  uses  
      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.Top

21 楼fsqman(q)回复于 2005-01-02 12:35:46

upTop

22 楼YFLK(远方来客)回复于 2005-01-03 10:24:41

这个问题中学生可以解决,关键问题是绘图比例,50个象素是没有比例的,而两点坐标和它们之间连线是有比例的,Top

23 楼YFLK(远方来客)回复于 2005-01-03 10:26:51

如果第一点坐标位于屏幕边上,那50个象素位置如何确定Top

24 楼Allblus(爽)回复于 2005-01-03 10:31:31

星星,那個矢量旋轉是什麽意思啊?可以解釋下不?Top

25 楼Allblus(爽)回复于 2005-01-03 10:33:11

偏移值跟绝对座标值是什么意思啊?Top

26 楼miky(miky)回复于 2005-01-03 10:42:48

用GDI+吧,现成的函数.Top

27 楼fsqman(q)回复于 2005-01-03 14:40:36

猩猩,多谢你!!   你做对了!Top

28 楼10975037(猩猩)回复于 2005-01-04 16:06:59

给分哈.T_TTop

29 楼Allblus(爽)回复于 2005-01-04 16:21:33

看了很久才看懂,唉,刚放下书本矢量旋转的就忘记了。Top

30 楼Allblus(爽)回复于 2005-01-04 16:24:58

10975037(猩猩)好样的,把大花猫的灵活运用使得可以定义PL长度。Top

31 楼10975037(猩猩)回复于 2005-01-07 10:01:26

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