求两直线的旋转角

本文搬运自本人高中时期CSDN博客,若图片加载不出来,可到原文查看:https://blog.csdn.net/zhangtingxiqwq/article/details/135152729

在这里插入图片描述

如图,求 α\alpha 。我们采用的是向量法+三角函数法

在这里插入图片描述

  • 转化向量 : (xbxa,ybya),(xcxb,ycyb)(x_b-x_a,y_b-y_a),(x_c-x_b,y_c-y_b)

  • 转化为向量后,相当于是求他们小于180度的夹角

  • 可以先考虑求两个分别的角,再相减

  • 已知横纵坐标,可以知道 tan\tan 值,然后用atan反求角度。

    • 注意点1:在y轴上时 tan\tan 值不存在,需特判

    • 注意点2:atan的值域为 (π2,π2)(-\frac \pi 2,\frac \pi 2) ,所以还要求它是哪个象限的角

  • 相减后要 ±2π 或者 2π-x 等方式把角弄至 [0,π][0,\pi]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
namespace Calc {
#define pi acos(-1)
struct Point {
double x, y;
};
int calc_q(Point A) {
if(A.x > 0 && A.y > 0) return 1;
if(A.x < 0 && A.y > 0) return 2;
if(A.x < 0 && A.y < 0) return 3;
if(A.x > 0 && A.y < 0) return 4;
return 0;
}
double calc_du(Point A) {
if(A.x == 0) {
if(A.y > 0) return pi/2;
else return 3*pi/2;
}
if(A.y == 0) {
if(A.x > 0) return 0;
else return pi;
}
double k = A.y / A.x, t = atan(k);
int p = calc_q(A);
if(p == 2 || p == 3) t -= pi;
return t;
}
double del(Point A, Point B, Point C) {
Point AB = {B.x - A.x, B.y - A.y};
Point BC = {C.x - B.x, C.y - B.y};
double t1 = calc_du(AB);
double t2 = calc_du(BC);
double d = t1 - t2;
while(d < 0) d += 2*pi;
while(d >= 2*pi) d -= 2*pi;
if(d > pi) d = 2*pi - d;
return d;
}
}