首页 > 代码库 > cf--1C
cf--1C
1 //Accepted 0 KB 60 ms 2 //给出正多变形上的三个点,求正多形的最小面积 3 //记三个点之间的距离a,b,c; 4 //由余弦定理得cosA 5 //从而可求出sinA,和正多边形所在外接圆的半径r 6 //设三条边所对的圆心角为:theta1,theta2,theta3 7 //则正多边形所对的圆心角为gcd(theta1,gcd(theta2,theta3)) 8 //其中gcd(theta1,theta2)为求两个浮点数的最大公约数 9 //至此我们可以根据正多边形所在外接圆的半径r和圆心角求出正多边形的面积10 #include <cstdio>11 #include <cstring>12 #include <iostream>13 #include <queue>14 #include <cmath>15 #include <algorithm>16 using namespace std;17 const double Pi=acos(-1.0);18 /**19 * This is a documentation comment block20 * @authr songt21 */22 struct Point23 {24 double x,y;25 }p[3];26 double getDis(Point p1,Point p2)27 {28 return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));29 }30 double gcd(double a,double b)31 {32 if (fabs(b)<1e-4) return a;33 if (fabs(a)<1e-4) return b;34 return gcd(b,fmod(a,b));35 }36 void slove()37 {38 double a=getDis(p[1],p[2]);39 double b=getDis(p[1],p[3]);40 double c=getDis(p[2],p[3]);41 double cosA=(b*b+c*c-a*a)/(2*b*c);42 double sinA=sqrt(1-cosA*cosA);43 double r=a/(2*sinA);44 //printf("r=%lf\n",r);45 double thetaA=2*asin(a/(2*r));46 double thetaB=2*asin(b/2/r);47 //double thetaC=2*asin(c/2/r);48 double thetaC=2*Pi-thetaA-thetaB;49 //printf("%lf\n",thetaA+thetaB+thetaC);50 double theta=gcd(thetaA,gcd(thetaB,thetaC));51 //printf("theta=%lf\n",theta);52 //printf("Pi=%lf\n",Pi);53 double s=2*Pi/theta*r*r/2*sin(theta);54 printf("%.6lf\n",s);55 }56 int main()57 {58 while (scanf("%lf%lf%lf%lf%lf%lf",&p[1].x,&p[1].y,&p[2].x,&p[2].y,&p[3].x,&p[3].y)!=EOF)59 slove();60 return 0;61 }
cf--1C
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。