Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Based on ShellSort() algorithm.
- procedure SortTPAByColumn(var TPA: TPointArray);
- var
- x, a, b, l: Integer;
- begin
- l := Length(TPA);
- x := 0;
- while (x < (l div 3)) do
- x := ((x * 3) + 1);
- while (x >= 1) do
- begin
- for a := x to (l - 1) do
- begin
- b := a;
- while ((b >= x) and ((TPA[b].Y < TPA[(b - x)].Y) and (TPA[b].X < TPA[(b - x)].X))) do
- begin
- Swap(TPA[b], TPA[(b - x)]);
- DecEx(b, x);
- end;
- end;
- x := (x div 3);
- end;
- end;
- function TPAFromBoxEx(bx: TBox; method: (ROWbyROW, COLUMNbyCOLUMN)): TPointArray;
- var
- x, y, z: Integer;
- begin
- if ((bx.X1 > bx.X2) or (bx.Y1 > bx.Y2)) then
- Exit;
- SetLength(Result, (((bx.X2 - bx.X1) + 1) * ((bx.Y2 - bx.Y1) + 1)));
- case method of
- ROWbyROW:
- for y := bx.Y1 to bx.Y2 do
- for x := bx.X1 to bx.X2 do
- begin
- Result[z].X := x;
- Result[z].Y := y;
- z := (z + 1);
- end;
- COLUMNbyCOLUMN:
- for x := bx.X1 to bx.X2 do
- for y := bx.Y1 to bx.Y2 do
- begin
- Result[z].X := x;
- Result[z].Y := y;
- z := (z + 1);
- end;
- end;
- end;
- var
- TPA: TPointArray;
- begin
- ClearDebug;
- TPA := TPAFromBox(Box(0, 0, 3, 3));
- WriteLn('TPAFromBox(): ' + TPAToStr(TPA));
- SortTPAByRow(TPA);
- WriteLn('..after SortTPAByRow(): ' + TPAToStr(TPA));
- WriteLn('');
- SetLength(TPA, 0);
- TPA := TPAFromBoxEx(Box(0, 0, 3, 3), COLUMNbyCOLUMN);
- WriteLn('TPAFromBoxEx() [CbC]: ' + TPAToStr(TPA));
- SortTPAByColumn(TPA);
- WriteLn('..after SortTPAByColumn(): ' + TPAToStr(TPA));
- WriteLn('');
- SetLength(TPA, 0);
- TPA := TPAFromBoxEx(Box(0, 0, 4, 4), ROWbyROW);
- WriteLn('TPAFromBoxEx() [RbR]: ' + TPAToStr(TPA));
- SortTPA(TPA);
- WriteLn('..after SortTPA(): ' + TPAToStr(TPA));
- SetLength(TPA, 0);
- end.
Advertisement
Add Comment
Please, Sign In to add comment