procedure TLineItem.Draw(aCanvas: TCanvas);
var
Xa, Ya, Xb, Yb: real;
D: real;
X1, Y1, X0, Y0: Integer;
begin
aCanvas.Pen.Style := PsSolid;
aCanvas.Pen.Color := clWhite;
//画直线
aCanvas.MoveTo(PtStart.X, PtStart.Y);
aCanvas.LineTo(PtEnd.X, PtEnd.Y);
//画箭头
X0 := PtStart.X;//PtStart是箭头的起点,PtEnd是终点,都是Tpoint型
Y0 := PtStart.Y;
X1 := PtEnd.X;
Y1 := PtEnd.Y;
D := Sqrt((Y1 - Y0) * (Y1 - Y0) + (X1 - X0) * (X1 - X0));
if D > 0 then begin
Xa := X1 + ARROWLEN * ((X0 - X1) + (Y0 - Y1) / 2) / D;
Ya := Y1 + ARROWLEN * ((Y0 - Y1) - (X0 - X1) / 2) / D;
Xb := X1 + ARROWLEN * ((X0 - X1) - (Y0 - Y1) / 2) / D;
Yb := Y1 + ARROWLEN * ((Y0 - Y1) + (X0 - X1) / 2) / D;
aCanvas.MoveTo(PtEnd.X, PtEnd.Y);
aCanvas.LineTo(Trunc(Xa), Trunc(Ya));
aCanvas.MoveTo(PtEnd.X, PtEnd.Y);
aCanvas.LineTo(Trunc(Xb), Trunc(Yb));
end;
//如果选中画出焦点矩形,可以不要
if FSelected = true then begin
aCanvas.Rectangle((PtStart.X - FORCUSRANGE),
(PtStart.Y - FORCUSRANGE),
(PtStart.X + FORCUSRANGE),
(PtStart.Y + FORCUSRANGE));
aCanvas.Rectangle((PtEnd.X - FORCUSRANGE),
(PtEnd.Y - FORCUSRANGE),
(PtEnd.X + FORCUSRANGE),
(PtEnd.Y + FORCUSRANGE));
end;
end;
canvas是任何一个拥有画笔的组件的canvas都可以。具体几何依据原作者没有讲。但是经过底下验算。有三个特点。
1. 箭头两翼端点连线和直线垂直(斜率之积等于-1)。
2. .箭头两翼长度相同。(等腰三角形)
3. 箭头两翼长度和两翼端点间的距离比值一定。(决定了夹角)
[系统软件]如何在Linux系统上进行快速磁带备份 [C语言系列]如何在Jbuilder9中使用SQLServer JDBC驱动 [VB.NET程序]如何在Visual Basic 6.0 中连接加密的Access数据库 [VB.NET程序]如何在vb 中用api函数代替winsock控件建立网络连接… [Delphi程序]如何在delphi6中调试web程序 [Delphi程序]如何在Delphi中用代码来完成计算字段的创建 [Delphi程序]如何在 Listbox 上显示 In-place Tooltips [Delphi程序]如何在Delphi应用程序中调用CHM文档 [Delphi程序]如何在Delphi中使用正则表达式 [Delphi程序]如何在delphi下和.net建立的webservice 进行协同工…
|