Другие языки программирования и технологии

[C++] Сложный алгоритм :(

Есть два прямоугольника (точнее координаты их точек: первая - левый верхний угол прямоугольника, вторая - правый нижний) :
int Rect1X = координаты 1 точки по X;
int Rect1Y = координаты 1 точки по Y;
int Rect2X = координаты 2 точки по X;
int Rect2Y = координаты 2 точки по Y;
Один из прямоугольников движется, и может "войти" в другой (движущийся - тот что зелёный) :

это и надо предотвратить. В случае как на картинке выше надо изменить координаты зеленого прямоугольника, чтобы он вышел из синего "вверх", а в таком случае:

Чтобы вышел вправо. То есть в самое доступное свободное пространство) )

Не обязательно писать за меня функцию :D Просто у меня печально с математикой, натолкните на мысль хотя бы.
Юрий Мингалёв
Юрий Мингалёв
1 456
Проблема в том, что если ПРЕДОТВРАТИТЬ перекрытие прямоугольников.
То указанные ситуации в принципе не возникнут.

Если зелёный-правая нижняя >= синий-левая верхняя то запретить движение в эту сторону.

То же самое для остальных сторон.
В.
Вл@диk ....
1 899
Лучший ответ
Юрий Мингалёв Так я и собираюсь в главном цикле вызывать эту функцию, чтобы предотвращать перекрытие. А разве есть другие варианты?)
Осспади.. . Делов-то!
1. Если пересечение одно - двигаем прямоугольник перпендикулярно пересекаемому ребру наружу.
2. Если пересечений два, то смотрим - где пересекаемая часть ребра длиннее - туда и надо двигать. Далее - см пункт 1.

Формулы:
1. Направление сдвига: векторное произведение векторов. Второй вектор считаем единичным и направленным на наблюдателя перпендикулярно плоскости. Результат - вектор, перпендикулярный обоим, что в данном случае выразится как:
(x, y) - исходный вектор, (y, -x) - вектор, перпендикулярный исходному, смотрящий наружу, т. е. из фигуры. Для того, чтобы это работало, ребра нужно строить в порядке и направлении обхода периметра по часовой стрелке.

2. Попадание точки внутрь: для прямоугольника - это простое минимаксное условие. Тут даже можно просто отсортировать точки по координате x, а потом - по y. Далее - как со скобками. первая точка фигуры - открывающая, вторая - закрывающая. На открывающую точку ставим флаг фигуры, на закрывающую - флаг сбрасываем. Ситуация, когда одновременно выставлено два флага, означает пересечение. Отсюда и алгоритм.. . Находим начало пересечения (появилось два флага) и конец пересечения - кончились два флага.. .
делаете шаг в перед, вычисляете новые координаты проверяете на столкновения, если да меняете траэторию. В Qt для этого уже все сделано есть свойство объектов colission
Есть такая функция API - IntersectRect, она как раз и проверяет пересечение прямоугольников. Если нет пересечения, возвратит false. Если есть - true и область пересечения.
Виктор Корба
Виктор Корба
15 333
Тут скорее визуальное восприятие больше чем математика, смотри
если позиция по оси x + длинна по вертикали больше позиции по оси x второго прямоугольника, значит первый треугольник зашел на границу второго, по оси y аналогично
пиши на почту вообщем
Денис Руленко
Денис Руленко
4 183
считаем новые координаты, проверяем, если ли пересечение, если да то возвращаем обратно значения и делаем, что надо (сдвигаем вправо).