題意:給出正多邊形的三個頂點,求正多邊形的最小面積;
思路:
海倫公式: p=(a+b+c)/2,S=√p(p-a)(p-b)(p-c)(a,b,c爲三角形的三邊,S爲三角形面積)
1.求外接圓半徑r=a*b*c/4S
2.由余弦定理求出三個圓心角num[3]
(要注意的是,當三個點在同一段半圓弧上時,這時第三個圓心角應該用2π-num[0]-num[1],防止麻煩直接就令num[2]=2π-num[0]-num[1])
3.求這三個角的最大公約數爲A, 那麼這就是一個正2π/A邊形.
4.三角形的面積S=1/2·r * r * sinA
5.2π/A*S即爲所求.
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<map>
#include<queue>
#include<cmath>
#include<stack>
#include<vector>
#include<cstdio>
#define MAXN 33000
#define INF 0x3f3f3f3f
#define lmid l,m,rt<<1
#define rmid m+1,r,rt<<1|1
#define ls rt<<1
#define rs rt<<1|1
#define Mod 1000000007
#define i64 __int64
#define LIMIT_ULL 100000000000000000
using namespace std;
const double PI = 3.1415926535;
double fgcd(double a,double b)
{
if(b<=0.01)
return a;
return fgcd(b,fmod(a,b));
}
double num[3];
int main()
{
double a,b,c,d,e,f;
scanf("%lf %lf %lf %lf %lf %lf",&a,&b,&c,&d,&e,&f);
double A=sqrt((a-c)*(a-c)+(b-d)*(b-d));
double B=sqrt((e-c)*(e-c)+(f-d)*(f-d));
double C=sqrt((a-e)*(a-e)+(b-f)*(b-f));
double S=(A+B+C)/2;
double SUM=sqrt(S*(S-A)*(S-B)*(S-C));
double R=(A*B*C)/(4*SUM);
num[0]=A,num[1]=B;
for (int i=0;i<3;i++) num[i]=acos(1-num[i]*num[i]/(2*R*R));
num[2]=2*PI-num[0]-num[1];
double gcd=0;
for(int i=0;i<3;i++)
{
gcd=fgcd(num[i],gcd);
}
//cout<<A<<" "<<B<<" "<<C<<" "<<S<<endl;
//cout<<SUM<<" "<<R<<" "<<gcd<<endl;
printf("%.6f\n", R*R*sin(gcd)*PI/gcd);
}