可以用 LineDDA 函数,不过这玩意画出来的东西就是一砣屎,而且它用的也是逐个象素填充的方法;我本科学图形学的时候写过一个函数(Bresenham 算法),可以画任意宽度的虚线、点线,你可以试一下:
uses Math;
procedure BrshLine(const nXStart, nYStart, nXEnd, nYEnd: Integer; ACanvas: TCanvas);
procedure Widen(x, y: Integer);
var
w, i, j, k: Integer;
begin
w := ACanvas.Pen.Width;
i := w div 2 - 1;
for j := 0 to w - 1 do
for k := 0 to w - 1 do
SetPixel(ACanvas.Handle, x - i + k, y - i + j, ACanvas.Pen.Color);
end;
var
T, T2, Counter, x, y, d, dx, dy, e, i: Integer;
k: Double;
begin
T := 1;
T2 := 2;
Counter := 0;
//////////////////////////////////////////////////////
//可以根据个人意愿进行修改
case ACanvas.Pen.Style of
psDash:
begin
T := ACanvas.Pen.Width*2;
T2 := T*2;
end;
psDot:
begin
T := ACanvas.Pen.Width;
T2 := T*3;
end;
psDashDot:
begin
end;
end;
//////////////////////////////////////////////////////
if nXEnd <> nXStart then
k := (nYEnd - nYStart)/(nXEnd - nXStart)
else k := MaxInt;
if (k < 0) and (k > -1) then
x := Max(nXStart, nXEnd)
else x := Min(nXStart, nXEnd);
if k <= -1 then
y := Max(nYStart, nYEnd)
else y := Min(nYStart, nYEnd);
if k < 0 then
d := -1
else d := 1;
dx := Abs(nXEnd - nXStart);
dy := Abs(nYEnd - nYStart);
if (k > -1) and (k < 1) then
begin
e := -dx;
for i := 0 to dx do
begin
if Counter div T - 1 = 0 then Widen(x, y);
Inc(Counter);
if Counter = T2 then Counter := 0;
Inc(x, d);
Inc(e, 2 * dy);
if e >= 0 then
begin
Inc
;
Dec(e, 2 * dx);
end;
end;
end
else begin
e := -dy;
for i := 0 to -e do
begin
if Counter div T - 1 = 0 then Widen(x, y);
Inc(Counter);
if Counter = T2 then Counter := 0;
Inc(y, d);
Inc(e, 2 * dx);
if e >= 0 then
begin
Inc(x);
Dec(e, 2 * dy);
end;
end;
end;
end;