1

我有一个由两个三维向量组成的“盒子”。一个用于前左下角,一个用于后右上角。

有没有简单的方法来检查第三个三维向量是否在这个“盒子”内的任何地方?

首先我写了类似(伪)的东西:

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

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

但这只有在所有坐标都是正数的情况下才有效,但并不总是如此。我应该做上面的事情,还是有更好/更简单的方法来做这个计算?

如果您想知道,这是 Vector 和我正在使用的方法:http ://www.jmonkeyengine.com/doc/com/jme/math/Vector3f.html

4

2 回答 2

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.
}

更直观(但稍慢)的变体是在每个轴上使用 min/max:

if (Math.min(a.x, b.x) <= p.x && p.x <= Math.max(a.x, b.x)) {
  // ...
}
于 2010-11-07T12:21:33.243 回答
0

这是一个可能不是直角的盒子的通用解决方案,即通用平行六面体。

这里的诀窍是找到将您的盒子转换为单位立方体的转换。如果您随后抛出您想要通过此转换进行测试的向量,您只需要检查 X、Y 和 Z 是否都位于零和一之间。

考虑盒子上的一个角点作为你的原点。我们称其为 K。现在将三个主轴 PQR 构造为沿着与该点接触的三个边延伸的向量。

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

如果您可以确定(a, b, c),您只需检查每个值是否介于 0 和 1 之间。

如果有人对矩阵数学感兴趣,请给我一个铃铛!

于 2010-11-08T18:49:08.470 回答