现在的位置: 首页 > 综合 > 正文

HDOJ HDU 2080 夹角有多大II ACM 2080 IN HDU

2012年11月01日 ⁄ 综合 ⁄ 共 1362字 ⁄ 字号 评论关闭
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

题目地址:
         http://acm.hdu.edu.cn/showproblem.php?pid=2080
题目描述:

Problem Description
这次xhd面临的问题是这样的:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。

注:夹角的范围[0180],两个点不会在圆心出现。
 

Input
输入数据的第一行是一个数据T,表示有T组数据。
每组数据有四个实数x1,y1,x2,y2分别表示两个点的坐标,这些实数的范围是[-10000,10000]。
 

Output
对于每组输入数据,输出夹角的大小精确到小数点后两位。
 

Sample Input
2
1 1 2 2
1 1 1 0
 

Sample Output
0.00
45.00


题目分析:
         纯数学题.   有多边型面积公式, 我们可以得到 三角型的面积 : S = ( x0 * y1 - x1 * y0 ) / 2.
而由三角型正弦定理我们知道 : S = 1 / 2 * A * B * sinV . 联立 2方程就可以得到 夹角V 的解
的方程 :  sinV =  ( x0 * y1 - x1 * y0 ) / A / B ;       最后利用 c 数学库函数 asin就可以求出V的弧
度值, 把弧度转换成角度就可以了.   ( 注意平角和钝角的判断 )

代码如下 :

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

#include <iostream>
#include 
<cmath>
#include 
<iomanip>
using namespace std;
int main ()
{
    
int T;
    cin 
>> T;
    
while ( T -- )
    {
            
double x0,x1,y0,y1;
            cin 
>> x0 >> y0 >> x1 >> y1;
            
double A = sqrt ( x0 * x0 * 1.0 + y0 * y0 * 1.0 );
            
double B = sqrt ( x1 * x1 * 1.0 + y1 * y1 * 1.0 );
            
double resin = ( fabs ( x0 * y1 - x1 * y0 ) ) / A / B ;
            
double res = asin ( resin ) * 180.0 / acos( -1 );
            res 
= res < 1e-5 ? ( x0 * x1 < 0 ? 180.0 : 0.0 )                          //平角 
                             : ( x0 * x1 <= 0 && y0 * y1 <= 0 ? 180.0 - res : res );  //是否钝角                        
            cout << setprecision (2<< setiosflags ( ios::fixed ) << res << endl;
    }
    
return 0
}


抱歉!评论已关闭.