题目灰常简单粗暴,给你两个不同的点,求穿过这两个点的最小面积的正多边形。
输入数据,点A,点B,N;
输出最小正多边形的面积。
思维转换,两点一条线段,正多边形包含这条线段,而正多边形要最小,说明这条线段是这个正多边形的两点距离最远。
当多边形为偶数个顶点,AB的距离就是外界圆的直径,
当N为奇数顶点, 算出 2N 的正多边形的内角
如图右,<NML 是2N正多边形内角的一半,在直角 LNM 三角形中,LN为AB的距离,LM为外接圆半径,三角函数一下就好了。
今晚做了两题这题推的最顺利 : ) 感觉这题毫无算法可言,就是慢慢在纸上推。。
多边形面积,S = R * R * sin(p) * n * 0.5
R :外接圆半径, P:正多边形每条边所对应的角度,N:边数
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
double PI = acos(-1.0);
int main()
{
int n;
double x1,x2,y1,y2,d,r,p,area;
while(~scanf("%lf %lf %lf %lf %d",&x1,&y1,&x2,&y2,&n) && n)
{
d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))/2.0;
if(n&1)
{
int m = 2*n;
p=PI*(m-2)/m/2.0;
r=d/sin(p);
}
else
r=d;
p=2.0*PI/n;//正多边形所对的每个角的角度
area=r*r*sin(p)*n *0.5;//正多边形面积 S = r*r * sin(p) * n *0.5 ( r 为外界圆半径
printf("%.6f\n",area);
}
}