1C. Ancient Berland Circus
一个正多边形,给你三个定点的坐标,求正多边形面积的最小值
-
根据海伦公式求出正多边形的外接圆的半径
-
海伦公式
公式中a,b,c分别为三角形三边长,p为半周长,S为三角形的面积。
-
-
在外接圆半径大小唯一的情况下,要使正多边形面积最小,就是使正多边形的边数最少,也就是使得每条边所对应的圆心角最大。而最大圆心角 = 三角形三条边所对应的三个圆心角的公约数
-
求面积
#include <iostream>
#include <cmath>
using namespace std;
const double PI = 3.1415926;
double fgcd(double x,double y)
{
if(y<0.01) return x;
return fgcd(y,fmod(x,y));
}
int main()
{
double a1,b1,a2,b2,a3,b3;
while(~scanf("%lf%lf%lf%lf%lf%lf",&a1,&b1,&a2,&b2,&a3,&b3)){
double n1,n2,n3;
n1 = sqrt((a1-a2)*(a1-a2) + (b1-b2)*(b1-b2));
n2 = sqrt((a1-a3)*(a1-a3) + (b1-b3)*(b1-b3));
n3 = sqrt((a2-a3)*(a2-a3) + (b2-b3)*(b2-b3));
//不给三条边排序会超时,我也不知道为啥。
if(n1 > n2) swap(n1,n2);
if(n2 > n3) swap(n2,n3);
if(n1 > n2) swap(n1,n2);
//求半径
double q = (n1+n2+n3) / 2;
double S = sqrt(q*(q-n1)*(q-n2)*(q-n3));
double R = n1*n2*n3/(4*S);
//用正弦定理求角度
double angle1 = 2*acos((n2*n2 + n3*n3 - n1*n1)/(2*n2*n3));
double angle2 = 2*acos((n1*n1 + n2*n2 - n3*n3)/(2*n1*n2));
double angle3 = 2*PI - angle1 - angle2;
//求最大公约数,是浮点数gcd和fmod
double r = fgcd(angle1,fgcd(angle2,angle3));
//求一个三角形的面积,再求多边形的面积
double s1 = (R*R*sin(r))/2;
double ans = s1*(2*PI/r);
printf("%6lf\n",ans);
return 0;
}
}
printf("%6lf\n",ans);
return 0;
}
}