CodeForces 614C Peter and Snow Blower

本文介绍了一种简单计算几何的方法,通过计算圆心到多边形上各点及边的最短与最长距离来求解特定几何问题。主要利用点到点距离公式和点到线段最近距离公式进行计算。

简单计算几何,只要算出圆心到多边形上的最短距离和最长距离即可

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const int maxn=100000+10;
struct Point
{
    double x,y;
} p[maxn];
double a,b;
int n;

double GetPointDistance(Point p1, Point p2)
{
    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}

double GetNearestDistance(Point PA, Point PB, Point P3)
{
    double a,b,c;
    a=GetPointDistance(PB,P3);
    if(a<=0.00001) return 0.0f;
    b=GetPointDistance(PA,P3);
    if(b<=0.00001) return 0.0f;
    c=GetPointDistance(PA,PB);
    if(c<=0.00001) return a;
    if(a*a>=b*b+c*c) return b;
    if(b*b>=a*a+c*c) return a;
    double l=(a+b+c)/2;
    double s=sqrt(l*(l-a)*(l-b)*(l-c));
    return 2*s/c;
}

int main()
{
    double Max=-1;
    double Min=-1;
    scanf("%d%lf%lf",&n,&a,&b);
    Point T;
    T.x=a;
    T.y=b;
    for(int i=0; i<n; i++) scanf("%lf%lf",&p[i].x,&p[i].y);
    for(int i=0; i<n; i++)
    {
        double MinLen=GetNearestDistance(p[(i+1)%n],p[i],T);
        if(Min==-1) Min=MinLen;
        else Min=min(Min,MinLen);

        double Len1=sqrt((p[i].x-a)*(p[i].x-a)+(p[i].y-b)*(p[i].y-b));
        double Len2=sqrt((p[(i+1)%n].x-a)*(p[(i+1)%n].x-a)+(p[(i+1)%n].y-b)*(p[(i+1)%n].y-b));
        double MaxLen=max(Len1,Len2);
        if(Max==-1) Max=MaxLen;
        else Max=max(Max,MaxLen);
    }

    printf("%lf\n",3.1415926*(Max*Max-Min*Min));
    return 0;
}

 

转载于:https://www.cnblogs.com/zufezzt/p/5141842.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值