获取给定为(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,如果x>=0则为1)
我通过计算户主的反射(如http://en.wikipedia.org/wiki/Householder_transformation)将(x,y,z)映射为(1,0,0)的倍数,然后在该矩阵下计算(0,1,0)的图像;由于矩阵是正交和对称的,所以该向量将与(x,y,z)正交。
不存在连续函数(x,y,z)->(x',y',z')(对于(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。