

#include<iostream>
#include<cmath>
using namespace std;
const double eps=1e-10;
const double limit=1e-10;
struct PT
{
double x,y;
};
struct LN
{
double a,b,c;
};
struct PL
{
int n;
PT p[1501];
};
PL poly,newpoly,tmpoly;
int cas;
int n;
LN getline(PT a,PT b)
{
LN l;
l.a=b.y-a.y;
l.b=a.x-b.x;
l.c=b.x*a.y-a.x*b.y;
return l;
}
PT getinterp(LN l1,LN l2)
{
PT ans;
if(fabs(l1.b)<eps)
{
ans.x=-l1.c/l1.a;
ans.y=(-l2.c-l2.a*ans.x)/l2.b;
}
else
{
ans.x=(l2.c*l1.b-l1.c*l2.b)/(l1.a*l2.b-l2.a*l1.b);
ans.y=(-l1.c-l1.a*ans.x)/l1.b;
}
return ans;
}
double Cha(PT a,PT b,PT c)
{
return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
PT change(PT s,PT e,PT st,double L)
{
PT tmp;
tmp.x=-(e.y-s.y);
tmp.y=e.x-s.x;
double len=sqrt((e.x-s.x)*(e.x-s.x)+(e.y-s.y)*(e.y-s.y));
tmp.x/=len;tmp.x*=L;
tmp.y/=len;tmp.y*=L;
tmp.x+=st.x;
tmp.y+=st.y;
return tmp;
}
bool jud(double h)
{
int i,j;
newpoly=poly;
for(i=0;i<poly.n;i++)
{
tmpoly.n=0;
PT s,e;
s=change(poly.p[i],poly.p[(i+1)%poly.n],poly.p[i],h);
e=change(poly.p[i],poly.p[(i+1)%poly.n],poly.p[(i+1)%poly.n],h);
for(j=0;j<newpoly.n;j++)
{
double r1,r2;
r1=Cha(s,e,newpoly.p[j]);
r2=Cha(s,e,newpoly.p[(j+1)%newpoly.n]);
if(r1>=0)
{
tmpoly.p[tmpoly.n++]=newpoly.p[j];
}
if(r1*r2<0)
{
LN l1=getline(s,e);
LN l2=getline(newpoly.p[j],newpoly.p[(j+1)%newpoly.n]);
PT interp=getinterp(l1,l2);
tmpoly.p[tmpoly.n++]=interp;
}
}
newpoly=tmpoly;
}
if(newpoly.n)
return 1;
return 0;
}
int main()
{
int i,j;
while(1)
{
scanf("%d",&poly.n);
if(!poly.n)
break;
for(i=0;i<poly.n;i++)
scanf("%lf%lf",&poly.p[i].x,&poly.p[i].y);
double left=0,right=100000000;
while(left+limit<right)
{
double mid=(left+right)/2;
if(jud(mid))
left=mid;
else right=mid;
}
printf("%.6lf\n",right);
}
}
方法就是把每條邊向內(nèi)推進(jìn)R,對(duì)得到的新的邊集進(jìn)行半平面交,看是否得到空集。
R用二分枚舉得到。
半平面交用的O(n^2)的。