CF_1C中关于给定正多边形三点坐标,求满足条件的使得面积最小的正多边形。
1 #include <stdio.h> 2 #include <math.h> 3 #define pi 3.14159265354 4 #define esp 1e-4 5 double gcd(double,double); 6 double edge(double,double,double,double); 7 int main(void) 8 { 9 double x1,y1,x2,y2,x3,y3; 10 double r,A,B,C,a,b,c,area; 11 double n; 12 scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3); 13 a=edge(x1,y1,x2,y2); 14 b=edge(x1,y1,x3,y3); 15 c=edge(x2,y2,x3,y3); 16 A=acos((b*b+c*c-a*a)/(2*b*c)); 17 B=acos((a*a+c*c-b*b)/(2*a*c)); 18 C=acos((a*a+b*b-c*c)/(2*a*b)); 19 double d=gcd(A,B); 20 d=gcd(d,C); 21 n=pi/d; 22 area=fabs(x2*y3+x3*y1+x1*y2-x3*y2-x1*y3-x2*y1)/2; 23 r=a*b*c/4/area; 24 printf("%.8f\n",(n*r*r/2)*sin(2*pi/n)); 25 return 0; 26 }double edge(double x1,double y1,double x2,double y2) 27 { 28 return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 29 } 30 double gcd(double x,double y)//这里是一中求浮点型数据的最大公约数的一种方法,比较巧妙,值得学习。 31 { 32 while(fabs(x)>esp&&fabs(y)>esp) 33 { 34 if(x>y) 35 x-=floor(x/y)*y; 36 else 37 y-=floor(y/x)*x; 38 } 39 return x+y; 40 }
通过过,r=a*b*c/(4*s)求出外接圆的面积,然后通过A=acos((b*b+c*c-a*a)/(2*b*c))求出三角形三个顶角,然后利用求gcd函数求出A,B,C最大公约数,由于三角形每条边所对应的圆周角都是正多边形圆周角的整数倍,故n=pi/gcd(A,B,C),然后正多边形的面积便是n个相同的三角形的面积了,其中每个三角形面积为r*r/2*sin(2*pi/n),正多边形面积即可求出。