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

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

-
转化向量 : (xb−xa,yb−ya),(xc−xb,yc−yb)
-
转化为向量后,相当于是求他们小于180度的夹角
-
可以先考虑求两个分别的角,再相减
-
已知横纵坐标,可以知道 tan 值,然后用atan反求角度。
-
注意点1:在y轴上时 tan 值不存在,需特判
-
注意点2:atan的值域为 (−2π,2π) ,所以还要求它是哪个象限的角
-
相减后要 ±2π 或者 2π-x 等方式把角弄至 [0,π] 内
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; } }
|