Janilabo

Janilabo | TPA stuff

Dec 11th, 2012
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 1.90 KB | None | 0 0
  1. // Based on ShellSort() algorithm.
  2. procedure SortTPAByColumn(var TPA: TPointArray);
  3. var
  4.   x, a, b, l: Integer;
  5. begin
  6.   l := Length(TPA);
  7.   x := 0;  
  8.   while (x < (l div 3)) do
  9.     x := ((x * 3) + 1);
  10.   while (x >= 1) do
  11.   begin
  12.     for a := x to (l - 1) do
  13.     begin
  14.       b := a;
  15.       while ((b >= x) and ((TPA[b].Y < TPA[(b - x)].Y) and (TPA[b].X < TPA[(b - x)].X))) do
  16.       begin
  17.         Swap(TPA[b], TPA[(b - x)]);
  18.         DecEx(b, x);
  19.       end;
  20.     end;
  21.     x := (x div 3);
  22.   end;  
  23. end;
  24.  
  25. function TPAFromBoxEx(bx: TBox; method: (ROWbyROW, COLUMNbyCOLUMN)): TPointArray;
  26. var
  27.   x, y, z: Integer;
  28. begin
  29.   if ((bx.X1 > bx.X2) or (bx.Y1 > bx.Y2)) then
  30.     Exit;
  31.   SetLength(Result, (((bx.X2 - bx.X1) + 1) * ((bx.Y2 - bx.Y1) + 1)));
  32.   case method of
  33.     ROWbyROW:
  34.       for y := bx.Y1 to bx.Y2 do
  35.         for x := bx.X1 to bx.X2 do
  36.         begin
  37.           Result[z].X := x;
  38.           Result[z].Y := y;
  39.           z := (z + 1);
  40.         end;
  41.     COLUMNbyCOLUMN:
  42.       for x := bx.X1 to bx.X2 do
  43.         for y := bx.Y1 to bx.Y2 do
  44.         begin
  45.           Result[z].X := x;
  46.           Result[z].Y := y;
  47.           z := (z + 1);
  48.         end;
  49.   end;
  50. end;
  51.  
  52. var
  53.   TPA: TPointArray;
  54.  
  55. begin
  56.   ClearDebug;
  57.   TPA := TPAFromBox(Box(0, 0, 3, 3));
  58.   WriteLn('TPAFromBox(): ' + TPAToStr(TPA));
  59.   SortTPAByRow(TPA);    
  60.   WriteLn('..after SortTPAByRow(): ' + TPAToStr(TPA));
  61.   WriteLn('');      
  62.   SetLength(TPA, 0);
  63.   TPA := TPAFromBoxEx(Box(0, 0, 3, 3), COLUMNbyCOLUMN);
  64.   WriteLn('TPAFromBoxEx() [CbC]: ' + TPAToStr(TPA));    
  65.   SortTPAByColumn(TPA);
  66.   WriteLn('..after SortTPAByColumn(): ' + TPAToStr(TPA));    
  67.   WriteLn('');
  68.   SetLength(TPA, 0);                                    
  69.   TPA := TPAFromBoxEx(Box(0, 0, 4, 4), ROWbyROW);
  70.   WriteLn('TPAFromBoxEx() [RbR]: ' + TPAToStr(TPA));
  71.   SortTPA(TPA);
  72.   WriteLn('..after SortTPA(): ' + TPAToStr(TPA));
  73.   SetLength(TPA, 0);
  74. end.
Advertisement
Add Comment
Please, Sign In to add comment