获取输入向量(给定为 (x,y,z))并找到一些与它不同方向的新向量的最简单方法是什么?任何方向都可以,它必须是与输入不同的方向(除了完全相反的方向,这是微不足道的)。
似乎应该有一个不涉及分支的简单解决方案,但我似乎找不到一个,但经过一番之后,我很想知道是否真的有一个。
获取输入向量(给定为 (x,y,z))并找到一些与它不同方向的新向量的最简单方法是什么?任何方向都可以,它必须是与输入不同的方向(除了完全相反的方向,这是微不足道的)。
似乎应该有一个不涉及分支的简单解决方案,但我似乎找不到一个,但经过一番之后,我很想知道是否真的有一个。
我不确定这有多简单,但假设 (x,y,z) 的长度为 L(不是 0),下面的向量长度为 1 并且与 (x,y,z) 成直角
-y * (x + sign(x)*L) / (L*(L+|x|))
1 - y * y / (L*(L+|x|))
-y * z / (L*(L+|x|))
(这里 |x| 是 x 的绝对值,如果 x<0,sign(x) 为 -1,如果 x >= 0,则为 1)
我通过计算将 (x,y,z) 映射到 (1,0,0) 的倍数的户主反射(例如http://en.wikipedia.org/wiki/Householder_transformation )推导出这个公式 ,然后计算图像在这个矩阵下的(0,1,0);由于矩阵既是正交的又是对称的,这个向量将与 (x,y,z) 正交。
没有连续函数 (x,y,z) -> (x',y',z') (for (x,y,z) != (0,0,0)) 使得 (x',y ',z') 绝不是 (x,y,z) 的倍数;如果有,您可以从 (x',y',z') 中删除其在 (x,y,z) 方向上的分量,从而获得连续映射 (x,y,z)->(x'',y '',z'') 其中 (x'',y'',z'') 与 (x,y,z) 成直角,但根据毛球定理,你不能。
在上面的公式中,不连续符号函数的出现使得公式不连续。请注意,符号不必涉及分支;在某些语言中,有一个内置函数可以做到这一点;在 C 中你可以使用 2*(x>=0)-1。