Advertisement
runewalsh

Простыня

Jan 6th, 2014
418
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 10.40 KB | None | 0 0
  1.   function tRect.Subdivide(const divisor: tRect): tRectSubdivision;
  2.   var
  3.     rects: array[0 .. 7] of tRect absolute result.rects;
  4.     n: sint absolute result.n;
  5.   begin
  6.     if LessThanEqual(B.x, divisor.A.x)       // разделитель полностью справа
  7.        or GreaterThanEqual(A.x, divisor.B.x) // разделитель полностью слева
  8.        or LessThanEqual(B.y, divisor.A.y)    // разделитель полностью внизу
  9.        or GreaterThanEqual(A.y, divisor.B.y) // разделитель полностью вверху
  10.     then
  11.     begin
  12.       n := 1;
  13.       rects[0] := self;
  14.       exit;
  15.     end;
  16.  
  17.     if LessThan(A.x, divisor.A.x) then
  18.     begin
  19.       // │  │
  20.       // │  │ D
  21.       // │  │
  22.       if LessThan(A.y, divisor.A.y) then
  23.       begin
  24.         // ┌───
  25.         // │ ┌─
  26.         // │ │D
  27.         if GreaterThan(B.x, divisor.B.x) then
  28.         begin
  29.           // ┌───────┐
  30.           // │ ┌───┐ │
  31.           // │ │ D │ │
  32.           if GreaterThan(B.y, divisor.B.y) then
  33.           begin
  34.             // ┌───────────┐
  35.             // │ 0   1   2 │
  36.             // │   ┌───┐   │
  37.             // │ 7 │ D │ 3 │
  38.             // │   └───┘   │
  39.             // │ 6   5   4 │
  40.             // └───────────┘
  41.             n := 8;
  42.             rects[0] := Rect(A, divisor.A);
  43.             rects[1] := Rect(divisor.A.x, A.y, divisor.B.x, divisor.A.y);
  44.             rects[2] := Rect(divisor.B.x, A.y, B.x, divisor.A.y);
  45.             rects[3] := Rect(divisor.B.x, divisor.A.y, B.x, divisor.B.y);
  46.             rects[4] := Rect(divisor.B, B);
  47.             rects[5] := Rect(divisor.A.x, divisor.B.y, divisor.B.x, B.y);
  48.             rects[6] := Rect(A.x, divisor.B.y, divisor.A.x, B.y);
  49.             rects[7] := Rect(A.x, divisor.A.y, divisor.A.x, divisor.B.y);
  50.           end else
  51.           begin
  52.             // ┌───────────┐
  53.             // │ 0   1   2 │
  54.             // │   ┌───┐   │
  55.             // │ 4 │   │ 3 │
  56.             // └───│ D │───┘
  57.             //     └───┘
  58.             n := 5;
  59.             rects[0] := Rect(A, divisor.A);
  60.             rects[1] := Rect(divisor.A.x, A.y, divisor.B.x, divisor.A.y);
  61.             rects[2] := Rect(divisor.B.x, A.y, B.x, divisor.A.y);
  62.             rects[3] := Rect(divisor.B.x, divisor.A.y, B.x, B.y);
  63.             rects[4] := Rect(A.x, divisor.A.y, divisor.A.x, B.y);
  64.           end;
  65.         end else
  66.         begin
  67.           // ┌─────┐
  68.           // │ ┌─────┐
  69.           // │ │  D  │
  70.           if GreaterThan(B.y, divisor.B.y) then
  71.           begin
  72.             // ┌──────┐
  73.             // │ 1  0 │
  74.             // │   ┌─────┐
  75.             // │ 2 │  D  │
  76.             // │   └─────┘
  77.             // │ 3  4 │
  78.             // └──────┘
  79.             n := 5;
  80.             rects[0] := Rect(divisor.A.x, A.y, B.x, divisor.A.y);
  81.             rects[1] := Rect(A.x, A.y, divisor.A.x, divisor.A.y);
  82.             rects[2] := Rect(A.x, divisor.A.y, divisor.A.x, divisor.B.y);
  83.             rects[3] := Rect(A.x, divisor.B.y, divisor.A.x, B.y);
  84.             rects[4] := Rect(divisor.A.x, divisor.B.y, B.x, B.y);
  85.           end else
  86.           begin
  87.             // ┌──────┐
  88.             // │ 1  0 │
  89.             // │   ┌────┐
  90.             // │ 2 │    │
  91.             // └───│  D │
  92.             //     └────┘
  93.             n := 3;
  94.             rects[0] := Rect(divisor.A.x, A.y, B.x, divisor.A.y);
  95.             rects[1] := Rect(A.x, A.y, divisor.A.x, divisor.A.y);
  96.             rects[2] := Rect(A.x, divisor.A.y, divisor.A.x, B.y);
  97.           end;
  98.         end;
  99.       end else
  100.       begin
  101.         //   ┌───
  102.         // ┌─│ D
  103.         // │ │
  104.         if GreaterThan(B.x, divisor.B.x) then
  105.         begin
  106.           //   ┌───┐
  107.           // ┌─│ D │─┐
  108.           // │ │   │ │
  109.           if GreaterThan(B.y, divisor.B.y) then
  110.           begin
  111.             //     ┌───┐
  112.             // ┌───│ D │───┐
  113.             // │ 0 │   │ 4 │
  114.             // │   └───┘   │
  115.             // │ 1   2   3 │
  116.             // └───────────┘
  117.             n := 5;
  118.             rects[0] := Rect(A.x, A.y, divisor.A.x, divisor.B.y);
  119.             rects[1] := Rect(A.x, divisor.B.y, divisor.A.x, B.y);
  120.             rects[2] := Rect(divisor.A.x, divisor.B.y, divisor.B.x, B.y);
  121.             rects[3] := Rect(divisor.B.x, divisor.B.y, B.x, B.y);
  122.             rects[4] := Rect(divisor.B.x, A.y, B.x, divisor.B.y);
  123.           end else
  124.           begin
  125.             //     ┌───┐
  126.             // ┌───│   │───┐
  127.             // │ 0 │ D │ 1 │
  128.             // └───│   │───┘
  129.             //     └───┘
  130.             n := 2;
  131.             rects[0] := Rect(A.x, A.y, divisor.A.x, B.y);
  132.             rects[1] := Rect(divisor.B.x, A.y, B.x, B.y);
  133.           end;
  134.         end else
  135.         begin
  136.           //   ┌─────┐
  137.           // ┌─│ ┐ D │
  138.           if GreaterThan(B.y, divisor.B.y) then
  139.           begin
  140.             //     ┌────┐
  141.             // ┌───│  D │
  142.             // │ 0 │    │
  143.             // │   └────┘
  144.             // │ 1  2 │
  145.             // └──────┘
  146.             n := 3;
  147.             rects[0] := Rect(A.x, A.y, divisor.A.x, divisor.B.y);
  148.             rects[1] := Rect(A.x, divisor.B.y, divisor.A.x, B.y);
  149.             rects[2] := Rect(divisor.A.x, divisor.B.y, B.x, B.y);
  150.           end else
  151.           begin
  152.             //     ┌────┐
  153.             // ┌───│ ┐  │
  154.             // │ 0 │  D │
  155.             // └───│ ┘  │
  156.             //     └────┘
  157.             n := 1;
  158.             rects[0] := Rect(A.x, A.y, divisor.A.x, B.y);
  159.           end;
  160.         end;
  161.       end;
  162.     end else
  163.     begin
  164.       // │   │
  165.       // │ D │
  166.       // │   │
  167.       if LessThan(A.y, divisor.A.y) then
  168.       begin
  169.         //    ┌─
  170.         // ┌────
  171.         // │ D
  172.         if GreaterThan(B.x, divisor.B.x) then
  173.         begin
  174.           //    ┌────┐
  175.           // ┌────┐  │
  176.           // │ D  │  │
  177.           if GreaterThan(B.y, divisor.B.y) then
  178.           begin
  179.             //   ┌──────┐
  180.             //   │ 0  1 │
  181.             // ┌────┐   │
  182.             // │ D  │ 2 │
  183.             // └────┘   │
  184.             //   │ 4  3 │
  185.             //   └──────┘
  186.             n := 5;
  187.             rects[0] := Rect(A.x, A.y, divisor.B.x, divisor.A.y);
  188.             rects[1] := Rect(divisor.B.x, A.y, B.x, divisor.A.y);
  189.             rects[2] := Rect(divisor.B.x, divisor.A.y, B.x, divisor.B.y);
  190.             rects[3] := Rect(divisor.B.x, divisor.B.y, B.x, B.y);
  191.             rects[4] := Rect(A.x, divisor.B.y, divisor.B.x, B.y);
  192.           end else
  193.           begin
  194.             //   ┌──────┐
  195.             //   │ 0  1 │
  196.             // ┌────┐   │
  197.             // │    │ 2 │
  198.             // │ D  │───┘
  199.             // └────┘
  200.             n := 3;
  201.             rects[0] := Rect(A.x, A.y, divisor.B.x, divisor.A.y);
  202.             rects[1] := Rect(divisor.B.x, A.y, B.x, divisor.A.y);
  203.             rects[2] := Rect(divisor.B.x, divisor.A.y, B.x, B.y);
  204.           end;
  205.         end else
  206.         begin
  207.           //   ┌───┐
  208.           // ┌───────┐
  209.           // │   D   │
  210.           if GreaterThan(B.y, divisor.B.y) then
  211.           begin
  212.             //   ┌───┐
  213.             //   │ 0 │
  214.             // ┌───────┐
  215.             // │   D   │
  216.             // └───────┘
  217.             //   │ 1 │
  218.             //   └───┘
  219.             n := 2;
  220.             rects[0] := Rect(A.x, A.y, B.x, divisor.A.y);
  221.             rects[1] := Rect(A.x, divisor.B.y, B.x, B.y);
  222.           end else
  223.           begin
  224.             //   ┌───┐
  225.             //   │ 0 │
  226.             // ┌───────┐
  227.             // │ └ D ┘ │
  228.             n := 1;
  229.             rects[0] := Rect(A.x, A.y, B.x, divisor.A.y);
  230.           end;
  231.         end;
  232.       end else
  233.       begin
  234.         // ┌─────
  235.         // │ D ┌─
  236.         if GreaterThan(B.x, divisor.B.x) then
  237.         begin
  238.           // ┌─────┐
  239.           // │ D ┌ │───┐
  240.           // └─────┘
  241.           if GreaterThan(B.y, divisor.B.y) then
  242.           begin
  243.             // ┌──────┐
  244.             // │   D  │───┐
  245.             // │      │ 0 │
  246.             // └──────┘   │
  247.             //     │ 2  1 │
  248.             //     └──────┘
  249.             n := 3;
  250.             rects[0] := Rect(divisor.B.x, A.y, B.x, divisor.B.y);
  251.             rects[1] := Rect(divisor.B.x, divisor.B.y, B.x, B.y);
  252.             rects[2] := Rect(A.x, divisor.B.y, divisor.B.x, B.y);
  253.           end else
  254.           begin
  255.             // ┌────┐
  256.             // │  ┌ │───┐
  257.             // │ D  │ 0 │
  258.             // │  └ │───┘
  259.             // └────┘
  260.             n := 1;
  261.             rects[0] := Rect(divisor.B.x, A.y, B.x, B.y);
  262.           end;
  263.         end else
  264.         begin
  265.           // ┌───────┐
  266.           // │ ┌ D ┐ │
  267.           // └───────┘
  268.           if GreaterThan(B.y, divisor.B.y) then
  269.           begin
  270.             // ┌───────┐
  271.             // │ ┌ D ┐ │
  272.             // └───────┘
  273.             //   │ 0 │
  274.             //   └───┘
  275.             n := 1;
  276.             rects[0] := Rect(A.x, divisor.B.y, B.x, B.y);
  277.           end else
  278.           begin
  279.             // ┌───────┐
  280.             // │ D     │
  281.             // │ ┌───┐ │
  282.             // │ └───┘ │
  283.             // └───────┘
  284.             n := 0;
  285.           end;
  286.         end;
  287.       end;
  288.     end;
  289.   end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement