📄 ezlinedraw.pas
字号:
x := x + dx_nondiag;
y := y + dy_nondiag;
d := d + nondiag_inc {update decision variable}
End
Else
Begin {midpoint is above the line; step diagonally}
x := x + dx_diag;
y := y + dy_diag;
d := d + diag_inc
End
End;
End {DrawLine};
Procedure PolyDDA( Const PointArray: Array Of TPoint;
Const Parts: Array Of integer; PartCount: Integer;
pCanvas: TCanvas; Grapher: TEzGrapher; PlineType: integer;
PLineColor: TColor; PLineWidth: Integer );
Var
DDAInfo: TDDAInfo;
I: Integer;
Procedure DrawPoly( Proc: TFarProc );
Var
I, p, pStart, pEnd: Integer;
pointarr: EzLib.PPointArray;
Begin
If Proc = Nil Then
Begin
If PartCount = 1 Then
pCanvas.Polyline( Slice( PointArray, Parts[0] ) )
Else
Begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
{ WinNT or Win2000 }
PolyPolyline( pCanvas.Handle, PointArray, Parts, PartCount )
else
begin
{ Win95 or Win98 }
pStart := 0;
For p := 0 To PartCount - 1 Do
Begin
pEnd := pStart + Parts[p] - 1;
pointArr:= @PointArray[pStart];
Polyline( pCanvas.Handle, pointarr^, Succ(pEnd - pStart) );
pStart := pEnd + 1;
End;
end;
End;
End
Else
Begin
PixelCount := 0;
pStart := 0;
For p := 0 To PartCount - 1 Do
Begin
pEnd := pStart + Parts[p] - 1;
For I := pStart To pEnd - 1 Do
DrawLine( PointArray[I].X, PointArray[I].Y,
PointArray[Succ( I )].X, PointArray[Succ( I )].Y, proc,
Longint( @DDAInfo ) );
pStart := pEnd + 1;
End;
End;
End;
Procedure ReDrawPoly( Proc: TFarProc; pOffset: integer );
Var
I, f, n1, n2, p, pStart, pEnd: Integer;
X1, Y1, X2, Y2, Dx, Dy, OffsX, OffsY: Integer;
Begin
If iFactor = 1 Then
Begin
n1 := abs( pOffset );
n2 := abs( pOffset );
End
Else
Begin
n1 := ( abs( pOffset ) - 1 ) * iFactor + 1;
n2 := n1 + abs( pOffset ) * iFactor;
End;
For f := n1 To n2 Do
Begin
PixelCount := 0;
pStart := 0;
For p := 0 To PartCount - 1 Do
Begin
pEnd := pStart + Parts[p] - 1;
For I := pStart To pEnd - 1 Do
Begin
If pOffset < 0 Then
Begin
OffsX := -f;
OffsY := -f;
End
Else
Begin
OffsX := f;
OffsY := f;
End;
X1 := PointArray[I].X;
Y1 := PointArray[I].Y;
X2 := PointArray[Succ( I )].X;
Y2 := PointArray[Succ( I )].Y;
Dx := X2 - X1;
Dy := Y2 - Y1;
If Dy > 0 Then
OffsX := -OffsX;
If Dx < 0 Then
OffsY := -OffsY;
If Dx = 0 Then
Begin
// vertical line
X1 := X1 + OffsX;
X2 := X2 + OffsX;
End
Else If Dy = 0 Then
Begin
// horizontal line
Y1 := Y1 + OffsY;
Y2 := Y2 + OffsY;
End
Else
Begin
// line with angle
X1 := X1 + OffsX;
X2 := X2 + OffsX;
Y1 := Y1 + OffsY;
Y2 := Y2 + OffsY;
End;
If Proc <> Nil Then
DrawLine( X1, Y1, X2, Y2, Proc, Longint( @DDAInfo ) )
Else
Begin
pCanvas.MoveTo( X1, Y1 );
pCanvas.LineTo( X2, Y2 );
End;
End;
pStart := pEnd + 1;
End;
End;
End;
Begin
If PartCount = 0 Then Exit;
If ( Grapher <> Nil ) And ( Grapher.Device = adPrinter ) Then
begin
iFactor := Trunc( Grapher.PrinterDpiY / Grapher.ScreenDpiY );
end else
iFactor := 1;
With DDAInfo Do
Begin
LineColor := plineColor;
DC := pCanvas.Handle;
End;
pCanvas.Pen.Color:= PLineColor;
{if it is (-) goes up, if it is (+) goes down}
Case plinetype Of
1: DrawPoly( @PixelDraw1 );
2: DrawPoly( @PixelDraw2 );
3: DrawPoly( @PixelDraw3 );
4: DrawPoly( @PixelDraw4 );
5: DrawPoly( @PixelDraw5 );
6: DrawPoly( @PixelDraw6 );
7: DrawPoly( @PixelDraw7 );
8: DrawPoly( @PixelDraw8 );
9: DrawPoly( @PixelDraw9 );
10: DrawPoly( @PixelDraw10 );
11: DrawPoly( @PixelDraw11 );
12: DrawPoly( @PixelDraw12 );
13: DrawPoly( @PixelDraw15 );
14: DrawPoly( @PixelDraw17 );
15: DrawPoly( @PixelDraw18 );
16: DrawPoly( @PixelDraw19 );
17: DrawPoly( @PixelDraw21 );
18: DrawPoly( @PixelDraw22 );
19: DrawPoly( @PixelDraw23 );
20:
Begin
DrawPoly( Nil );
For I := 1 To 2 Do
RedrawPoly( @PixelDraw24, -I );
RedrawPoly( @PixelDraw24, 1 );
End;
21:
Begin
DrawPoly( Nil );
For I := 1 To 2 Do
RedrawPoly( @PixelDraw25, -I );
RedrawPoly( @PixelDraw25, 1 );
End;
22:
Begin
DrawPoly( Nil );
For I := 1 To 2 Do
RedrawPoly( @PixelDraw26, -I );
RedrawPoly( @PixelDraw26, 1 );
End;
23:
Begin
DrawPoly( Nil );
For I := 1 To 3 Do
RedrawPoly( @PixelDraw27_1, -I );
For I := 1 To 2 Do
RedrawPoly( @PixelDraw27_2, I );
End;
24:
Begin
DrawPoly( Nil );
For I := 1 To 3 Do
RedrawPoly( @PixelDraw28_1, -I );
For I := 1 To 2 Do
RedrawPoly( @PixelDraw28_2, I );
End;
25:
Begin
DrawPoly( Nil );
For I := 1 To 2 Do
RedrawPoly( @PixelDraw29, -I );
RedrawPoly( @PixelDraw29, 1 );
End;
26:
Begin
DrawPoly( @PixelDraw30_1 );
For I := 1 To 2 Do
RedrawPoly( @PixelDraw30_2, -I );
RedrawPoly( @PixelDraw30_2, 1 );
End;
27:
Begin
DrawPoly( @PixelDraw30_1 );
For I := 1 To 3 Do
RedrawPoly( @PixelDraw32_2, -I );
For I := 1 To 2 Do
RedrawPoly( @PixelDraw32_3, I );
End;
28:
Begin
DrawPoly( @PixelDraw30_1 );
For I := 1 To 3 Do
RedrawPoly( @PixelDraw33_2, -I );
For I := 1 To 2 Do
RedrawPoly( @PixelDraw33_3, I );
End;
29:
Begin
DrawPoly( @PixelDraw34_1 );
RedrawPoly( @PixelDraw34_2, -1 );
End;
30:
Begin
DrawPoly( @PixelDraw35_1 );
For I := 1 To 2 Do
RedrawPoly( @PixelDraw35_2, -I );
For I := 1 To 1 Do
RedrawPoly( @PixelDraw35_2, I );
End;
31:
Begin
DrawPoly( Nil );
RedrawPoly( @PixelDraw36_2, -1 );
RedrawPoly( @PixelDraw36_2, 1 );
RedrawPoly( @PixelDraw36_3, -2 );
RedrawPoly( @PixelDraw36_4, 2 );
End;
32:
Begin
DrawPoly( @PixelDraw39_2 );
RedrawPoly( @PixelDraw39_1, -1 );
RedrawPoly( @PixelDraw39_1, 1 );
End;
33:
Begin
DrawPoly( @PixelDraw40_1 );
RedrawPoly( @PixelDraw40_2, -1 );
RedrawPoly( @PixelDraw40_2, 1 );
End;
34:
Begin
DrawPoly( @PixelDraw41_1 );
RedrawPoly( @PixelDraw41_2, -1 );
RedrawPoly( @PixelDraw41_2, 1 );
End;
35:
Begin
DrawPoly( @PixelDraw42_1 );
RedrawPoly( @PixelDraw42_2, -1 );
RedrawPoly( @PixelDraw42_2, 1 );
End;
36:
Begin
DrawPoly( Nil );
RedrawPoly( @PixelDraw43_2, -1 );
RedrawPoly( @PixelDraw43_2, 1 );
End;
37:
Begin
DrawPoly( @PixelDraw44_1 );
For I := 1 To 2 Do
ReDrawPoly( @PixelDraw44_1, -I );
ReDrawPoly( @PixelDraw44_1, 1 );
End;
38:
Begin
DrawPoly( @PixelDraw45_1 );
ReDrawPoly( @PixelDraw45_2, -1 );
End;
39:
Begin
DrawPoly( Nil );
For I := 1 To 3 Do
ReDrawPoly( @PixelDraw46_2, -I );
End;
40:
Begin
DrawPoly( Nil );
For I := 1 To 2 Do
ReDrawPoly( @PixelDraw46_2, I );
End;
41:
Begin
DrawPoly( Nil );
For I := 1 To 3 Do
ReDrawPoly( @PixelDraw48_2, -I );
End;
42:
Begin
DrawPoly( Nil );
For I := 1 To 2 Do
ReDrawPoly( @PixelDraw48_2, I );
End;
43:
Begin
DrawPoly( @PixelDraw50_1 );
For I := 1 To 2 Do
ReDrawPoly( @PixelDraw50_2, -I );
End;
44:
Begin
DrawPoly( @PixelDraw50_1 );
For I := 1 To 2 Do
ReDrawPoly( @PixelDraw50_2, I );
End;
45:
Begin
DrawPoly( @PixelDraw52_1 );
ReDrawPoly( @PixelDraw52_2, -1 );
ReDrawPoly( @PixelDraw52_3, -2 );
ReDrawPoly( @PixelDraw52_2, 1 );
ReDrawPoly( @PixelDraw52_3, 2 );
ReDrawPoly( @PixelDraw52_4, 3 );
End;
46:
Begin
DrawPoly( @PixelDraw53_1 );
ReDrawPoly( @PixelDraw53_2, -1 );
ReDrawPoly( @PixelDraw53_3, -2 );
ReDrawPoly( @PixelDraw53_2, 1 );
ReDrawPoly( @PixelDraw53_3, 2 );
ReDrawPoly( @PixelDraw53_4, 3 );
End;
47:
Begin
DrawPoly( @PixelDraw54_1 );
ReDrawPoly( @PixelDraw54_2, -1 );
ReDrawPoly( @PixelDraw54_3, -2 );
ReDrawPoly( @PixelDraw54_2, 1 );
ReDrawPoly( @PixelDraw54_3, 2 );
End;
48:
Begin
DrawPoly( @PixelDraw55_1 );
ReDrawPoly( @PixelDraw55_2, -1 );
ReDrawPoly( @PixelDraw55_3, -2 );
ReDrawPoly( @PixelDraw55_2, 1 );
ReDrawPoly( @PixelDraw55_3, 2 );
End;
49:
Begin
DrawPoly( @PixelDraw56_1 );
For I := 1 To 2 Do
ReDrawPoly( @PixelDraw56_2, -I );
For I := 1 To 2 Do
ReDrawPoly( @PixelDraw56_2, I );
End;
50: DrawPoly( @PixelDraw57_1 );
51: DrawPoly( @PixelDraw58_1 );
52:
Begin
DrawPoly( @PixelDraw59_1 );
For I := 1 To 2 Do
ReDrawPoly( @PixelDraw59_2, -I );
For I := 1 To 2 Do
ReDrawPoly( @PixelDraw59_2, I );
End;
53:
Begin
DrawPoly( @PixelDraw60_1 );
For I := 1 To 2 Do
ReDrawPoly( @PixelDraw60_2, -I );
For I := 1 To 2 Do
ReDrawPoly( @PixelDraw60_2, I );
End;
54:
Begin
DrawPoly( @PixelDraw61_1 );
For I := 1 To 2 Do
ReDrawPoly( @PixelDraw61_2, -I );
For I := 1 To 2 Do
ReDrawPoly( @PixelDraw61_2, I );
End;
55: DrawPoly( @PixelDraw62_1 );
56:
Begin
DrawPoly( Nil );
ReDrawPoly( @PixelDraw63_1, -1 );
ReDrawPoly( @PixelDraw63_2, -2 );
ReDrawPoly( @PixelDraw63_1, 1 );
ReDrawPoly( @PixelDraw63_2, 2 );
End;
57:
Begin
DrawPoly( Nil );
ReDrawPoly( @PixelDraw64_1, -1 );
ReDrawPoly( @PixelDraw64_2, -2 );
ReDrawPoly( @PixelDraw64_3, 1 );
ReDrawPoly( @PixelDraw64_4, 2 );
End;
58: DrawPoly( @PixelDraw65_1 );
59:
Begin
DrawPoly( @PixelDraw66_0 );
ReDrawPoly( @PixelDraw66_1, -1 );
ReDrawPoly( @PixelDraw66_2, -2 );
ReDrawPoly( @PixelDraw66_3, 1 );
ReDrawPoly( @PixelDraw66_4, 2 );
End;
60: DrawPoly( @PixelDraw67_1 );
61:
Begin
DrawPoly( @PixelDraw68_1 );
ReDrawPoly( @PixelDraw68_2, -1 );
ReDrawPoly( @PixelDraw68_3, -2 );
ReDrawPoly( @PixelDraw68_4, 1 );
ReDrawPoly( @PixelDraw68_5, 2 );
End;
62: DrawPoly( @PixelDraw69_1 );
End;
End;
End.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -