Advertisement
Janilabo

longer

Nov 4th, 2013
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.31 KB | None | 0 0
  1. {$loadlib pumbaa.dll}
  2.  
  3.  
  4.  
  5. var
  6.   TPA: TPointArray;
  7.   i: Integer;
  8.  
  9. procedure TPADilation(var TPA: TPointArray; iterations: Integer);
  10. var
  11.   w, h, l, i, j, c, s, g, n, t: Integer;
  12.   m: T2DIntegerArray;
  13.   o, d: TIntegerArray;
  14.   se: TStructuringElement;
  15.   p: TPoint;
  16.   b: TBox;
  17. begin
  18.   if (iterations > 0) then
  19.   begin
  20.     l := Length(TPA);
  21.     if (l > 0) then
  22.     begin
  23.       b := pp_TPABounds(TPA);
  24.       pp_BoxResize(b, (iterations + 1));
  25.       pp_BoxDimensions(b, w, h);
  26.       m := pp_Create(0, w, h);
  27.       se := pp_SE_Cross(1, 1, -1, 1, 1);
  28.       g := 3;
  29.       c := 0;
  30.       for i := 0 to (l - 1) do
  31.         if not (m[(TPA[i].X - b.X1)][(TPA[i].Y - b.Y1)] = 1) then
  32.         begin
  33.           m[(TPA[i].X - b.X1)][(TPA[i].Y - b.Y1)] := 1;
  34.           TPA[c] := TPA[i];
  35.           c := (c + 1);
  36.         end;
  37.       l := (l - (c - 1));
  38.       s := (l - 1);
  39.       if (c > 0) then
  40.         SetLength(TPA, l);
  41.       d := pp_TIAByRange(0, (w * h));
  42.       o := pp_Clone(d);
  43.       t := 0;
  44.       repeat
  45.         n := 0;
  46.         case (t and 1) of
  47.           0:
  48.           for i := 0 to s do
  49.             for j := 0 to g do
  50.             begin
  51.               p.X := (TPA[o[i]].X + se[j].pixel.X);
  52.               p.Y := (TPA[o[i]].Y + se[j].pixel.Y);
  53.               if (m[(p.X - b.X1)][(p.Y - b.Y1)] = 0) then
  54.               begin
  55.                 SetLength(TPA, (l + 1));
  56.                 TPA[l] := p;
  57.                 m[(p.X - b.X1)][(p.Y - b.Y1)] := 1;
  58.                 d[n] := (l + i);
  59.                 n := (n + 1);
  60.                 l := (l + 1);
  61.               end;
  62.             end;
  63.           1:
  64.           for i := 0 to s do
  65.             for j := 0 to g do
  66.             begin
  67.               p.X := (TPA[d[i]].X + se[j].pixel.X);
  68.               p.Y := (TPA[d[i]].Y + se[j].pixel.Y);
  69.               if (m[(p.X - b.X1)][(p.Y - b.Y1)] = 0) then
  70.               begin
  71.                 SetLength(TPA, (l + 1));
  72.                 TPA[l] := p;
  73.                 m[(p.X - b.X1)][(p.Y - b.Y1)] := 1;
  74.                 o[n] := (l + i);
  75.                 n := (n + 1);
  76.                 l := (l + 1);
  77.               end;
  78.             end;
  79.         end;
  80.         s := (n - 1);
  81.         t := (t + 1);
  82.       until (t >= iterations);
  83.     end;
  84.   end;
  85. end;
  86.  
  87. begin
  88.   ClearDebug;
  89.   TPA := [Point(1, 1)];
  90.   TPADilation(TPA, 2);
  91.   WriteLn(ToStr(TPA));
  92. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement