Визначте, чи два прямокутники перетинаються один з одним?


337

Я намагаюся написати програму C ++, яка вимагає від користувача таких входів для побудови прямокутників (між 2 і 5): висота, ширина, x-pos, y-pos. Всі ці прямокутники існуватимуть паралельно осі x та y, тобто всі їхні краї матимуть нахили 0 або нескінченності.

Я намагався реалізувати те, що згадується в цьому питанні, але мені не дуже долі.

Моя поточна реалізація робить наступне:

// Gets all the vertices for Rectangle 1 and stores them in an array -> arrRect1
// point 1 x: arrRect1[0], point 1 y: arrRect1[1] and so on...
// Gets all the vertices for Rectangle 2 and stores them in an array -> arrRect2

// rotated edge of point a, rect 1
int rot_x, rot_y;
rot_x = -arrRect1[3];
rot_y = arrRect1[2];
// point on rotated edge
int pnt_x, pnt_y;
pnt_x = arrRect1[2]; 
pnt_y = arrRect1[3];
// test point, a from rect 2
int tst_x, tst_y;
tst_x = arrRect2[0];
tst_y = arrRect2[1];

int value;
value = (rot_x * (tst_x - pnt_x)) + (rot_y * (tst_y - pnt_y));
cout << "Value: " << value;  

Однак я не зовсім впевнений, чи (а) я реалізував алгоритм, з яким я пов’язаний правильно, чи я точно розтлумачив це?

Будь-які пропозиції?


3
Я думаю, що рішення вашої проблеми не передбачає жодного множення.
Скотт Еверден

Відповіді:


708
if (RectA.Left < RectB.Right && RectA.Right > RectB.Left &&
     RectA.Top > RectB.Bottom && RectA.Bottom < RectB.Top ) 

або, використовуючи декартові координати

(Якщо X1 - ліва координата, X2 - права координата, збільшується зліва направо, а Y1 - верхня координата , а Y2 - нижня координата , збільшується знизу вгору - якщо це не так, як ваша система координат [наприклад, більшість комп'ютерів мають Y напрямок зворотний], поміняйте місцями порівняння нижче ) ...

if (RectA.X1 < RectB.X2 && RectA.X2 > RectB.X1 &&
    RectA.Y1 > RectB.Y2 && RectA.Y2 < RectB.Y1) 

Скажіть, у вас є Rect A, а Rect B. Доказ є суперечливістю. Будь-яка з чотирьох умов гарантує відсутність перекриття :

  • Cond1. Якщо лівий край A знаходиться праворуч від правого краю B, - тоді A є повністю праворуч від B
  • Cond2. Якщо правий край A знаходиться ліворуч від лівого краю B, - тоді A є повністю ліворуч від B
  • Cond3. Якщо верхній край A знаходиться нижче нижнього краю B, - тоді A зовсім нижче B
  • Cond4. Якщо нижній край A знаходиться над верхнім краєм B, - тоді A повністю над B

Отже, умова для неперекриття є

NON-Overlap => Cond1 Або Cond2 Або Cond3 Або Cond4

Тому достатньою умовою перекриття є протилежне.

Перекриття => НЕ (Cond1 або Cond2 або Cond3 або Cond4)

Закон Де Моргана говорить
Not (A or B or C or D)те саме, щоNot A And Not B And Not C And Not D
і використання De Morgan, у нас є

Не Cond1 і не Cond2 і не Cond3 і не Cond4

Це еквівалентно:

  • Лівий край A зліва від правого краю B, [ RectA.Left < RectB.Right] та
  • Правий край праворуч від лівого краю В, [ RectA.Right > RectB.Left] та
  • А вгорі над нижньою частиною B, [ RectA.Top > RectB.Bottom] та
  • A внизу вгорі B [ RectA.Bottom < RectB.Top]

Примітка 1. Досить очевидно, що цей самий принцип можна поширити на будь-яку кількість вимірів.
Примітка 2. Також має бути досить очевидним підрахунок перекриттів лише одного пікселя, зміна <та / або введення >на цій межі на а <=чи а >=.
Примітка 3 : Ця відповідь при використанні декартових координат (X, Y) заснована на стандартних алгебраїчних декартових координатах (x збільшується зліва направо, а Y збільшується знизу вгору). Очевидно, коли комп'ютерна система може по-різному механізувати координати екрана (наприклад, збільшуючи Y зверху вниз, або X справа наліво), синтаксис потрібно буде відповідно відрегулювати /


489
Якщо вам важко уявити, чому це працює, я зробив приклад на сайті silentmatt.com/intersection.html, де ви можете перетягувати прямокутники навколо та бачити порівняння.
Меттью Крамлі

4
Ви не думаєте, що використовуєте жорсткі обмеження? що робити, якщо два прямокутника накладаються один на одного саме на край? ви не повинні розглянути <=,> = ??
Nawshad Farruque

6
@MatthewCrumley для A.Y1 <B.Y2 та A.Y2> B.Y1 у вашому посиланні, чи не слід відміняти знаки gt & lt?
NikT

15
Мені довелося поміняти
місцями

17
Ні, відповідь правильна, як зазначено. Він заснований на використанні стандартних декартових координат. Якщо ви використовуєте іншу систему, (Y збільшується зверху вниз), то внесіть відповідні налаштування.
Чарльз Бретана

115
struct rect
{
    int x;
    int y;
    int width;
    int height;
};

bool valueInRange(int value, int min, int max)
{ return (value >= min) && (value <= max); }

bool rectOverlap(rect A, rect B)
{
    bool xOverlap = valueInRange(A.x, B.x, B.x + B.width) ||
                    valueInRange(B.x, A.x, A.x + A.width);

    bool yOverlap = valueInRange(A.y, B.y, B.y + B.height) ||
                    valueInRange(B.y, A.y, A.y + A.height);

    return xOverlap && yOverlap;
}

15
Найпростіша та найчистіша відповідь.
ldog

1
@ e.James Я думаю, останнім B.heightмає бутиA.height
mat_boy

'min' і 'max' є зарезервованими ключовими словами в <windows.h>. ви можете виправити це, зробивши #undef minі #undef max, або використовуючи різні назви параметрів.
mchiasson

Якщо ви широко використовуєте, ви можете торгувати valueInRange за#define BETWEEN(value,min,max) \ (\ value > max ? max : ( value < min ? min : value )\ )
Ratata Tata

@Nemo Власне, перевірка xOverlapв одновимірному; rectOverlapє двовимірним. Він може бути розширений на N розмірів за допомогою петлі.
Justme0

27
struct Rect
{
    Rect(int x1, int x2, int y1, int y2)
    : x1(x1), x2(x2), y1(y1), y2(y2)
    {
        assert(x1 < x2);
        assert(y1 < y2);
    }

    int x1, x2, y1, y2;
};

bool
overlap(const Rect &r1, const Rect &r2)
{
    // The rectangles don't overlap if
    // one rectangle's minimum in some dimension 
    // is greater than the other's maximum in
    // that dimension.

    bool noOverlap = r1.x1 > r2.x2 ||
                     r2.x1 > r1.x2 ||
                     r1.y1 > r2.y2 ||
                     r2.y1 > r1.y2;

    return !noOverlap;
}

Хороший! Застосовуючи закон Де Моргана, отримуємо: r1.x1 <= r2.x2 && r2.x1 <= r1.x2 && r1.y1 <= r2.y2 && r2.y1 <= r1.y2.
Борж

23

Простіше перевірити, чи прямокутник повністю знаходиться поза іншим, так, чи він є

ліворуч...

(r1.x + r1.width < r2.x)

або праворуч ...

(r1.x > r2.x + r2.width)

або зверху ...

(r1.y + r1.height < r2.y)

або на дні ...

(r1.y > r2.y + r2.height)

другого прямокутника, він не може зіткнутися з ним. Отож, щоб мати функцію, яка повертає булеву приказку, що погода прямокутників стикається, ми просто комбінуємо умови логічними АБО та заперечуємо результат:

function checkOverlap(r1, r2) : Boolean
{ 
    return !(r1.x + r1.width < r2.x || r1.y + r1.height < r2.y || r1.x > r2.x + r2.width || r1.y > r2.y + r2.height);
}

Щоб вже отримати позитивний результат лише при дотику, ми можемо змінити "<" і ">" на "<=" і "> =".


3
І застосувати до нього закон де-моргана.
Борж

6

Задайте собі протилежне запитання: як я можу визначити, чи два прямокутники взагалі не перетинаються? Очевидно, що прямокутник A повністю зліва від прямокутника B не перетинається. Також якщо A повністю праворуч. І аналогічно, якщо A повністю вище B або повністю нижче B. У будь-якому іншому випадку A і B перетинаються.

Далі, можливо, є помилки, але я досить впевнений у алгоритмі:

struct Rectangle { int x; int y; int width; int height; };

bool is_left_of(Rectangle const & a, Rectangle const & b) {
   if (a.x + a.width <= b.x) return true;
   return false;
}
bool is_right_of(Rectangle const & a, Rectangle const & b) {
   return is_left_of(b, a);
}

bool not_intersect( Rectangle const & a, Rectangle const & b) {
   if (is_left_of(a, b)) return true;
   if (is_right_of(a, b)) return true;
   // Do the same for top/bottom...
 }

bool intersect(Rectangle const & a, Rectangle const & b) {
  return !not_intersect(a, b);
}

6

Припустимо, ви визначили позиції та розміри прямокутників так:

введіть тут опис зображення

Моя реалізація C ++ виглядає так:

class Vector2D
{
    public:
        Vector2D(int x, int y) : x(x), y(y) {}
        ~Vector2D(){}
        int x, y;
};

bool DoRectanglesOverlap(   const Vector2D & Pos1,
                            const Vector2D & Size1,
                            const Vector2D & Pos2,
                            const Vector2D & Size2)
{
    if ((Pos1.x < Pos2.x + Size2.x) &&
        (Pos1.y < Pos2.y + Size2.y) &&
        (Pos2.x < Pos1.x + Size1.x) &&
        (Pos2.y < Pos1.y + Size1.y))
    {
        return true;
    }
    return false;
}

Приклад виклику функції відповідно до наведеного малюнка вище:

DoRectanglesOverlap(Vector2D(3, 7),
                    Vector2D(8, 5),
                    Vector2D(6, 4),
                    Vector2D(9, 4));

Порівняння всередині ifблоку виглядатиме нижче:

if ((Pos1.x < Pos2.x + Size2.x) &&
    (Pos1.y < Pos2.y + Size2.y) &&
    (Pos2.x < Pos1.x + Size1.x) &&
    (Pos2.y < Pos1.y + Size1.y))
                   
if ((   3   <    6   +   9    ) &&
    (   7   <    4   +   4    ) &&
    (   6   <    3   +   8    ) &&
    (   4   <    7   +   5    ))

3

Ось як це робиться в API Java:

public boolean intersects(Rectangle r) {
    int tw = this.width;
    int th = this.height;
    int rw = r.width;
    int rh = r.height;
    if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) {
        return false;
    }
    int tx = this.x;
    int ty = this.y;
    int rx = r.x;
    int ry = r.y;
    rw += rx;
    rh += ry;
    tw += tx;
    th += ty;
    //      overflow || intersect
    return ((rw < rx || rw > tx) &&
            (rh < ry || rh > ty) &&
            (tw < tx || tw > rx) &&
            (th < ty || th > ry));
}

Зауважте, що в C ++ ці тести для переповнення не працюватимуть, оскільки підписане ціле число переповнення не визначене.
Ben Voigt

2

У питанні ви посилаєтесь на математику, коли прямокутники знаходяться під довільними кутами повороту. Якщо я розумію біт щодо кутів у питанні, я тлумачу, що всі прямокутники перпендикулярні один одному.

Загальне знання області формули перекриття:

Використовуючи приклад:

   1 2 3 4 5 6

1 + --- + --- +
   | |   
2 + А + --- + --- +
   | | Б |
3 + + + --- + --- +
   | | | | |
4 + --- + --- + --- + --- + +
               | |
5 + С +
               | |
6 + --- + --- +

1) зібрати всі координати x (і ліворуч, і праворуч) у список, потім сортувати його та видалити дублікати

1 3 4 5 6

2) зібрати всі координати y (і верхню, і нижню) до списку, потім сортувати його та видалити дублікати

1 2 3 4 6

3) створити 2D масив за кількістю прогалин між унікальними x координатами * кількістю прогалин між унікальними координатами y.

4 * 4

4) намалюйте всі прямокутники в цю сітку, збільшуючи кількість кожної комірки, на яку вона виникає:

   1 3 4 5 6

1 + --- +
   | 1 | 0 0 0
2 + --- + --- + --- +
   | 1 | 1 | 1 | 0
3 + --- + --- + --- + --- +
   | 1 | 1 | 2 | 1 |
4 + --- + --- + --- + --- +
     0 0 | 1 | 1 |
6 + --- + --- +

5) Коли ви малюєте прямокутники, його легко перехопити перекриття.


2
struct Rect
{
   Rect(int x1, int x2, int y1, int y2)
   : x1(x1), x2(x2), y1(y1), y2(y2)
   {
       assert(x1 < x2);
       assert(y1 < y2);
   }

   int x1, x2, y1, y2;
};

//some area of the r1 overlaps r2
bool overlap(const Rect &r1, const Rect &r2)
{
    return r1.x1 < r2.x2 && r2.x1 < r1.x2 &&
           r1.y1 < r2.y2 && r2.x1 < r1.y2;
}

//either the rectangles overlap or the edges touch
bool touch(const Rect &r1, const Rect &r2)
{
    return r1.x1 <= r2.x2 && r2.x1 <= r1.x2 &&
           r1.y1 <= r2.y2 && r2.x1 <= r1.y2;
}

1

Не думайте про координати як про вказівку, де знаходяться пікселі. Подумайте про них як про пікселі. Таким чином, площа прямокутника 2x2 повинна бути 4, а не 9.

bool bOverlap = !((A.Left >= B.Right || B.Left >= A.Right)
               && (A.Bottom >= B.Top || B.Bottom >= A.Top));

1

Найпростіший спосіб

/**
 * Check if two rectangles collide
 * x_1, y_1, width_1, and height_1 define the boundaries of the first rectangle
 * x_2, y_2, width_2, and height_2 define the boundaries of the second rectangle
 */
boolean rectangle_collision(float x_1, float y_1, float width_1, float height_1, float x_2, float y_2, float width_2, float height_2)
{
  return !(x_1 > x_2+width_2 || x_1+width_1 < x_2 || y_1 > y_2+height_2 || y_1+height_1 < y_2);
}

насамперед зауважте, що в комп’ютерах система координат перевернута. Вісь x така ж, як і в математиці, але вісь y збільшується вниз і зменшується, коли йде вгору .. якщо прямокутник витягнутий від центру. якщо координати x1 перевищують x2 плюс її половина від ширини. то це означає, що пішовши наполовину, вони торкнуться один одного. і таким же чином спускаючись вниз + половина його висоти. воно зіткнеться ..


1

Скажімо, два прямокутники - прямокутник A і прямокутник B. Нехай їхні центри будуть A1 і B1 (координати A1 і B1 можна легко знайти), нехай висоти будуть Ha і Hb, ширина - Wa і Wb, нехай dx буде ширина (x) відстань між A1 і B1 і dy - висота (y) відстань між A1 і B1.

Тепер ми можемо сказати, що ми можемо сказати, що A і B перекриваються: коли

if(!(dx > Wa+Wb)||!(dy > Ha+Hb)) returns true

0

Я реалізував версію C #, вона легко перетворюється на C ++.

public bool Intersects ( Rectangle rect )
{
  float ulx = Math.Max ( x, rect.x );
  float uly = Math.Max ( y, rect.y );
  float lrx = Math.Min ( x + width, rect.x + rect.width );
  float lry = Math.Min ( y + height, rect.y + rect.height );

  return ulx <= lrx && uly <= lry;
}

2
Навченим оком зрозуміло, що ви мали на увазі, що це клас розширення на Прямокутник, але ви не надали жодного з обмежувачів чи коду, щоб насправді це зробити. Було б добре, якби ви зробили це чи пояснили, що саме цей метод має використовуватися, і бонусні бали, якщо ваші змінні насправді мали достатньо описові імена для того, щоб хтось наступний розумів їх мету / намір.
tpartee

0

У мене дуже просте рішення

нехай x1, y1 x2, y2, l1, b1, l2 - кординати і довжини і ширини відповідно

розглянемо умову ((x2)

тепер єдиний спосіб перекриття цього прямокутника - це якщо діагональ точки x1, y1 буде лежати всередині іншого прямокутника або аналогічно діагоналі точки x2, y2 буде лежати всередині іншого прямокутника. з чого саме випливає вищезазначена умова.


0

A і B - два прямокутники. C - їх покривний прямокутник.

four points of A be (xAleft,yAtop),(xAleft,yAbottom),(xAright,yAtop),(xAright,yAbottom)
four points of A be (xBleft,yBtop),(xBleft,yBbottom),(xBright,yBtop),(xBright,yBbottom)

A.width = abs(xAleft-xAright);
A.height = abs(yAleft-yAright);
B.width = abs(xBleft-xBright);
B.height = abs(yBleft-yBright);

C.width = max(xAleft,xAright,xBleft,xBright)-min(xAleft,xAright,xBleft,xBright);
C.height = max(yAtop,yAbottom,yBtop,yBbottom)-min(yAtop,yAbottom,yBtop,yBbottom);

A and B does not overlap if
(C.width >= A.width + B.width )
OR
(C.height >= A.height + B.height) 

Він піклується про всі можливі випадки.


0

Це з вправи 3.28 з книги «Вступ до програмування Java» - всеосяжне видання. Код перевіряє, чи є два прямокутники відступними, чи знаходиться один всередині іншого та чи один знаходиться поза іншим. Якщо жодна з цих умов не виконується, обидві перекриваються.

** 3.28 (Геометрія: два прямокутники) Напишіть програму, яка спонукає користувача ввести центр x-, y-координати, ширину та висоту двох прямокутників та визначає, чи є другий прямокутник всередині першого, або перекривається з першим, як показано на малюнку 3.9. Перевірте свою програму, щоб охопити всі випадки. Ось вибірки:

Введіть центр r1 x-, y-координати, ширину та висоту: 2,5 4 2,5 43 Введіть центр r2 x-, y-координати, ширину та висоту: 1,5 5 0,5 3 r2 знаходиться всередині r1

Введіть центр r1 x-, y-координати, ширину та висоту: 1 2 3 5.5 Введіть центр r2 x-, y-координати, ширину та висоту: 3 4 4,5 5 r2 накладається r1

Введіть центр r1 x-, y-координати, ширину та висоту: 1 2 3 3 Введіть центр r2 x-, y-координати, ширину та висоту: 40 45 3 2 r2 не перетинається r1

import java.util.Scanner;

public class ProgrammingEx3_28 {
public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    System.out
            .print("Enter r1's center x-, y-coordinates, width, and height:");
    double x1 = input.nextDouble();
    double y1 = input.nextDouble();
    double w1 = input.nextDouble();
    double h1 = input.nextDouble();
    w1 = w1 / 2;
    h1 = h1 / 2;
    System.out
            .print("Enter r2's center x-, y-coordinates, width, and height:");
    double x2 = input.nextDouble();
    double y2 = input.nextDouble();
    double w2 = input.nextDouble();
    double h2 = input.nextDouble();
    w2 = w2 / 2;
    h2 = h2 / 2;

    // Calculating range of r1 and r2
    double x1max = x1 + w1;
    double y1max = y1 + h1;
    double x1min = x1 - w1;
    double y1min = y1 - h1;
    double x2max = x2 + w2;
    double y2max = y2 + h2;
    double x2min = x2 - w2;
    double y2min = y2 - h2;

    if (x1max == x2max && x1min == x2min && y1max == y2max
            && y1min == y2min) {
        // Check if the two are identicle
        System.out.print("r1 and r2 are indentical");

    } else if (x1max <= x2max && x1min >= x2min && y1max <= y2max
            && y1min >= y2min) {
        // Check if r1 is in r2
        System.out.print("r1 is inside r2");
    } else if (x2max <= x1max && x2min >= x1min && y2max <= y1max
            && y2min >= y1min) {
        // Check if r2 is in r1
        System.out.print("r2 is inside r1");
    } else if (x1max < x2min || x1min > x2max || y1max < y2min
            || y2min > y1max) {
        // Check if the two overlap
        System.out.print("r2 does not overlaps r1");
    } else {
        System.out.print("r2 overlaps r1");
    }

}
}

0
bool Square::IsOverlappig(Square &other)
{
    bool result1 = other.x >= x && other.y >= y && other.x <= (x + width) && other.y <= (y + height); // other's top left falls within this area
    bool result2 = other.x >= x && other.y <= y && other.x <= (x + width) && (other.y + other.height) <= (y + height); // other's bottom left falls within this area
    bool result3 = other.x <= x && other.y >= y && (other.x + other.width) <= (x + width) && other.y <= (y + height); // other's top right falls within this area
    bool result4 = other.x <= x && other.y <= y && (other.x + other.width) >= x && (other.y + other.height) >= y; // other's bottom right falls within this area
    return result1 | result2 | result3 | result4;
}

0

Для тих із вас, хто використовує центральні точки та розміри половини для своїх даних прямокутника замість типових x, y, w, h або x0, y0, x1, x1, ось як це зробити:

#include <cmath> // for fabsf(float)

struct Rectangle
{
    float centerX, centerY, halfWidth, halfHeight;
};

bool isRectangleOverlapping(const Rectangle &a, const Rectangle &b)
{
    return (fabsf(a.centerX - b.centerX) <= (a.halfWidth + b.halfWidth)) &&
           (fabsf(a.centerY - b.centerY) <= (a.halfHeight + b.halfHeight)); 
}

0
struct point { int x, y; };

struct rect { point tl, br; }; // top left and bottom right points

// return true if rectangles overlap
bool overlap(const rect &a, const rect &b)
{
    return a.tl.x <= b.br.x && a.br.x >= b.tl.x && 
           a.tl.y >= b.br.y && a.br.y <= b.tl.y;
}

0

Якщо прямокутники перекриваються, то площа накладання буде більше нуля. Тепер знайдемо область перекриття:

Якщо вони перекриваються, то лівий край перекриття буде max(r1.x1, r2.x1)прямим, а правий край буде min(r1.x2, r2.x2). Так буде довжина перекриттяmin(r1.x2, r2.x2) - max(r1.x1, r2.x1)

Тож площа буде:

area = (max(r1.x1, r2.x1) - min(r1.x2, r2.x2)) * (max(r1.y1, r2.y1) - min(r1.y2, r2.y2))

Якщо area = 0тоді вони не перетинаються.

Просто, чи не так?


3
Це працює для перекриття (це питання), але не буде працювати для перетину, оскільки воно не буде працювати, якщо вони точно перетинаються на куті.
Ленс Робертс

Я спробував цей код, і він взагалі не працює. Я отримую тільки позитивні цифри, навіть коли вони взагалі не перетинаються.
Бретт

@Brett: Так, тому що добуток двох негативних чисел є позитивним.
Ben Voigt

@BenVoigt, проблема полягала в тому, що функція не повертала 0, коли не було перекриття. Мені було дуже незрозуміло з коментарем, але так, я лише коли-небудь отримував область> 0 від цієї функції.
Бретт

Якщо ви працюєте з числами з плаваючою комою, загалом дуже погана ідея використовувати віднімання та інші арифметичні речі перед будь-яким порівнянням чисел. Особливо, якщо вам потрібно порівняти з точним значенням - в цьому випадку нульовим. Це працює в теорії, але не на практиці.
мая

-1

"Якщо ви виконуєте координати віднімання x або y, відповідні вершинам двох, звернених до кожного прямокутника, якщо результати однакові, два прямокутника не перекривають осі, які" (вибачте, я не впевнений, що мій переклад правильний )

введіть тут опис зображення

Джерело: http://www.ieev.org/2009/05/kiem-tra-hai-hinh-chu-nhat-chong-nhau.html


-1

Код Java, щоб визначити, чи прямокутники контактують один з одним або перетинаються один з одним

...

for ( int i = 0; i < n; i++ ) {
    for ( int j = 0; j < n; j++ ) {
        if ( i != j ) {
            Rectangle rectangle1 = rectangles.get(i);
            Rectangle rectangle2 = rectangles.get(j);

            int l1 = rectangle1.l; //left
            int r1 = rectangle1.r; //right
            int b1 = rectangle1.b; //bottom
            int t1 = rectangle1.t; //top

            int l2 = rectangle2.l;
            int r2 = rectangle2.r;
            int b2 = rectangle2.b;
            int t2 = rectangle2.t;

            boolean topOnBottom = t2 == b1;
            boolean bottomOnTop = b2 == t1;
            boolean topOrBottomContact = topOnBottom || bottomOnTop;

            boolean rightOnLeft = r2 == l1;
            boolean leftOnRight = l2 == r1;
            boolean rightOrLeftContact = leftOnRight || rightOnLeft;

            boolean leftPoll = l2 <= l1 && r2 >= l1;
            boolean rightPoll = l2 <= r1 && r2 >= r1;
            boolean leftRightInside = l2 >= l1 && r2 <= r1;
            boolean leftRightPossiblePlaces = leftPoll || rightPoll || leftRightInside;

            boolean bottomPoll = t2 >= b1 && b2 <= b1;
            boolean topPoll = b2 <= b1 && t2 >= b1;
            boolean topBottomInside = b2 >= b1 && t2 <= t1;
            boolean topBottomPossiblePlaces = bottomPoll || topPoll || topBottomInside;


            boolean topInBetween = t2 > b1 && t2 < t1;
            boolean bottomInBetween = b2 > b1 && b2 < t1;
            boolean topBottomInBetween = topInBetween || bottomInBetween;

            boolean leftInBetween = l2 > l1 && l2 < r1;
            boolean rightInBetween = r2 > l1 && r2 < r1;
            boolean leftRightInBetween = leftInBetween || rightInBetween;

            if ( (topOrBottomContact && leftRightPossiblePlaces) || (rightOrLeftContact && topBottomPossiblePlaces) ) {
                path[i][j] = true;
            }
        }
    }
}

...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.