如果我知道矢量的x和z值相同, 因此,我只关注从y平面的差异测量“垂直”角度,与计算点积相比,有更有效的方法吗?
我目前使用点积法的代码如下:
float a_mag = a.magnitude();
float b_mag = b.magnitude();
float ab_dot = a.dot(b);
float c = ab_dot / (a_mag * b_mag);
// clamp d to from going beyond +/- 1 as acos(+1/-1) results in infinity
if (c > 1.0f) {
c = 1.0;
} else if (c < -1.0) {
c = -1.0;
}
return acos(c);
我希望能够摆脱这些平方根
答案 0 :(得分:3)
假设您的两个向量位于u = (x, y1, z)
和v = (x, y2, z)
,并且您对两个向量所跨越的平面之间的平面角度感兴趣。您必须计算点积和幅度,但您可以保存一些操作:
u.v = x.x + y1.y2 + z.z
u^2 = x.x + y1.y1 + z.z
v^2 = x.x + y2.y2 + z.z
所以我们应该预先计算:
float xz = x*x + z*z, y11 = y1*y1, y12 = y1*y2, y22 = y2*y2;
float cosangle = (xz + y12) / sqrt((xz + y11) * (xz + y22));
float angle = acos(cosangle);
答案 1 :(得分:1)
如果x和z的值不变,则计算非常简单:只需使用基本的三角函数。
让积分为(x, y1, z)
和(x, y2, z)
。您可以找到矢量与ZX平面形成的角度。设角度分别为t1
和t2
。然后:
w = sqrt(x^2 + z^2)
tan(t1) = y1 / w
So t1 = atan(y1 / w)
Similarly t2 = atan(y2 / w)
The angle is (t2 - t1)
有一个陷阱:当x和z都为零时,tan
s未定义......但是这样一个简单的案例可以很容易地单独处理。
不幸的是,似乎没有办法避免平方根。