题意:给出一个定点和一个n个点的多边形.
现在将这个多边形绕着定点旋转一圈.问这一圈的面积为多少?
多边形绕定点旋转 相等于多变形内所有的点绕定点旋转一圈.
设多边形上离顶点最远和最短的距离为mx,mn 那么答案显然为pi*(mx^2-mn^2)
mx为定点到多边形顶点的最远距离,mn为定点到多边形的边的最短距离
mn利用向量积来求,注意定点到边的垂足是否在边的延长线上.
现在将这个多边形绕着定点旋转一圈.问这一圈的面积为多少?
多边形绕定点旋转 相等于多变形内所有的点绕定点旋转一圈.
设多边形上离顶点最远和最短的距离为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;
}