计算0到360之间的两个向量之间的角度总是在同一方向上

时间:2015-01-06 17:34:15

标签: c++ math vector rotation angle

首先,我想问的是向顺时针方向或逆时针方向测量矢量之间的角度?你能说明吗?

我需要计算我将从3点创建的向量之间的角度。我需要角度介于0到360度之间,并始终以相同方向测量。

我该怎么做?

我将使用它来找到使其成直角...垂直所需的角度。 方向很重要的原因是我将从相同的原点开始两次,矢量垂直于90,另一个垂直于270.因此,如果它仅测量最小角度,我将不知道我是否需要加或减一个角度。

测量矢量0-1和0-3之间的角度

测量矢量0-1和0-2之间的角度

0-2需要逆时针90度到0-1

0-3需要逆时针270度到0-1(顺时针90度)

我知道点数的顺序。 2总是需要90 CCW,3需要270 CCW但点可以在任何地方。

希望这是有道理的,并提前多多感谢。

试图画一幅画,但由于“声誉”而不会让我加载

1 个答案:

答案 0 :(得分:2)

首先,逆时针测量角度。

然后,如果你有两个向量,计算角度是:

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 ; 
}

演示如何使用它:

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

补充说明:如果标量乘积为0,则两个非零向量v和w是正交的(+ 90°或-90°)。

因此,如果你有一个给定的向量v并且有一个固定的点M和一个所需的长度,那么用一些基本的数学和上面的公式来计算N的位置应该相对容易,使得MN与v正交。