给定 \(3\) 个点,求以这 \(3\) 个点为顶点的正多边形面积最小值。
先以这张图为例,首先可以肯定圆的半径是确定的。
根据秦九韶公式,有 \(S_{\triangle ABC}=\sqrt{p(p-a)(p-b)(p-c)},p=\frac{a+b+c}{2}\) 。那么就可以求出三角形面积。
因为 \(S_{\triangle ABC}=\frac{ab\sin C}{2}\) ,三角形外接圆半径 \(R=\frac{c}{2\sin C}\) (正弦定理)得到 \(R=\frac{abc}{4S_{\triangle ABC}}\) 。
当内接圆 \(R\) 一定时,只有当多边形边数小时才能使面积小,若求出 \(\angle AOB,\angle AOC,\angle BOC\) (注意,这里的三个角并不都小于 \(180^{\circ}\) ,而是满足三角相加等于 \(360^{\circ}\) ),那么求出他们之间的 \(gcd\) 得到的角度 \(t\) 就是满足条件的最大角度(即 \(\frac{2\pi}{t}\) 边形),最后求多边形面积就是 \(\frac{2\pi}{t}\) 个面积为 \(\frac{R^2\sin t}{2}\) 个三角形面积之和,所以答案就是 \(\frac{\pi R^2\sin t}{t}\) 。
问题来到了如何求出三个角的度数,根据余弦定理可得 \(\cos A=1-\frac{a^2}{2R^2}\) ,其他同理。
#include<bits/stdc++.h>
using namespace std;
double Pi=acos(-1.0),esp=1e-2;
double ax,ay,bx,by,cx,cy,p,s,abl,acl,bcl,r,t,aa,bb,cc;
double gcd(double A,double B){
return ((fabs(B)<esp)?A:gcd(B,fmod(A,B)));
}
int main(){
scanf("%lf %lf %lf %lf %lf %lf",&ax,&ay,&bx,&by,&cx,&cy);
abl=sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
acl=sqrt((ax-cx)*(ax-cx)+(ay-cy)*(ay-cy));
bcl=sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by));
p=(abl+acl+bcl)/2.0;
s=sqrt(p*(p-abl)*(p-acl)*(p-bcl));
r=(abl*bcl*acl)/(4.0*s);
aa=acos(1-(abl*abl)/(2.0*r*r));
bb=acos(1-(acl*acl)/(2.0*r*r));
cc=2*Pi-aa-bb;
t=gcd(aa,gcd(bb,cc));
printf("%lf\n",(Pi*r*r*sin(t))/t);
}
标签:Ancient,frac,angle,double,Circus,CF1C,triangle,pi,sin
From: https://www.cnblogs.com/zhouzizhe/p/16639280.html