2015-01-06 178 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正交

相关问题