夹角有多大II
Problem Description
这次xhd面临的问题是这样的:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。
注:夹角的范围[0,180],两个点不会在圆心出现。
注:夹角的范围[0,180],两个点不会在圆心出现。
Input
输入数据的第一行是一个数据T,表示有T组数据。
每组数据有四个实数x1,y1,x2,y2分别表示两个点的坐标,这些实数的范围是[-10000,10000]。
每组数据有四个实数x1,y1,x2,y2分别表示两个点的坐标,这些实数的范围是[-10000,10000]。
Output
对于每组输入数据,输出夹角的大小精确到小数点后两位。
Sample Input
2
1 1 2 2
1 1 1 0
Sample Output
0.00
45.00
题目是求 顶点为原点的角的角度;
既然顶点为原点 如图 :
夹角θ=θb-θa θa=atan(a.y/a.x)
而这题 需要解决问题是:
假如:一个点是(-2,-2),-2/-2=1,atan(1)=45° 而 pOx的夹角为180°+45° 所以类似我们需要分类讨论。
四个象限:
第一象限:(x>0,y>0): θ=atan(y/x)
第二象限:(x<0,y>0): θ=atan(y/x)+180
第三象限:(x<0,y>0): θ=atan(y/x)+180
第四象限:(x<0,y>0): θ=atan(y/x)+360
四个方向轴:
X轴正方向:(2,0) atan(2/0)=0°
Y轴正方向:(0,2) atan(0/2)=90°
X轴负方向:(-2,0) atan(-2/0)=-0° 实际为180° 所以+180°
Y轴负方向:(0,-2) atan(0/-2)=-90° 实际为270° 说以+360°
总结 一下就是函数 function_2 中的4中情况。
AC代码如下:
1 #include <iostream> 2 #include <cmath> 3 #include <cstdio> 4 using namespace std; 5 const double pi=3.14159265; 6 struct Point 7 { 8 double x,y; 9 //Point(int X,int Y):x(X),y(Y){}; 10 }; 11 inline double function_1(double hd) 12 { 13 return 180/pi*hd; 14 } 15 inline double function_2(Point p) 16 { 17 if(p.x>=0&&p.y>=0) 18 return function_1(atan(p.y/p.x)); 19 else if(p.x<0&&p.y>=0) 20 return function_1(atan(p.y/p.x))+180; 21 else if(p.x<0,p.y<=0) 22 return function_1(atan(p.y/p.x))+180; 23 else 24 return function_1(atan(p.y/p.x))+360; 25 } 26 int main() 27 { 28 int n; 29 cin>>n; 30 while(n--) 31 { 32 Point p1,p2; 33 double o=0; 34 cin>>p1.x>>p1.y>>p2.x>>p2.y; 35 //cout<<function_2(p1)<<" "<<function_2(p2)<<endl; 36 o=abs(function_2(p1)-function_2(p2)); 37 //cout<<o<<endl; 38 printf("%.2lf ",o); 39 40 } 41 return 0; 42 }