Как рассчитать разницу Минковского между двумя AABBs (без векторной математики)?

Я ввожу вторая версия моей библиотеки обнаружение столкновений. Этой конкретной библиотеки должны заниматься выровненный по осям коробки (AABBs). Я хотел бы начать отслеживать быстро движущиеся коробки в этой версии. Я думаю, что вычисление разницы Минковского между ними было бы хорошей отправной точкой для этого.

когда я говорю разницу Минковского, я имею в виду геометрическую операцию, описанную в обнаружение столкновений для чайников.

в catch is: процесс и алгоритм, описанные там, очень общие. Он использует довольно продвинутую векторную математику для вычисления MD любых двух полигонов.

в моем случае у меня есть AABBs. Учитывая их численную простоту, библиотека до сих пор не нуждалась в векторной концепции - например, мне не нужно было вычислять один точечный продукт. Я бы хотел, чтобы так и оставалось, если это вообще возможно.

Итак, мой вопрос:

учитывая два AABBs по их верхней, левой, ширине и высота ({t1,l1,w1,h1} и {t2,l2,w2,h2}), Как вычислить их MD (без получения векторной математики, если это возможно)?

просто играя с виджетом по обнаружению столкновений для чайников, я почти уверен, что ширина MD будет коробкой ширины w1+w2 и высотой h1+h2. Но я понятия не имею, как вычислить его верхний или левый угол.

1 ответов


разница Минковского для двух выровненных по осям прямоугольников {t1, l1, w1, h1} и {t2, l2, w2, h2} сама по себе является выровненным по осям прямоугольником:

l = l1 - l2 - w2
t = t2 - t1 - h1
w = w1 + w2
h = h1 + h2

ниже приведена краткая демонстрация javascript, чтобы показать это в действии. Можно перетащить любой из двух прямоугольников. Они будут менять цвет при перекрытии

демо:http://jsbin.com/afojes/2/

код: http://jsbin.com/afojes/2/edit

No collision

Collision detected