2015-01-06 113 views
1

首先,我想問的是測量順時針還是逆時針方向的矢量之間的夾角?你能指定嗎?計算0到360之間的兩個矢量之間的夾角總是在同一個方向上

我需要計算我將從3個點創建的矢量之間的夾角。我需要的角度在0到360度之間,並且始終以相同的方向測量。

我該怎麼做?

我會用它來找到使它成直角的角度...垂直。 原因方向是重要的是,我將這兩次從相同的原點向量垂直在90另一個垂直在270.因此,如果它只測量最小角度我不知道我是否需要添加或減去一個角度。

測量到0-1

矢量0-1和0-3

度量向量0-1和0-2

0-2需要90度逆時針之間的角度之間的角度

0-3需要270度逆時針到0-1(順時針90度)

我知道點的順序。 2總是需要90 CCW和3需要270 CCW,但點可能在任何地方。

希望這是有道理的,並提前感謝。

嘗試畫一幅畫,但不會讓我擡起負荷由於「名聲」

+2

這已經被問過太多次了......無論如何,看一看atan2函數(http://www.cplusplus .com/reference/cmath/atan2 /),並在[這個問題的0-360度部分](http://stackoverflow.com/questions/1311049/how-to-map-atan2-to-degrees-0 -360) – Cimbali

+1

在笛卡兒座標系中,通常逆時針測量角度(0度指向正X軸,90度指向正(上)Y軸) – Alnitak

+0

右手規則確定符號。如果將x軸逆時針旋轉到y軸,則z軸指向您的平面。 – duffymo

回答

2

首先,角度測量逆時針。

然後,如果你有兩個向量,計算角度:

vect2D u{ 1, 0 }, v{ -1, 0 }; 
cout << " angle in degrees : " << angle_deg(u,v) << endl; 

附記:兩個非NUL矢量V和W是正交如何使用它

const double pi = std::atan(1.0) * 4; 

struct vect2D { // of course you could use vectors if you prefer 
    double x; 
    double y; 
    double operator*(vect2D& e) { return x*e.x + y*e.y; } // scalar product of 2 vectors 
    double dist() { return sqrt(x*x + y*y); } // length 
}; 

double prd_vect(vect2D& u, vect2D& v) 
{ 
    return u.x*v.y - u.y*v.x; 
} 
double angle_rad(vect2D& u, vect2D& v) 
{ 
    return (prd_vect(u,v)<0 ? -1:1) * acos(u*v/(u.dist()*v.dist())); 
} 
double angle_deg(vect2D& u, vect2D& v) 
{ 
    return angle_rad(u,v)/pi * 180 ; 
} 

演示(+ 90°或-90°)。

所以,如果你有一個給定的矢量v,並有一個固定點M和所需的長度,它應該是相對容易的一些基本的數學和上面的公式計算N的位置,使得MN與v正交

相關問題