Advertisement
Janilabo

Dilation Fixed

Nov 5th, 2013
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 5.15 KB | None | 0 0
  1. {$loadlib pumbaa.dll}
  2.  
  3. const
  4.   BMP_WIDTH = 500;  //Disabled
  5.   BMP_HEIGHT = 500; //Disabled
  6.   ITERATIONS = 50;
  7.  
  8. var
  9.   TPA: TPointArray;
  10.  
  11. procedure Setup;
  12. begin
  13.   TPA := [Point(150, 250), Point(250, 151), Point(358, 252), Point(400, 200), Point(355, 351)];
  14. end;
  15.  
  16. {
  17. procedure TPADilation(var TPA: TPointArray; iterations: Integer);
  18. var
  19.   w, h, l, i, j, c, s, g, n, t, q: Integer;
  20.   m: T2DIntegerArray;
  21.   o, d: TIntegerArray;
  22.   se: TStructuringElement;
  23.   p: TPoint;
  24.   b: TBox;
  25. begin
  26.   if (iterations > 0) then
  27.   begin
  28.     l := Length(TPA);
  29.     if (l > 0) then
  30.     begin
  31.       b := pp_TPABounds(TPA);
  32.       pp_BoxResize(b, (iterations + 1));
  33.       pp_BoxDimensions(b, w, h);
  34.       m := pp_Create(0, w, h);
  35.       se := pp_SE_Cross(1, 1, -1, 1, 1);
  36.       g := 3;
  37.       c := 0;
  38.       for i := 0 to (l - 1) do
  39.         if not (m[(TPA[i].X - b.X1)][(TPA[i].Y - b.Y1)] = 1) then
  40.         begin
  41.           m[(TPA[i].X - b.X1)][(TPA[i].Y - b.Y1)] := 1;
  42.           TPA[c] := TPA[i];
  43.           c := (c + 1);
  44.         end;
  45.       l := (l - (l - c));
  46.       s := (l - 1);
  47.       if (c > 0) then
  48.         SetLength(TPA, l);
  49.       q := l;
  50.       d := pp_TIAByRange(0, (w * h));
  51.       o := pp_Clone(d);
  52.       t := 0;
  53.       repeat
  54.         n := 0;
  55.         case (t and 1) of
  56.           0:
  57.           for i := 0 to s do
  58.             for j := 0 to g do
  59.             begin
  60.               p.X := (TPA[o[i]].X + se[j].pixel.X);
  61.               p.Y := (TPA[o[i]].Y + se[j].pixel.Y);
  62.               if (m[(p.X - b.X1)][(p.Y - b.Y1)] = 0) then
  63.               begin
  64.                 if l>=q then
  65.                 begin
  66.                   q := q+q;
  67.                   SetLength(TPA, q);
  68.                 end;
  69.                 TPA[l] := p;
  70.                 m[(p.X - b.X1)][(p.Y - b.Y1)] := 1;
  71.                 d[n] := l;
  72.                 n := (n + 1);
  73.                 l := (l + 1);
  74.               end;
  75.             end;
  76.           1:
  77.           for i := 0 to s do
  78.             for j := 0 to g do
  79.             begin
  80.               p.X := (TPA[d[i]].X + se[j].pixel.X);
  81.               p.Y := (TPA[d[i]].Y + se[j].pixel.Y);
  82.               if (m[(p.X - b.X1)][(p.Y - b.Y1)] = 0) then
  83.               begin
  84.                 if l>=q then
  85.                 begin
  86.                   q := q+q;
  87.                   SetLength(TPA, q);
  88.                 end;
  89.                 TPA[l] := p;
  90.                 m[(p.X - b.X1)][(p.Y - b.Y1)] := 1;
  91.                 o[n] := l;
  92.                 n := (n + 1);
  93.                 l := (l + 1);
  94.               end;
  95.             end;
  96.         end;
  97.         s := (n - 1);
  98.         t := (t + 1);
  99.       until (t >= iterations);
  100.     end;
  101.   end;
  102.   SetLength(TPA, l);
  103. end;
  104. }
  105.  
  106. procedure TPADilation(var TPA: TPointArray; iterations: Integer);
  107. var
  108.   w, h, l, i, j, c, s, g, n, t: Integer;
  109.   m: T2DIntegerArray;
  110.   o, d: TIntegerArray;
  111.   se: TStructuringElement;
  112.   p: TPoint;
  113.   b: TBox;
  114. begin
  115.   if (iterations > 0) then
  116.   begin
  117.     l := Length(TPA);
  118.     if (l > 0) then
  119.     begin
  120.       b := pp_TPABounds(TPA);
  121.       pp_BoxResize(b, (iterations + 1));
  122.       pp_BoxDimensions(b, w, h);
  123.       m := pp_Create(0, w, h);
  124.       se := pp_SE_Cross(1, 1, -1, 1, 1);
  125.       g := 3;
  126.       c := 0;
  127.       for i := 0 to (l - 1) do
  128.         if not (m[(TPA[i].X - b.X1)][(TPA[i].Y - b.Y1)] = 1) then
  129.         begin
  130.           m[(TPA[i].X - b.X1)][(TPA[i].Y - b.Y1)] := 1;
  131.           TPA[c] := TPA[i];
  132.           c := (c + 1);
  133.         end;
  134.       l := (l - (l - c));
  135.       s := (l - 1);
  136.       if (c > 0) then
  137.         SetLength(TPA, l);
  138.       d := pp_TIAByRange(0, (w * h));
  139.       o := pp_Clone(d);
  140.       t := 0;
  141.       repeat
  142.         n := 0;
  143.         case (t and 1) of
  144.           0:
  145.           for i := 0 to s do
  146.             for j := 0 to g do
  147.             begin
  148.               p.X := (TPA[o[i]].X + se[j].pixel.X);
  149.               p.Y := (TPA[o[i]].Y + se[j].pixel.Y);
  150.               if (m[(p.X - b.X1)][(p.Y - b.Y1)] = 0) then
  151.               begin
  152.                 SetLength(TPA, (l + 1));
  153.                 TPA[l] := p;
  154.                 m[(p.X - b.X1)][(p.Y - b.Y1)] := 1;
  155.                 d[n] := l;
  156.                 n := (n + 1);
  157.                 l := (l + 1);
  158.               end;
  159.             end;
  160.           1:
  161.           for i := 0 to s do
  162.             for j := 0 to g do
  163.             begin
  164.               p.X := (TPA[d[i]].X + se[j].pixel.X);
  165.               p.Y := (TPA[d[i]].Y + se[j].pixel.Y);
  166.               if (m[(p.X - b.X1)][(p.Y - b.Y1)] = 0) then
  167.               begin
  168.                 SetLength(TPA, (l + 1));
  169.                 TPA[l] := p;
  170.                 m[(p.X - b.X1)][(p.Y - b.Y1)] := 1;
  171.                 o[n] := l;
  172.                 n := (n + 1);
  173.                 l := (l + 1);
  174.               end;
  175.             end;
  176.         end;
  177.         s := (n - 1);
  178.         t := (t + 1);
  179.       until (t >= iterations);
  180.     end;
  181.   end;
  182. end;
  183.  
  184. procedure DebugBitmap(bmp: Integer);
  185. var
  186.   w, h: Integer;
  187. begin
  188.   GetBitmapSize(bmp, w, h);
  189.   DisplayDebugImgWindow(w, h);
  190.   DrawBitmapDebugImg(bmp);
  191. end;
  192.  
  193. var
  194.   t, b: Integer;
  195.  
  196. begin
  197.   b := CreateBitmap(500, 500);
  198.   Setup;
  199.   t := GetTimeRunning;
  200.   TPADilation(TPA, ITERATIONS);
  201.   WriteLn(GetTimeRunning - t);
  202.   DrawTPABitmap(b, TPA, 255);
  203.   DebugBitmap(b);
  204. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement