CF 614C. Peter And Snow Blower 点到多边形的最短距离

该博客介绍了如何计算一个定点与围绕它旋转的多边形的最短和最远距离,从而得到旋转一周的面积。通过向量积和点到边的最短距离计算,确定了多边形的最短距离mn和最远距离mx,并使用这些值计算出面积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给出一个定点和一个n个点的多边形.
现在将这个多边形绕着定点旋转一圈.问这一圈的面积为多少?


多边形绕定点旋转 相等于多变形内所有的点绕定点旋转一圈.
设多边形上离顶点最远和最短的距离为mx,mn 那么答案显然为pi*(mx^2-mn^2)


mx为定点到多边形顶点的最远距离,mn为定点到多边形的边的最短距离
mn利用向量积来求,注意定点到边的垂足是否在边的延长线上.

#include <bits/stdc++.h>
using namespace std;
typedef long double db;
const int N=1e6+5;
const db pi=acos(-1.0);
db n,x,y;
struct point{ 
	db x,y;
	point(db vx,db vy)
	{
		x=vx,y=vy;
	}
	point()
	{} 
}p[N];
point operator-(const point&v1,const point&v2)
{
	return point(v2.x-v1.x,v2.y-v1.y);
}
db product(point a,point b)
{
	return a.x*b.y-a.y*b.x;
}
db dot(point a,point b)
{
	return a.x*b.x+a.y*b.y;
}
db dis(point a,point b)
{
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n;
	for(int i=0;i<=n;i++)
		cin>>p[i].x>>p[i].y;
	db mn=1e18,mx=0;
	for(int i=1;i<=n;i++)
	{
		int j=(i==n?1:i+1);
		mx=max(mx,dis(p[0],p[i])); 
		point ap=p[0]-p[i],ab=p[j]-p[i];
		point ba=p[i]-p[j],bp=p[0]-p[j];
		if(dot(ap,ab)<0)
		{
			mn=min(mn,dis(p[0],p[i]));
			continue;
		}
		if(dot(ba,bp)<0)
		{
			mn=min(mn,dis(p[0],p[j]));
			continue;
		}
		db s=fabs(product(ap,ab))/dis(p[i],p[j]);
		mn=min(mn,s);
	}
	db res=pi*(mx*mx-mn*mn);
	cout<<fixed<<setprecision(15)<<res<<'\n';
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值