簡體   English   中英

在單個平面中獲得兩個向量之間角度的有效方法?

[英]Efficient way to get the angle between two vectors in a single plane?

如果我知道矢量的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);

我希望能夠擺脫這些平方根

假設您的兩個向量位於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);

如果x和z的值不變,則計算非常簡單:只需使用基本三角法。

設點為(x, y1, z)(x, y2, z) 您可以找到矢量與ZX平面形成的角度。 設角度分別為t1t2 然后:

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是未定義的......但是這樣一個簡單的情況可以很容易地單獨處理。

不幸的是,似乎沒有辦法避免平方根。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM