如何超难的绘图 操作 ????????????? (图)急!!!!!!!!!!我想实现的功能是: 让用户输入一个起点坐标(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---------------------------------------------
请各位高手帮忙实现这样的绘画, 提供详细的代码,最好带中文注释!!!!
--------------------------------------
2.又例如:用户输入了起点坐标 x为110 ,y为210 和 输入了 终点坐标 x为240,y为49(下图的两个红色的小方框表示起点坐标和一个终点坐标), 绘制一条直线 ,然后在这条直线的终点上退后50个像素!!然后在这个位置绘画一个与直线同一个方向的箭头(下图的红色的大方框就是箭头):http://www.ttx.com.cn/bbs/v0qdu_2004-7/2004-12/2004123085821367.jpg---------------------------------------------
请各位高手帮忙实现这样的绘画, 提供详细的代码,最好带中文注释!!!!
用户输入起点坐标 和 一个终点坐标后, 要自动生成 直线和 直线终点上退后50个像素,然后在这个位置绘画一个与直线同一个方向的箭头! 你们能写出代码吗????e-mail: [email protected]
谢谢先!
e-mail: [email protected]
with image1.canvas do
begin
moveto(st.x,st.y);
lineto(ed.x,ed.y);
end;
再就只要運用你的高中數學裏面的sin,cos,tan,contan來算出箭頭的三個端點了,老大如果這樣的你也要別人幫你做就沒辦法了。
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.
在下面这个贴子里
http://community.csdn.net/Expert/topic/3660/3660158.xml?temp=.4182855大花猫的答案才是正解.:)我只是偷学到了点东西.嘿嘿.逮个旮旯偷笑去.