Sample Input
0 0 1 1 4
1 2 3 4 5
2 3 4 5 6
0 0 0 0 0
Sample Output
1.000000
5.257311
5.196152
给出两个点的坐标以及整数 n,求穿过这两个点的面积最小的正n边形
要求面积最小,根据贪心这条边一定是最长的一条对角线
将这个正 n 边形放到圆内,360 被分成了 n 分,每份记为 x°,我们只要知道这个圆的半径 r 之后就可以求得这个 n 边形的面积
- n 为偶数的时候,r 就是这两点之间的距离的一半
- n 为奇数时,设这两点之间的距离为 d,那么半径 ,这是当 n=5 的时候
- 如下图所示,我们需要计算 ∠AOB 的一半,所以:
- 再正 n 边形中,AC 垂直于 BD,那么 ∠AOB=pi-x/2
- 所以
int n,m,t;
struct Point
{
double x,y;
Point(double x=0,double y=0):x(x),y(y){}
};
typedef Point Vector;
Vector operator-(Vector a,Vector b){ return Vector(a.x-b.x,a.y-b.y); }
double Dot(Vector a,Vector b){ return a.x*b.x+a.y*b.y; }
double length(Vector a){ return sqrt(Dot(a,a)); }
int main()
{
//IOS;
Point a,b;
while(~sff(a.x,a.y)){ sff(b.x,b.y); sd(n);
if(n==0) break;
double d=length(a-b);
double rad=2*pi/n;
double r=d/2;
if(n&1){
double sita=pi-rad/2;
r=d/2/sin(sita/2);
}
double ans=n*sin(rad)*r*r/2;
printf("%lf\n",ans);
}
//PAUSE;
return 0;
}