hdu-2080挟み角の大きさII

1800 ワード

角度の計算(単純ジオメトリ)
挟み角の大きさII
Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6032    Accepted Submission(s): 2965
Problem Description
今回xhdが直面する問題は,1つの平面内に2つの点があり,2つの点がそれぞれ原点との連線の挟み角の大きさを求めることである.
注:角度の範囲[080]では、2つの点は中心に現れません.
 
Input
入力データの最初の行は、Tグループデータがあることを示すデータTである.
各セットのデータには、4つの実数x 1,y 1,x 2,y 2がそれぞれ2つの点の座標を表し、これらの実数の範囲は[−1001001000000]である.
 
Output
入力データのセットごとに、出力角度のサイズは小数点以下の2桁に正確です.
 
Sample Input

   
   
   
   
2 1 1 2 2 1 1 1 0

 
Sample Output

   
   
   
   
0.00 45.00

 
問題を解く構想.
:単純なジオメトリ計算.三角形の3辺をそれぞれa,b,cとする.要求される挟み角をCとする.
式は、a=sqrt(x 1*x 1+y 1*y 1)   b=sqrt(x2*x2+y2*y2)    c=sqrt(pow(abs(x2-x1),2)+pow(abs(y2-y1),2))     cosC=(a*a+b*b-c*c)/(2*a*b)      C=acos(cosC)     最後に注意するのは角度を要求するので、この時Cは弧度で、だから本当の結果は C*180/PI
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#define PI acos(-1.0)
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        double x1,y1,x2,y2,a,b,c,jiao;
        scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
        a=sqrt(x1*x1+y1*y1);
        b=sqrt(x2*x2+y2*y2);
        c=sqrt(pow(abs(x2-x1),2)+pow(abs(y2-y1),2));
        jiao=acos((a*a+b*b-c*c)/(2.0*a*b));
        printf("%.2lf
",(double)jiao*(180.0/PI)); } return 0; }