标签:
题目链接:传送门
分析
给定角a,b,c,d.然后求角AED,这题其实就是高中的计算几何解三角形题目。
正弦定理: A/sin(A) = B/sin(B) = C/sin(C)=2*R (R为三角形外接圆的半径)
余弦定理:A^2 = B^2 + C^2 - 2*B*C*cos(A).
然后我们设AB = x ,然后可以通过正弦定理求出AD,BD,BE,AE,然后通过余弦定理
可以求出DE最后在通过正弦定理就可以求出角AED.需要注意的是asin()的范围为
[-pi/2,pi/2],我们得到的sin(AED)的值之后还需要判断一下角的范围。这题需要
特判一下几个角为0的情况。具体实现见代码。
代码如下:
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> using namespace std; const double pi = acos(-1.0); double getr(double x){ return x/180.0*pi; } int main() { double a,b,c,d; while(cin>>a>>b>>c>>d){ if(a==0||c==0){ printf("0.00\n"); continue; } else if(b==0){ printf("%.2lf\n",c); continue; } else if(d==0){ printf("%.2lf\n",b+c); continue; } double ab = 10.0; a = getr(a); b = getr(b); c = getr(c); d = getr(d); double ad = ab*sin(c)/sin(pi-b-c-a); double bd = ab*sin(a+b)/sin(pi-b-c-a); double be = ab*sin(b)/sin(pi-b-c-d); double ae = ab*sin(d+c)/sin(pi-b-c-d); double de = sqrt(bd*bd+be*be-2*bd*be*cos(d)); double sinans = ad/de*sin(a); double ans; if(ad*ad>de*de+ae*ae) ans = 180-asin(sinans)/pi*180.0; else ans = asin(sinans)/pi*180.0; printf("%.2lf\n",ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
Acdream 1203 KIDx's Triangle(解三角形)
标签:
原文地址:http://blog.csdn.net/bigbigship/article/details/46707075