Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const
- AREA_X1 = -250;
- AREA_Y1 = -250;
- AREA_X2 = 250;
- AREA_Y2 = 250;
- FILTER_X1 = -5;
- FILTER_Y1 = -5;
- FILTER_X2 = 5;
- FILTER_Y2 = 5;
- function simba_ClearTPAFromTPA(const arP, ClearPoints: TPointArray): TPointArray;
- var
- i, j, l, l2: Integer;
- Found: Boolean;
- begin
- Setlength(result,0);
- l := High(arP);
- l2 := High(ClearPoints);
- for i := 0 to l do
- begin
- Found := false;
- for j := 0 to l2 do
- if (arP[i].x = ClearPoints[j].x) and (arP[i].y = ClearPoints[j].y) then
- begin
- Found := True;
- Break;
- end;
- if not found then
- // if (j = l2 + 1) then
- begin
- SetLength(Result, Length(Result) + 1);
- Result[High(Result)] := arP[i];
- end;
- end;
- end;
- function TPABounds(TPA: TPointArray): TBox;
- var
- h, i: Integer;
- begin
- h := High(TPA);
- if (h > -1) then
- begin
- Result.X1 := TPA[0].X;
- Result.Y1 := TPA[0].Y;
- Result.X2 := TPA[0].X;
- Result.Y2 := TPA[0].Y;
- if (h > 0) then
- for i := 1 to h do
- begin
- if (TPA[i].X < Result.X1) then
- Result.X1 := TPA[i].X
- else
- if (TPA[i].X > Result.X2) then
- Result.X2 := TPA[i].X;
- if (TPA[i].Y < Result.Y1) then
- Result.Y1 := TPA[i].Y
- else
- if (TPA[i].Y > Result.Y2) then
- Result.Y2 := TPA[i].Y;
- end;
- end else
- begin
- Result.X1 := 0;
- Result.Y1 := 0;
- Result.X2 := 0;
- Result.Y2 := 0;
- end;
- end;
- function ClearTPAFromTPA2(arr, clear: TPointArray): TPointArray;
- var
- v, h, r, l, x, y: Integer;
- B: array of TBoolArray;
- bx, tmp: TBox;
- begin;
- r := 0;
- l := Length(arr);
- if (l > 0) then
- begin
- SetLength(Result, l);
- bx := TPABounds(arr); // ..or TPABounds() if built-in to Simba!
- h := High(clear);
- if (h > -1) then
- begin
- tmp := TPABounds(clear); // ..or TPABounds() if built-in to Simba!
- bx.X1 := Min(bx.X1, tmp.X1);
- bx.Y1 := Min(bx.Y1, tmp.Y1);
- bx.X2 := Max(bx.X2, tmp.X2);
- bx.Y2 := Max(bx.Y2, tmp.Y2);
- end;
- SetLength(B, ((bx.X2 - bx.X1) + 1));
- for v := 0 to (bx.X2 - bx.X1) do
- begin
- SetLength(B[v], ((bx.Y2 - bx.Y1) + 1));
- y := High(B[v]);
- for x := 0 to y do
- B[v][x] := False;
- end;
- for x := 0 to h do
- B[(clear[x].X - bx.X1)][(clear[x].Y - bx.Y1)] := True;
- for v := 0 to (l - 1) do
- if not B[(arr[v].X - bx.X1)][(arr[v].Y - bx.Y1)] then
- begin
- Result[r] := arr[v];
- Inc(r);
- end;
- SetLength(B, 0);
- end;
- SetLength(Result, r);
- end;
- procedure SetPixels(bmp: Integer; TPA: TPointArray; color: Integer);
- var
- a, z, w, h: Integer;
- begin
- z := High(TPA);
- if (z > -1) then
- begin
- GetBitmapSize(bmp, w, h);
- for a := 0 to z do
- if ((TPA[a].X >= 0) and (TPA[a].Y >= 0) and (TPA[a].X < w) and (TPA[a].Y < h)) then
- FastSetPixel(bmp, TPA[a].X, TPA[a].Y, color);
- end;
- end;
- var
- t: Integer;
- TPA, filter, output: TPointArray;
- begin
- TPA := TPAFromBox(IntToBox(AREA_X1, AREA_Y1, AREA_X2, AREA_Y2));
- filter := TPAFromBox(IntToBox(FILTER_X1, FILTER_Y1, FILTER_X2, FILTER_Y2));
- t := GetSystemTime;
- output := simba_ClearTPAFromTPA(TPA, filter);
- WriteLn('ClearTPAFromTPA (Simba): ' + IntToStr(GetSystemTime - t) + ' ms. [' + IntToStr(Length(output)) + ']');
- SetLength(output, 0);
- t := GetSystemTime;
- output := ClearTPAFromTPA2(TPA, filter);
- WriteLn('ClearTPAFromTPA2: ' + IntToStr(GetSystemTime - t) + ' ms. [' + IntToStr(Length(output)) + ']');
- end.
Advertisement
Add Comment
Please, Sign In to add comment