Обнаружение столкновения в повернутом прямоугольнике - PullRequest
1 голос
/ 13 февраля 2012

У меня есть следующие параметры

  1. x, y координаты (только слева вверху) повернутого прямоугольника
  2. Угол поворота
  3. Прямоугольник вращается через центр
  4. Ширина и высота прямоугольника
  5. Координаты точки, наличие которой в прямоугольнике необходимо проверить

Как проверить, находится ли точка внутри прямоугольника?

Любые указатели будут с благодарностью. Спасибо.

Ответы [ 3 ]

5 голосов
/ 13 февраля 2012

Базовая проверка

Если ваш прямоугольник не повернут, проблема ограничена проверкой, находится ли точка (x, y) в некотором диапазоне

(rectangle.x, rectangle.x + rectangle.width)
(rectangle.y, rectangle.y + rectangle.height)

Добавление вращения

Когда прямоугольник вращается, вы можете сделать обратное вращение, чтобы привести точку в «не повернутое состояние» и выполнить предыдущую проверку.

Как «развернуть» точку

Хорошо. Если ваш прямоугольник повернут на 27º, «разворот» должен быть -27º (от той же точки вращения).

Как повернуть точку с учетом точки вращения?

Ну, вы должны:

  1. Переведите вещь, чтобы сделать (0,0) центральную точку: это так, переведите исходную точку (-x, -y), где (x, y) - точка вращения
  2. применить вращение к началу координат (см. Раздел ниже)
  3. отменить первое преобразование (translate (x, y), где (x, y) - точка вращения

Вращение по месту происхождения

Вы должны сделать матричное умножение Ax. Где A - это матрица, а x - это вектор (x, y) точки поворота.

Матрица А построена таким образом

0 голосов
/ 13 февраля 2012

Преобразовать все координаты в повернутую систему отсчета, в которой прямоугольник находится в центре и выровнен по оси.Затем просто проверьте диапазоны координат.

Для преобразования между кадрами используйте следующие формулы: http://en.wikipedia.org/wiki/Rotating_reference_frame#Relation_between_positions_in_the_two_frames

PS Извините, эта ссылка больше подходит для статического случая: http://en.wikipedia.org/wiki/Rotation_(mathematics)#Matrix_algebra

0 голосов
/ 13 февраля 2012

Если вы в порядке с использованием awt, вы можете создать экземпляр Shape, а затем использовать: Shape.contains (Point2D p).

Документы здесь: http://docs.oracle.com/javase/1.5.0/docs/api/index.html?java/awt/Graphics.html Учебник для Java 2D находится здесь: http://java.sun.com/developer/technicalArticles/GUI/java2d/java2dpart1.html#1

HTH

...