Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function tRect.Subdivide(const divisor: tRect): tRectSubdivision;
- var
- rects: array[0 .. 7] of tRect absolute result.rects;
- n: sint absolute result.n;
- begin
- if LessThanEqual(B.x, divisor.A.x) // разделитель полностью справа
- or GreaterThanEqual(A.x, divisor.B.x) // разделитель полностью слева
- or LessThanEqual(B.y, divisor.A.y) // разделитель полностью внизу
- or GreaterThanEqual(A.y, divisor.B.y) // разделитель полностью вверху
- then
- begin
- n := 1;
- rects[0] := self;
- exit;
- end;
- if LessThan(A.x, divisor.A.x) then
- begin
- // │ │
- // │ │ D
- // │ │
- if LessThan(A.y, divisor.A.y) then
- begin
- // ┌───
- // │ ┌─
- // │ │D
- if GreaterThan(B.x, divisor.B.x) then
- begin
- // ┌───────┐
- // │ ┌───┐ │
- // │ │ D │ │
- if GreaterThan(B.y, divisor.B.y) then
- begin
- // ┌───────────┐
- // │ 0 1 2 │
- // │ ┌───┐ │
- // │ 7 │ D │ 3 │
- // │ └───┘ │
- // │ 6 5 4 │
- // └───────────┘
- n := 8;
- rects[0] := Rect(A, divisor.A);
- rects[1] := Rect(divisor.A.x, A.y, divisor.B.x, divisor.A.y);
- rects[2] := Rect(divisor.B.x, A.y, B.x, divisor.A.y);
- rects[3] := Rect(divisor.B.x, divisor.A.y, B.x, divisor.B.y);
- rects[4] := Rect(divisor.B, B);
- rects[5] := Rect(divisor.A.x, divisor.B.y, divisor.B.x, B.y);
- rects[6] := Rect(A.x, divisor.B.y, divisor.A.x, B.y);
- rects[7] := Rect(A.x, divisor.A.y, divisor.A.x, divisor.B.y);
- end else
- begin
- // ┌───────────┐
- // │ 0 1 2 │
- // │ ┌───┐ │
- // │ 4 │ │ 3 │
- // └───│ D │───┘
- // └───┘
- n := 5;
- rects[0] := Rect(A, divisor.A);
- rects[1] := Rect(divisor.A.x, A.y, divisor.B.x, divisor.A.y);
- rects[2] := Rect(divisor.B.x, A.y, B.x, divisor.A.y);
- rects[3] := Rect(divisor.B.x, divisor.A.y, B.x, B.y);
- rects[4] := Rect(A.x, divisor.A.y, divisor.A.x, B.y);
- end;
- end else
- begin
- // ┌─────┐
- // │ ┌─────┐
- // │ │ D │
- if GreaterThan(B.y, divisor.B.y) then
- begin
- // ┌──────┐
- // │ 1 0 │
- // │ ┌─────┐
- // │ 2 │ D │
- // │ └─────┘
- // │ 3 4 │
- // └──────┘
- n := 5;
- rects[0] := Rect(divisor.A.x, A.y, B.x, divisor.A.y);
- rects[1] := Rect(A.x, A.y, divisor.A.x, divisor.A.y);
- rects[2] := Rect(A.x, divisor.A.y, divisor.A.x, divisor.B.y);
- rects[3] := Rect(A.x, divisor.B.y, divisor.A.x, B.y);
- rects[4] := Rect(divisor.A.x, divisor.B.y, B.x, B.y);
- end else
- begin
- // ┌──────┐
- // │ 1 0 │
- // │ ┌────┐
- // │ 2 │ │
- // └───│ D │
- // └────┘
- n := 3;
- rects[0] := Rect(divisor.A.x, A.y, B.x, divisor.A.y);
- rects[1] := Rect(A.x, A.y, divisor.A.x, divisor.A.y);
- rects[2] := Rect(A.x, divisor.A.y, divisor.A.x, B.y);
- end;
- end;
- end else
- begin
- // ┌───
- // ┌─│ D
- // │ │
- if GreaterThan(B.x, divisor.B.x) then
- begin
- // ┌───┐
- // ┌─│ D │─┐
- // │ │ │ │
- if GreaterThan(B.y, divisor.B.y) then
- begin
- // ┌───┐
- // ┌───│ D │───┐
- // │ 0 │ │ 4 │
- // │ └───┘ │
- // │ 1 2 3 │
- // └───────────┘
- n := 5;
- rects[0] := Rect(A.x, A.y, divisor.A.x, divisor.B.y);
- rects[1] := Rect(A.x, divisor.B.y, divisor.A.x, B.y);
- rects[2] := Rect(divisor.A.x, divisor.B.y, divisor.B.x, B.y);
- rects[3] := Rect(divisor.B.x, divisor.B.y, B.x, B.y);
- rects[4] := Rect(divisor.B.x, A.y, B.x, divisor.B.y);
- end else
- begin
- // ┌───┐
- // ┌───│ │───┐
- // │ 0 │ D │ 1 │
- // └───│ │───┘
- // └───┘
- n := 2;
- rects[0] := Rect(A.x, A.y, divisor.A.x, B.y);
- rects[1] := Rect(divisor.B.x, A.y, B.x, B.y);
- end;
- end else
- begin
- // ┌─────┐
- // ┌─│ ┐ D │
- if GreaterThan(B.y, divisor.B.y) then
- begin
- // ┌────┐
- // ┌───│ D │
- // │ 0 │ │
- // │ └────┘
- // │ 1 2 │
- // └──────┘
- n := 3;
- rects[0] := Rect(A.x, A.y, divisor.A.x, divisor.B.y);
- rects[1] := Rect(A.x, divisor.B.y, divisor.A.x, B.y);
- rects[2] := Rect(divisor.A.x, divisor.B.y, B.x, B.y);
- end else
- begin
- // ┌────┐
- // ┌───│ ┐ │
- // │ 0 │ D │
- // └───│ ┘ │
- // └────┘
- n := 1;
- rects[0] := Rect(A.x, A.y, divisor.A.x, B.y);
- end;
- end;
- end;
- end else
- begin
- // │ │
- // │ D │
- // │ │
- if LessThan(A.y, divisor.A.y) then
- begin
- // ┌─
- // ┌────
- // │ D
- if GreaterThan(B.x, divisor.B.x) then
- begin
- // ┌────┐
- // ┌────┐ │
- // │ D │ │
- if GreaterThan(B.y, divisor.B.y) then
- begin
- // ┌──────┐
- // │ 0 1 │
- // ┌────┐ │
- // │ D │ 2 │
- // └────┘ │
- // │ 4 3 │
- // └──────┘
- n := 5;
- rects[0] := Rect(A.x, A.y, divisor.B.x, divisor.A.y);
- rects[1] := Rect(divisor.B.x, A.y, B.x, divisor.A.y);
- rects[2] := Rect(divisor.B.x, divisor.A.y, B.x, divisor.B.y);
- rects[3] := Rect(divisor.B.x, divisor.B.y, B.x, B.y);
- rects[4] := Rect(A.x, divisor.B.y, divisor.B.x, B.y);
- end else
- begin
- // ┌──────┐
- // │ 0 1 │
- // ┌────┐ │
- // │ │ 2 │
- // │ D │───┘
- // └────┘
- n := 3;
- rects[0] := Rect(A.x, A.y, divisor.B.x, divisor.A.y);
- rects[1] := Rect(divisor.B.x, A.y, B.x, divisor.A.y);
- rects[2] := Rect(divisor.B.x, divisor.A.y, B.x, B.y);
- end;
- end else
- begin
- // ┌───┐
- // ┌───────┐
- // │ D │
- if GreaterThan(B.y, divisor.B.y) then
- begin
- // ┌───┐
- // │ 0 │
- // ┌───────┐
- // │ D │
- // └───────┘
- // │ 1 │
- // └───┘
- n := 2;
- rects[0] := Rect(A.x, A.y, B.x, divisor.A.y);
- rects[1] := Rect(A.x, divisor.B.y, B.x, B.y);
- end else
- begin
- // ┌───┐
- // │ 0 │
- // ┌───────┐
- // │ └ D ┘ │
- n := 1;
- rects[0] := Rect(A.x, A.y, B.x, divisor.A.y);
- end;
- end;
- end else
- begin
- // ┌─────
- // │ D ┌─
- if GreaterThan(B.x, divisor.B.x) then
- begin
- // ┌─────┐
- // │ D ┌ │───┐
- // └─────┘
- if GreaterThan(B.y, divisor.B.y) then
- begin
- // ┌──────┐
- // │ D │───┐
- // │ │ 0 │
- // └──────┘ │
- // │ 2 1 │
- // └──────┘
- n := 3;
- rects[0] := Rect(divisor.B.x, A.y, B.x, divisor.B.y);
- rects[1] := Rect(divisor.B.x, divisor.B.y, B.x, B.y);
- rects[2] := Rect(A.x, divisor.B.y, divisor.B.x, B.y);
- end else
- begin
- // ┌────┐
- // │ ┌ │───┐
- // │ D │ 0 │
- // │ └ │───┘
- // └────┘
- n := 1;
- rects[0] := Rect(divisor.B.x, A.y, B.x, B.y);
- end;
- end else
- begin
- // ┌───────┐
- // │ ┌ D ┐ │
- // └───────┘
- if GreaterThan(B.y, divisor.B.y) then
- begin
- // ┌───────┐
- // │ ┌ D ┐ │
- // └───────┘
- // │ 0 │
- // └───┘
- n := 1;
- rects[0] := Rect(A.x, divisor.B.y, B.x, B.y);
- end else
- begin
- // ┌───────┐
- // │ D │
- // │ ┌───┐ │
- // │ └───┘ │
- // └───────┘
- n := 0;
- end;
- end;
- end;
- end;
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement