是否可以通过将矢量旋转到轴并沿轴旋转来计算矢量的长度,然后使用该轴测量矢量的长度?如果是这样,它是否比毕达哥拉斯/平方根计算长度便宜? 我在团结工作(C#)
示例:
Vector3 myVector(x, y, z);
Vector3 myVectorRealigned = Quaternion.FromToRotation(myVector, Vector3.up) * myVector;
float myVectorLength1 = sqrt(myVector.x^2 + myVector.y^2 + myVector.z^2);
float myVectorLength2 = myVectorRealigned.y;
当我尝试这个似乎工作!但是哪种方法最好用/最便宜?
答案 0 :(得分:3)
我不是数学家,所以如果我错了,请纠正我。
正如您所测试的那样,两种方法都应该有效,但我认为Quaternion方法的成本更高。
规范方法需要3次乘法,2次加法和1次sqrt。
相比之下,单独使用四元数方法(Quaternion.FromToRotation
)的第一步比计算范数更昂贵。计算描述从一个向量到另一个向量的旋转的四元数的方法是:
Quaternion q;
vector a = crossproduct(v1, v2)
q.xyz = a;
q.w = sqrt((v1.Length ^ 2) * (v2.Length ^ 2)) + dotproduct(v1, v2)
如你所见,仅这一点比norm = sqrt(myVector.x^2 + myVector.y^2 + myVector.z^2)
更贵。
此外,您使用该四元数再次旋转矢量涉及点积,交叉积和几次乘法和加法。
例如:rotatedVec = 2 * dot(q.xyz, v) * q.xyz + (q.w^2 - dot(q.xyz, q.xyz)) * v + 2 * q.w * cross(q.xyz, v)
。
参考文献:from-to-quaternion,rotate vector by quaternion
旁注:如果您关注性能并且不需要矢量的确切长度(例如,用于确定最接近x的位置),则可以使用{{3} (方形规范)也是如此。