Posted on 2010-08-07 15:11
MiYu 阅读(619)
评论(2) 编辑 收藏 引用 所属分类:
ACM ( 数论 )
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋
题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=2080
题目描述:
Problem Description
这次xhd面临的问题是这样的:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。
注:夹角的范围[0,180],两个点不会在圆心出现。
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;
}