2010-11-07 204 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

即使对于负坐标也应该使用这种方法!唯一不适用的情况是如果你的盒子坐标不是真正的左下和右上。 – 2010-11-07 11:55:16

+1

这听起来确定不了我。该盒子是否假定为轴对齐? – 2010-11-07 11:58:57

+0

由我错误。所描述的方法即使在负坐标下也可以工作。是的,盒子是轴对齐的。 – EClaesson 2010-11-07 12:03:23

回答

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都在0和1之间。

考虑你的盒子上的角落点是你的起源。我们称之为K.现在,将三个主轴P Q R构造为沿着触摸这一点的三条边延伸的向量。

现在三维空间中的任意点可以表示为K + aP + bQ + cR。此外,只有一个满足的(a,b,c)

如果你能确定(A,B,C),你只需要检查每个是0和1之间

如果有人有兴趣的矩阵数学,给我一个钟!

相关问题