在javascript中获取最近的笛卡尔轴对齐向量

Posted

技术标签:

【中文标题】在javascript中获取最近的笛卡尔轴对齐向量【英文标题】:Get closest cartesian axis aligned vector in javascript 【发布时间】:2014-09-13 16:52:06 【问题描述】:

假设您有可能的笛卡尔轴向量:

[1,0,0]、[-1,0,0]、[0,1,0]、[0,-1,0]、[0,0,1] 和 [0,0 ,-1]

(是的,方向很重要)

给定任何特定的unit vector,找到其最近轴向量的最快方法是什么?

【问题讨论】:

【参考方案1】:

我假设您已经将变量 x、y 和 z 作为单位向量的 3 个标量分量。一旦为单位向量给出了这些值,最大值将最接近其轴。

以下代码按定义顺序给出了与第一个的关系(注意大于和大于/等于条件的区别)。

一旦确定了轴,代码会检查是否大于或小于 0,以确定正轴或负轴是轴向量。没有等于 0 的检查,因为没有应该产生这个的向量,但最后的 else 捕获边缘情况:

var v, x, y, z, xn, yn, zn;

// absolute values for direction cosines, bigger value equals closer to basis axis
xn = Math.abs(x);
yn = Math.abs(y);
zn = Math.abs(z);

if ( (xn >= yn) && (xn >= zn) ) 
    // x code
    x > 0 ? v = [ 1, 0, 0 ] : v = [ -1, 0, 0 ] ;
 else if ( (yn > xn) && (yn >= zn) ) 
    // y code
    y > 0 ? v = [ 0, 1, 0 ] : v = [ 0, -1, 0 ] ;
 else if ( (zn > xn) && (zn > yn) ) 
    // z code
    z > 0 ? v = [ 0, 0, 1 ] : v = [ 0, 0, -1 ] ;
 else 
    // oh-no we messed up code
    // has to be
    v = [ 1, 0, 0 ];

【讨论】:

谢谢!非常简洁明了。对于我的特定应用程序,如果两个轴相等,我实际上更愿意选择一个随机轴。但这可以通过一些额外的else ifs 来完成。 不用担心。我喜欢玩这些条件逻辑 3d 解决方案,结果我需要这些代码来完成我自己的一些工作。为什么要编写比需要更多的代码! ;) 考虑一下,你能不能忽略yn > xn 和两个zn 比较,因为它们已经在之前的else ifs 中检查过?然后你可以在 else z 块中添加一个检查来查看 z 是否为零以捕获边缘情况。 在你使用随机轴的情况下,是的,这是可能的。请注意,我的代码在平局和零向量中都有 x 轴的偏差。我通常通过习惯的力量检查一切。在您的情况下,您可以使用 if 语句重写。重要的部分是比较方向余弦以找到最长的分量/最接近轴的分量。 if 语句的逻辑细节取决于用例,尽管我怀疑这两种算法的操作都需要 +/- 1 毫秒。【参考方案2】:

求三个坐标中的最大绝对值。它会给你最近的轴。关于方向,您只需使用在上一步中找到的值的符号即可。

希望对你有帮助。

【讨论】:

以上是关于在javascript中获取最近的笛卡尔轴对齐向量的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight & Blend动画设计系列十:Silverlight中的坐标系统(Coordinate System)与向量(Vector)运动

PyQtGraph 在不同的屏幕未对齐轴中显示时

如何找到将 X、Y、Z 向量与另一个坐标系对齐的角度

怎样判断平面上一个矩形和一个圆形是否有重叠

Python检测网格中的对齐段

旋转矩阵的三维空间