Проверьте, находится ли вектор между двумя другими - PullRequest
1 голос
/ 07 ноября 2010

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

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

Сначала я написал что-то вроде (псевдо):

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 ]

4 голосов
/ 07 ноября 2010

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

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

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

if (Math.min(a.x, b.x) <= p.x && p.x <= Math.max(a.x, b.x)) {
  // ...
}
0 голосов
/ 08 ноября 2010

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

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

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

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

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

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

...