一道几何题,先是海伦定理:三角形三边为a,b,c, 外接圆半径为R;
p=(a+b+c)/2;
S=sqrt( p*(p-a)*(p-b)*(p-c) ) ;
再由正弦定理:S=a*b*c/(4*R); 由 推出。
由上述公式可求出外接圆半径R;
再由余弦定理: 求出三角形中的其中2个边对应的圆心角的大小(即2个半径R和一条三角形边组成的三角形),另外一角可由2pie减去已求出的2角。3角均求出之后,再求3角的最大公约数即为所求最小正多边形的圆心角x,只要求出每个小三角形的面积再乘以多边形边数N(即2pie/x);
利用海伦定理变形:S=a*b*sinC/2;求每个小三角形的面积。
#include<cstdio>
#include<map>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iostream>
#include<set>
#include<string>
#include<queue>
#define PI acos(-1.0)
#define MAX 1005
using namespace std;
double getR(double a,double b,double c){
double p,R,area;
p=(sqrt(a)+sqrt(b)+sqrt(c))/2;
area=p*(p-sqrt(a))*(p-sqrt(b))*(p-sqrt(c));
R=sqrt(a*b*c/area)/4;
return R;
}
double fgcd(double a,double b){
if(fabs(a)<1e-2) return b;
if(fabs(b)<1e-2) return a;
return fgcd(b,fmod(a,b));
}
int main(){
double d[4][3],angle[5],x[4],a,b,c,R,s;
int i;
for(i=1;i<4;i++){
scanf("%lf %lf",&d[i][1],&d[i][2]);
}
a=(d[1][1]-d[2][1])*(d[1][1]-d[2][1])+(d[1][2]-d[2][2])*(d[1][2]-d[2][2]);
b=(d[1][1]-d[3][1])*(d[1][1]-d[3][1])+(d[1][2]-d[3][2])*(d[1][2]-d[3][2]);
c=(d[3][1]-d[2][1])*(d[3][1]-d[2][1])+(d[3][2]-d[2][2])*(d[3][2]-d[2][2]);
R=getR(a,b,c);
x[1]=a,x[2]=b,x[3]=c;
for(i=1;i<3;i++)
angle[i]=acos(1-(x[i+1]/(2*R*R)) );
angle[3]=2*PI-angle[1]-angle[2];
angle[4]=fgcd(angle[1],fgcd(angle[2],angle[3]));
s=R*R*PI*sin(angle[4])/angle[4];
printf("%.6lf\n",s);
return 0;
}