2015-01-06 1 views
1

첫째, 시계 방향 또는 시계 반대 방향으로 측정 된 벡터 사이의 각도를 묻고 싶습니다. 지정할 수 있습니까?0과 360 사이의 두 벡터 사이의 각도를 항상 같은 방향으로 계산하십시오.

나는 3 점에서 만들 벡터의 각도를 계산해야합니다. 0도에서 360도 사이의 각도가 필요하며 항상 같은 방향으로 측정해야합니다.

어떻게해야합니까?

각도를 직각으로 만드는 데 필요한 각도를 찾으려면이 방법을 사용합니다. 이유의 방향이 중요하다는 것은 270에서 다른 수직선의 벡터 수직면에있는 동일한 원점에서이 작업을 두 번 수행한다는 것입니다. 따라서 최소 각도 만 측정하면 각도를 더하거나 뺄 필요가 있는지 알 수 없습니다 .

0-1

행 벡터 0-1 및 0-3

계수 벡터를 시계 반대 방향으로 0-1 및 0-2

0-2 필요 90도 사이의 각도 사이의 각도를 측정

0-3은 0-1 (시계 방향으로 90도)까지 270도 회전해야합니다.

포인트의 순서를 알고 있습니다. 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

직교 좌표에서 각도는 일반적으로 반 시계 방향으로 측정됩니다 (양의 X 축을 따라 0도, 양의 (Y 축)을 따라 90도) – 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과 원하는 길이를 가진다면 몇 가지 기본 수학과 위의 수식은 MN이 v에 직교하도록 N의 위치를 ​​계산합니다.

관련 문제