明显最小正多边形在三角形外接圆上,我们只要求圆心角的一小块,再x份数
且最小就是要边数越多(圆心角越小),可以看出多边形就越接近圆(面积越大)
数据会给三点坐标。三条边就出来了
三条边出来了我们就可以算出每条边对应的圆心角
然后就gcd(圆心角)g
圆心角小份面积
/
份数
#include <bits/stdc++.h>
using namespace std;
const double pi=3.1415926535, ACC=2*pi/100;//这里最小应该这样写,题目说最小100边,圆心角最多100份,太小如1e-6会出错
double x[3],y[3],edge[3],p,tmp,s,r,a,b,c,angle[3],gcdt,sums;
double gcd(double a,double b){
if(fabs(a)<ACC) return b;
if(fabs(b)<ACC) return a;
return gcd(b,fmod(a,b));
}
int main(int argc, char** argv) {
for(int i=0;i<3;i++){
cin>>x[i]>>y[i];
}
for(int i=0;i<2;i++){
edge[i]=sqrt((x[i]-x[i+1])*(x[i]-x[i+1])+(y[i]-y[i+1])*(y[i]-y[i+1]));
p+=edge[i];
}
edge[2]=sqrt((x[2]-x[0])*(x[2]-x[0])+(y[2]-y[0])*(y[2]-y[0]));
p+=edge[2];
p/=2;
tmp=1;
for(int i=0;i<3;i++) tmp*=p-edge[i];
s=sqrt(p*tmp);
r=edge[0]*edge[1]*edge[2]/s/4;
for(int i=0;i<2;i++){
angle[i]=acos(1-edge[i]*edge[i]/2/r/r);
}
angle[2]=2*pi-angle[0]-angle[1];
gcdt=gcd(angle[0],gcd(angle[1],angle[2]));
sums=pi*r*r*sin(gcdt)/gcdt;
printf("%.6lf\n",sums);
return 0;
} 这里注意下double的gcd:gcd(b,a%b)
由于是小于100边的,所以gcd圆心角就应该小于2π/100,如果太小了就会出错:比如本来最小的2π/90,但精度太小gcd变成2π/810
fmod(a,b)就是a/b的余数

京公网安备 11010502036488号