【问题标题】:Check if a vector is between two others检查向量是否在其他两个向量之间
【发布时间】:2010-11-07 11:51:48
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这种方法甚至适用于负坐标!唯一不适用的情况是,如果您的框坐标不是真正的前左下和右上。
  • 这对我来说听起来不太确定。是否假定框是轴对齐的?
  • 我错了。所描述的方法即使在负坐标下也适用。是的,盒子是轴对齐的。
  • 一个向量在一个盒子里是什么意思?当您说“矢量”时,您的意思是“点”吗?
  • 是的,我的意思是。位置由三维向量定义的点。

标签: java math 3d vector jmonkeyengine


【解决方案1】:

如果你想让它更健壮一点,你可以让它对角的位置保持不变:

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)) {
  // ...
}

【讨论】:

    【解决方案2】:

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

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

    将盒子上的一个角点视为您的原点。我们称它为 K。现在将三个主轴 P Q R 构造为沿着与该点接触的三个边延伸的向量。

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

    如果你能确定(a, b, c),你只需要检查每个在0到1之间。

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

    【讨论】:

      猜你喜欢
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多