View Code
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; #define eps 1e-8 #define inf 1<<29 struct point { double x, y; }p[105], tp[105], pp[105]; double a, b, c; int n, m; void getline(point p1, point p2) { a = p2.y - p1.y; b = p1.x - p2.x; c = p2.x * p1.y - p2.y * p1.x; } point intersect(point p1, point p2) { double u = fabs(a * p1.x + b * p1.y + c); double v = fabs(a * p2.x + b * p2.y + c); point ret; ret.x = (v * p1.x + u * p2.x) / (u + v); ret.y = (v * p1.y + u * p2.y) / (u + v); return ret; } void cut() { int i, tm = 0; for(i = 1; i <= m; i++) { if( a * pp[i].x + b * pp[i].y + c <= 0) tp[++tm] = pp[i]; else { if(a * pp[i-1].x + b * pp[i-1].y + c < 0) tp[++tm] = intersect(pp[i-1], pp[i]); if(a * pp[i+1].x + b * pp[i+1].y + c < 0) tp[++tm] = intersect(pp[i], pp[i+1]); } } for(i = 1; i <= tm; i++) pp[i] = tp[i]; pp[0] = pp[tm]; pp[tm+1] = p[1]; m = tm; } bool solve(double mid) { int i; for(i = 1; i <= n; i++) pp[i] = p[i]; pp[0] = pp[n]; pp[n+1] = pp[1]; p[n+1] = p[1]; m = n; for(i = 1; i <= n; i++) { getline(p[i], p[i+1]); c += mid * sqrt(a * a + b * b); cut(); if(m == 0) break; } return m > 0; } int main() { int i; while( ~scanf("%d", &n) && n) { for(i = 1; i <= n; i++) scanf("%lf%lf", &p[i].x, & p[i].y); double l = 0, r = inf; while(r - l >= 1e-6) { double mid = (l + r)/2; if( solve(mid) ) l = mid; else r = mid; } printf("%.6f\n", l); } return 0; }