Я пытаюсь написать программу на 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;
Однако я не совсем уверен, что (а) я правильно реализовал алгоритм, на который я ссылался, или я сделал именно так, как это интерпретировать?
Какие-либо предложения?
Ответы:
или, используя декартовы координаты
(Если X1 - это левая координата, X2 - правая координата, увеличивается слева направо, а Y1 - верхняя координата, а Y2 - нижняя координата, увеличивается снизу вверх - если это не так, как ваша система координат [например, большинство компьютеров имеют Обратное направление Y], поменяйте местами сравнения ниже ) ...
Скажем, у вас есть Rect A и Rect B. Доказательство противоречит. Любое из четырех условий гарантирует, что перекрытия не может быть :
Таким образом, условие не перекрытия
Следовательно, достаточным условием перекрытия является обратное.
Закон де Моргана гласит
Not (A or B or C or D)
, что так же, какNot A And Not B And Not C And Not D
и при использовании де Моргана, мы имеем
Это эквивалентно:
RectA.Left < RectB.Right
] иRectA.Right > RectB.Left
] иRectA.Top > RectB.Bottom
] иRectA.Bottom < RectB.Top
]Примечание 1 : Совершенно очевидно, что этот же принцип можно распространить на любое количество измерений.
Примечание 2 : Также должно быть достаточно очевидно подсчитывать перекрытия только одного пикселя, изменять
<
и / или значение>
на этой границе на a<=
или a>=
.Примечание 3 : Этот ответ при использовании декартовых координат (X, Y) основан на стандартных алгебраических декартовых координатах (x увеличивается слева направо, а Y увеличивается снизу вверх). Очевидно, что если компьютерная система может механизировать координаты экрана по-разному (например, увеличивая Y сверху вниз или X справа налево), синтаксис необходимо будет соответствующим образом скорректировать /
источник
источник
B.height
должно бытьA.height
#undef min
и#undef max
, или используя другие имена параметров.#define BETWEEN(value,min,max) \ (\ value > max ? max : ( value < min ? min : value )\ )
xOverlap
выполняется в одном измерении;rectOverlap
является двухмерным. Его можно расширить до N размеров с помощью цикла.источник
Проще проверить, находится ли прямоугольник полностью вне другого, поэтому, если он
налево...
или справа ...
или сверху ...
или на дне ...
второго прямоугольника, он не может столкнуться с ним. Таким образом, чтобы получить функцию, которая возвращает логическое значение, говорящее о столкновении прямоугольников, мы просто объединяем условия с помощью логических ИЛИ и отменяем результат:
Чтобы уже получить положительный результат только при касании, мы можем изменить «<» и «>» на «<=» и «> =».
источник
Задайте себе противоположный вопрос: как я могу определить, не пересекаются ли два прямоугольника вообще? Очевидно, прямоугольник A полностью слева от прямоугольника B не пересекается. Кроме того, если А полностью вправо. И точно так же, если A полностью выше B или полностью ниже B. В любом другом случае A и B пересекаются.
В последующем могут быть ошибки, но я довольно уверен в алгоритме:
источник
Предположим, что вы определили позиции и размеры прямоугольников следующим образом:
Моя реализация C ++ выглядит так:
Пример вызова функции согласно приведенному выше рисунку:
Сравнения внутри
if
блока будут выглядеть так:источник
Вот как это делается в Java API:
источник
В этом вопросе вы ссылаетесь на математику, когда прямоугольники находятся под произвольными углами поворота. Однако, если я понимаю немного об углах в вопросе, я понимаю, что все прямоугольники перпендикулярны друг другу.
Общее знание формулы области перекрытия:
Используя пример:
1) собрать все координаты х (как левые, так и правые) в список, затем отсортировать и удалить дубликаты
2) собрать все координаты y (как верхнюю, так и нижнюю) в список, затем отсортировать и удалить дубликаты
3) создать двумерный массив по количеству промежутков между уникальными координатами x * числу промежутков между уникальными координатами y.
4) закрасить все прямоугольники в эту сетку, увеличивая количество каждой ячейки, в которой она встречается:
5) Когда вы рисуете прямоугольники, легко перехватывать перекрытия.
источник
источник
Не думайте, что координаты указывают, где находятся пиксели. Думайте о них как о пикселях. Таким образом, площадь прямоугольника 2х2 должна быть 4, а не 9.
источник
Самый простой способ
Прежде всего, подумайте, что в компьютерах система координат перевернута. Ось X такая же, как в математике, но ось Y увеличивается вниз и уменьшается при движении вверх .. если прямоугольник нарисован из центра. если координаты x1 больше, чем x2 плюс его половина видимости. тогда это означает, что половину они коснутся друг друга. и таким же образом идет вниз + половина его высоты. это столкнется ..
источник
Допустим, два прямоугольника - это прямоугольник A и прямоугольник B. Пусть их центры - это A1 и B1 (координаты A1 и B1 можно легко определить), пусть высоты - это Ha и Hb, ширина - это Wa и Wb, пусть dx - это width (x) расстояние между A1 и B1, а dy - расстояние по высоте (y) между A1 и B1.
Теперь мы можем сказать, что можем сказать, что А и В перекрываются: когда
источник
Я реализовал версию C #, она легко конвертируется в C ++.
источник
У меня очень простое решение
пусть x1, y1 x2, y2, l1, b1, l2, будут кординаты и их длины и ширины соответственно
рассмотреть условие ((x2
теперь единственный способ перекрытия этих прямоугольников - это если точка, диагональная x1, y1, будет лежать внутри другого прямоугольника или аналогично точке, диагональной x2, y2, будет лежать внутри другого прямоугольника. что именно из вышеприведенного условия подразумевает.
источник
А и В два прямоугольника. C быть их покрывающим прямоугольником.
Он заботится обо всех возможных случаях.
источник
Это из упражнения 3.28 из книги Введение в программирование на Java - полное издание. Код проверяет, являются ли два прямоугольника одинаковыми, находится ли один внутри другого и находится ли он снаружи другого. Если ни одно из этих условий не выполнено, то два перекрываются.
** 3.28 (Геометрия: два прямоугольника) Напишите программу, которая предлагает пользователю ввести координаты центра x, y, ширину и высоту двух прямоугольников и определяет, находится ли второй прямоугольник внутри первого или перекрывается с первым, как показано на рисунке 3.9. Протестируйте свою программу, чтобы охватить все случаи. Вот примеры прогонов:
Введите x-, y-координаты, ширину и высоту центра r1: 2.5 4 2.5 43 Введите x-, y-координаты, ширину и высоту центра r1: 1,5 5 0,5 3 r2 находится внутри r1
Введите x-, y-координаты, ширину и высоту центра r1: 1 2 3 5.5 Введите x-, y-координаты, ширину и высоту центра r2: 3 4 4.5 5 r2 перекрывает r1
Введите x-, y-координаты, ширину и высоту центра r1: 1 2 3 3 Введите x-, y-координаты, ширину и высоту центра r2: 40 45 3 2 r2 не перекрывает r1
источник
источник
Для тех из вас, кто использует центральные точки и половинные размеры для своих данных прямоугольника вместо типичных x, y, w, h или x0, y0, x1, x1, вот как вы можете это сделать:
источник
источник
Если прямоугольники перекрываются, то область перекрытия будет больше нуля. Теперь давайте найдем область перекрытия:
Если они перекрываются, то левый край прямоугольника перекрытия будет
max(r1.x1, r2.x1)
и правый край будетmin(r1.x2, r2.x2)
. Таким образом, длина наложения будетmin(r1.x2, r2.x2) - max(r1.x1, r2.x1)
Так что площадь будет:
Если
area = 0
тогда они не перекрываются.Просто не так ли?
источник
«Если вы выполняете вычитание координат x или y, соответствующих вершинам двух, стоящих перед каждым прямоугольником, если результаты имеют одинаковый знак, два прямоугольника не перекрывают оси, которые» (извините, я не уверен, что мой перевод правильный )
Источник: http://www.ieev.org/2009/05/kiem-tra-hai-hinh-chu-nhat-chong-nhau.html
источник
Java-код, чтобы выяснить, соприкасаются ли прямоугольники или перекрывают друг друга
...
...
источник