题意:按顺时针给出n个点,n<=1e3,组成的凸多边形,求出最大的D,使得任意点按任意方向移动不超过D后,n个点依然组成凸多边形.
凸多边形:内角都<=180,
问题转化一下:求最小D使得多边形non-convex,则改变一个内角,使得它>180
由下图(来自Codeforces题解)知道,答案为:min(点B->直线AC距离的1/2) ,改变的是内角,则ABC为连续的三点
计算点B到直线AC距离用到叉积 d=AB叉积AC/|AC| (四边形面积/底)
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+20;
const double eps=1e-10;
const double PI=acos(-1.0);
struct point{
double x,y;
}p[N];
double length(point p1,point p2)
{
double dx=p1.x-p2.x;
double dy=p1.y-p2.y;
return sqrt(dx*dx+dy*dy);
}
double cross(point p0,point p1,point p2)
{
return abs((p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x));
}
int main()
{
int n;
while(cin>>n)
{
for(int i=1;i<=n;i++)
cin>>p[i].x>>p[i].y;
double ans=1e15;
for(int i=1;i<=n;i++)
{
int j=i-1,k=i+1;
if(j==0)
j=n;
if(k==n+1)
k=1;
double res=cross(p[j],p[i],p[k]);
double val=length(p[j],p[k]);//
ans=min(ans,res/val);
}
printf("%.10lf\n",ans/2.0);
}
return 0;
}