[英]Different methods for finding angle between two vectors
去年,我在一所學校的C ++游戲開發班上學到,要找到兩個向量之間的夾角,可以使用以下方法:
vec2_t定義為: typedef float vec2_t[2];
vec [0] = x和vec [1] = y
float VectorAngle(vec2_t a, vec2_t b)
{
vec2_t vUp;
vec2_t vRight;
vec2_t vDir;
float dot, side, angle;
VectorCopy(vUp, a);
VectorNormalize(vUp);
VectorInit(vRight, -vUp[1], vUp[0]);
VectorCopy(vDir, b);
VectorNormalize(vDir);
dot = VectorDot(vUp, vDir);
side = VectorDot(vRight, vDir);
angle = acosf(dot);
if(side < 0.0f)
angle *= -1.0f;
return angle;
}
就在昨天,在尋找其他解決方案時,我發現您可以改用以下方法:
float VectorAngle(vec2_t a, vec2_t b)
{
return atan2f(b[1]-a[1], b[0]-a[0]);
}
這似乎更容易實現...我的問題是,當第二種方法簡單得多時,為什么一個偏愛第二種方法呢?
編輯:為了確保:如果向量a為[100,100],向量b為[300,300],則方法2返回0.78539819弧度,這是正確的嗎?
我覺得可用的方法:
// cross product
double y = (v1[0] * v2[1]) - (v2[0] * v1[1]);
// dot product
double x = (v1[0] * v2[0]) + (v1[1] * v2[1]);
return atan2(y, x);
第二種方法計算b和a(ba)的幾何差向量,並返回該差與X軸之間的角度。顯然,該角度一般不等於a和b之間的角度。
您可以將復數用於2d向量計算。 復數的乘法可以看作是正旋轉,除法可以看作是負旋轉。 我們要使用除法,因為它的作用是從另一個角度減去一個角度:
#include <complex>
int main() {
using std::complex;
using std::arg;
complex<double> a, b;
double angle = arg(a/b);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.