2010-11-07 5 views
1

У меня есть «ящик», сделанный из двух трехмерных векторов. Один для переднего нижнего левого угла и один для заднего-верхнего правого угла.Проверьте, существует ли вектор между двумя другими

Есть ли какой-либо простой способ проверить, находится ли третий трехмерный вектор внутри этой «коробки»?

Сначала я написал simething как (псевдопользователей):

p = pointToCompare; 
a = frontLowerLeft; 
b = backUpperRight; 

if(p.x >= a.x && p.x <= b.x && p.y >= a.y ... 

Но это работает только тогда, когда все координаты положительны, что они не всегда будут. Должен ли я делать что-то подобное выше, или есть лучший/более простой способ сделать этот расчет?

Если вы хотели бы знать, что это вектор, и это метод я использую: http://www.jmonkeyengine.com/doc/com/jme/math/Vector3f.html

+2

Этот подход должен работать даже для отрицательных координат! Единственный случай, в котором он не будет работать, - это то, что ваши координаты ящика не являются действительно передними, нижними и нижними и верхними правыми. –

+1

Это звучит недостаточно для меня. Является ли поле принятым по оси? –

+0

Ошибка у меня. Описанный метод работает даже с отрицательными координатами. И да, ящик выравнивается по оси. – EClaesson

ответ

4

Если вы хотите, чтобы сделать его немного более надежным, вы могли бы сделать это инвариантно к положению углов :

if (a.x <= p.x && p.x <= b.x || b.x <= p.x && p.x <= a.x) { 
    // similar to the y- and z-axes. 
} 

более intutive (но slightliy медленнее) вариантом было бы использовать мин/макс на каждой оси:

if (Math.min(a.x, b.x) <= p.x && p.x <= Math.max(a.x, b.x)) { 
    // ... 
} 
0

Вот общее решение для коробки й в которых могут быть не только прямые углы, т. е. общий параллелепипед.

Трюк здесь заключается в том, чтобы найти преобразование, которое преобразует вашу коробку в единичный куб. Если вы затем выбросите свой вектор, который хотите протестировать через это преобразование, вам просто нужно проверить, что все X, Y и Z находятся между нулем и единицей.

Рассмотрите угловую точку на своей коробке, чтобы быть вашим источником. Назовем это К. Теперь построим три основные оси P Q R как векторы, которые простираются вдоль трех ребер, которые касаются этой точки.

Теперь любая точка в трехмерном пространстве может быть представлена ​​как K + aP + bQ + cR. Кроме того, существует только один (a, b, c), который удовлетворяет требованиям.

Если вы можете определить (а, б, в), вам нужно просто проверить, что каждый находится в пределах от 0 до 1.

Если кто-то заинтересован в матричной математике, дайте мне колокол!

Смежные вопросы