⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ezlinedraw.pas

📁 很管用的GIS控件
💻 PAS
📖 第 1 页 / 共 3 页
字号:
      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 + -