2012-04-13 6 views
0

Я пытаюсь создать алгоритм столкновений и реализовать его в своем приложении Win32 2D GUI. Задача состоит в том, что я получил один вектор, который определил середину дна изображения .bmp и еще четыре вектора в положении ромба. Я хотел, чтобы он работал так, чтобы алгоритм знал, идет ли изображение слева, справа, вверх или вниз. В Интернете есть много учебников по обнаружению столкновений прямоугольников, кругов и расстояний, но у меня возникают трудности с их применением для ромба. Существует также что-то, что называется axis-aligned bounding, но я думаю, что это для 3d векторов. Я очень слаб, когда речь заходит об этой теме, поэтому, если есть какой-нибудь опытный программист на C++, который может направить меня на какую-то хорошую электронную книгу, в которой упоминается эта тема, или если код мал, может быть, напечатайте его. Я пробовал делать итерации X, Y координат над ABCD целым ромбом и неудачно провалился.Простое обнаружение столкновения 2D с векторами

Спасибо всем, кто помогает.

+0

2 вопроса: 1) Это домашнее задание? (Это прекрасно, если это так, но его следует пометить [tag: домашнее задание]) и 2) Что вы пробовали до сих пор? – bitmask

+0

выровненных по осям ограничительным рамкам (AABB для краткости) являются полезными для 2d, а также 3d. Идея состоит в том, чтобы окружить сложный объект простой формой, которую легко проверить на наличие столкновений. Тогда, если ограничивающие поля * не совпадают, вам не нужно проверять все детали сложного объекта внутри. Вам все равно нужно написать код, чтобы столкнуться с реальным объектом, но ему не нужно будет запускать тысячи раз каждый кадр ... – comingstorm

+0

Это так. Извините за то, что не помечен как домашнее задание, этот сайт для меня новый. Я знаю, как делать столкновение для прямоугольника и круга, и это было для предыдущей домашней работы. Кроме этого, я попытался выполнить идеальное столкновение с пикселями, но потом понял, что его будет сложнее реализовать в моем текущем коде. – Marko

ответ

1

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

Для этого я бы использовал следующую простую технику. Существует функция, называемая векторным произведением, которая помогает определить, является ли направление вращения от одного вектора к другому положительным или отрицательным. Итак, ваша проверка того, находится ли точка X внутри ромба, образованная полигоном A_1, A_2, ..., A_n, - это просто проверить, имеют ли все векторные произведения (A_iA_ {i + 1}, A_iX) один и тот же знак.

Векторное произведение векторов (x1, y1) и (x2, y2) определяется как x1 * y2 - x2 * y1.

Теперь ваше обнаружение продолжается следующим образом: если предыдущая позиция находится за пределами полигона, а ток находится внутри, точка попала в полигон. Чтобы определить, с какой стороны было пересечено, вам просто нужно проверить, какой из признаков векторных продуктов (A_iA_ {i + 1}, A_iX) изменился с момента последнего обновления позиции.

+0

Извините. Я не совсем уверен, понял ли я, что есть в цикле (A_iA_ {i + 1}, A_iX). – Marko

+0

@Marko: 'A_iA_ {i + 1}' - вектор, начинающийся с 'A_i' и заканчивающийся на' A_ {i + 1} ', то же самое -' A_iX': вектор от 'A_i' до' X'. Затем вам нужно вычислить векторное произведение этих векторов. Вы делаете это для всех возможных 'i'. Затем вы проверяете, одинаковы ли все признаки продукта. – Vlad