[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]

    {
    Here is a fast polygon fill I wrote in an hour. It requires that the polygon
    is convex, and the verticies are in sequential order. Right now, the verticies
    must be in counter clockwise rotation, but that can be changed by removing
    the conditional statement in the HLine procedure. It handles an arbitrary
    number of verticies.

    achalfin@uceng.uc.edu
    }

    Procedure HLine(X1, X2, Y : Integer; Color : Byte);
    { Fill using words to speed up alot! }

    Label Offscreen;

    Begin
      If Y < 0 Then Goto Offscreen;
      If Y > 199 Then Goto Offscreen;
      If X2 > X1
        Then Begin
          If X1 < 0 Then X1 := 0;
          If X2 > 319 Then X2 := 319;
          FillChar(Mem[$A000:Y*320+X1], X2-X1+1, Color);
        End;
     OffScreen:
    End;

    Procedure FillPoly(P:MappedCoords; Num : Word; Color : Byte);
    { Mapped Coords is an array of (x, y) coords, each is an integer }

    Var
      x1, y1, x2, y2, x11, y11, x22, y22 : Integer;
      StartV1, EndV1, StartV2, EndV2 : Integer;
      Dx1, Dx2, Count1, Count2 : Integer;
      XVal1, XVal2 : Longint;
      EdgeCount, MinY : Word;
      C : Integer;

    Begin
      EdgeCount := Num;
      MinY := 300;
      For C := 0 to (EdgeCount-1) do  { Find Top Vertex }
        Begin
          If P[c].Y < MinY
            Then Begin MinY := P[c].Y; StartV1 := C; End;
        End;
      StartV2 := StartV1;
      EndV1 := StartV1 - 1;
      EndV2 := StartV2 + 1;
      If EndV1 < 0 Then EndV1 := (Num-1);
      If EndV2 >= Num Then EndV2 := 0;
      MinY := P[StartV1].Y;
      X1:=P[StartV1].X; Y1:=P[StartV1].Y; X2:=P[EndV1].X; Y2:=P[EndV1].Y;
      Dx1 := ((X2 - X1) Shl 8) Div (Y2 - Y1 + 1);
      Count1 := Y2-Y1; XVal1 := Longint(X1) Shl 8;
      X11:=P[StartV2].X; Y11:=P[StartV2].Y; X22:=P[EndV2].X; Y22:=P[EndV2].Y;
      Dx2 := ((X22 - X11) Shl 8) Div (Y22 - Y11 + 1);
      Count2 := Y22-Y11;  XVal2 := Longint(X11) Shl 8;
      While EdgeCount > 1 do
        Begin
          While (Count1 > 0) and (Count2 > 0) do
            Begin
              HLine(XVal1 Shr 8, XVal2 Shr 8, MinY, Color);
              XVal1 := XVal1 + Dx1; XVal2 := XVal2 + Dx2;
              Count1 := Count1 - 1; Count2 := Count2 - 1;
              MinY := MinY + 1;
            End;
          If Count1 = 0
            Then Begin
              StartV1 := EndV1;  EndV1 := EndV1 - 1;
              If EndV1 < 0 Then EndV1 := (Num-1);
              EdgeCount := EdgeCount - 1; MinY := P[StartV1].Y;
              X1 := P[StartV1].X; Y1 := P[StartV1].Y;
              X2 := P[EndV1].X; Y2 := P[EndV1].Y;
              Dx1 := ((X2 - X1) Shl 8) Div (Abs(Y2 - Y1) + 1);
              Count1 := Y2-Y1; XVal1 := Longint(X1) Shl 8;
            End;
          If Count2 = 0
            Then Begin
              StartV2 := EndV2; EndV2 := EndV2 + 1;
              If EndV2 >= Num  Then EndV2 := 0;
              EdgeCount := EdgeCount - 1; MinY := P[StartV2].Y;
              X11 := P[StartV2].X; Y11 := P[StartV2].Y;
              X22 := P[EndV2].X; Y22 := P[EndV2].Y;
              Dx2 := ((X22 - X11) Shl 8) Div (Abs(Y22 - Y11) + 1);
              Count2 := Y22-Y11; XVal2 := Longint(X11) Shl 8;
            End;
        End;
    End;

[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]