UVA12300 Smallest Regular Polygon(计算几何基础)

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,那么半径   r=\frac{\frac{d}{2}}{sin(x)},这是当 n=5 的时候
  • 如下图所示,我们需要计算 ∠AOB 的一半,所以:
  •  再正 n 边形中,AC 垂直于 BD,那么 ∠AOB=pi-x/2
  • 所以    r=\frac{\frac{d}{2}}{sin(\frac{\angle AOB}{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;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值