UVA 12300 || Smallest Regular Polygon(给定两点,求穿过两点的最小正多边形

题目灰常简单粗暴,给你两个不同的点,求穿过这两个点的最小面积的正多边形。

输入数据,点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);
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值