У меня есть вопрос, и я не хочу реализации. Я просто хочу немного помочь в моих рассуждениях.
Я хочу определить, перекрываются ли два объекта (их координаты x и y, а также их высота и ширина, сохраняются в векторе), а затем, если они это делают, удалить их из текущего вектора и добавить их к другому с объединенными свойствами.
Мой вопрос, как правило, как вы говорите, когда что-то перекрывается? Очевидно, что они могут иметь одинаковый x и не перекрываться из-за различий y или наоборот. Я думаю, что мне нужна информация о ширине и высоте в дополнение к расположению края объекта, но я даже не знаю, как превратить это в псевдокод в настоящее время.
Любая помощь, чтобы помочь мне понять это будет принята с благодарностью!
РЕДАКТИРОВАТЬ: Объекты строго прямоугольные, а координаты соответствуют условию пиксельного монитора. то есть 0,0 — верхний левый угол объекта, и увеличение x соответствует движению вправо, в то время как увеличение y означает движение вниз.
Рассмотрим два прямоугольника R1 и R2.
Перекрытие в х:
if (R2.x < R1.x + R1.width) AND (R1.x < R2.x + R2.width)
Перекрытие в y
if (R2.y < R1.y + R1.height) AND (R1.y < R2.y + R2.height)
PS. Обратите внимание, что я использую псевдоязык
Может быть, картина поможет. Это ваша система координат с двумя объектами.
Два объекта перекрываются по оси х, если расстояние между x1
а также x2
меньше ширины объекта, который ближе к оси х (w1
в случае на картинке).
псевдокод:
w = width of leftmost object
if ( abs (x1-x2) < w ) /* overlap on x axis */
Вы должны сделать то же самое для оси Y. Если обе проверки возвращают true, объекты перекрываются.
Особенно плохой (но интуитивно понятный) способ сделать это заключается в следующем:
Если два 2D-прямоугольника перекрываются, то определенно некоторые стороны одной из них пересекают некоторые стороны другой. На самом деле, даже если один из отрезков линии, составляющих один из них, пересекает один из отрезков линии другого, прямоугольники перекрываются.
Таким образом, вы можете просто перебрать их стороны и проверить их пересечение пара за парой. Поиск кода или идей для пересечение отрезка не должно быть трудно вообще.
Важное примечание: вам нужно определить для себя, является ли разделение стороны между прямоугольниками перекрывающимися или нет. Если это не так, то вы должны быть особенно осторожны в реализации вышеописанного метода.
Для выровненных по оси прямоугольников (прямоугольников со сторонами, параллельными осям), решение является более простым:
Предположим, что два прямоугольника названы A
а также B
и предположим, что их 4 стороны названы left
(минимальная координата X), right
(максимальная координата X), top
(минимальная координата Y) и bottom
(максимальная координата Y.) Тогда я думаю, что вы можете сказать, что они перекрываются, если (и только если) любой из них верно:
A.right
меньше чем B.left
(A находится полностью слева от B)A.left
больше, чем B.right
(A находится полностью справа от B)A.bottom
меньше чем B.top
(А полностью выше В)A.top
больше, чем B.bottom
(А полностью ниже Б)В (несколько) псевдокод, вы можете написать:
if (A.right < B.left || A.left > B.right || A.bottom < B.top || A.top > B.bottom)
/* don't overlap */
или написано в другой (более симметричной и, возможно, более легкой для понимания) форме:
if (A.right < B.left || B.right < A.left || A.bottom < B.top || B.bottom < A.top)
/* don't overlap */
Снова обратите внимание, что с прямоугольниками с соприкасающимися сторонами нужно обращаться осторожно.