UVALive 3890 Most Distant Point from the Sea(凸包最大内接圆)
来源:互联网 发布:水手怕水 知乎 编辑:程序博客网 时间:2024/06/09 14:31
一个n个点的凸多边形,求多边形中离多边形边界最远的距离。实际上就是求凸包最大内接圆的半径。
利用半平面交求解,每次二分枚举半径d,然后将凸包每条边所代表的半平面沿其垂直单位法向量平移d,看所有平移后的半平面的交集是否为空。
#include<algorithm>#include<iostream>#include<cstring>#include<cstdlib>#include<fstream>#include<sstream>#include<bitset>#include<vector>#include<string>#include<cstdio>#include<cmath>#include<stack>#include<queue>#include<stack>#include<map>#include<set>#define FF(i, a, b) for(int i=a; i<b; i++)#define FD(i, a, b) for(int i=a; i>=b; i--)#define REP(i, n) for(int i=0; i<n; i++)#define CLR(a, b) memset(a, b, sizeof(a))#define debug puts("**debug**")#define LL long long#define PB push_back#define eps 1e-10using namespace std;struct Point{ double x, y; Point (double x=0, double y=0):x(x), y(y) {}};typedef Point Vector;Vector operator + (Vector A, Vector B) { return Vector(A.x + B.x, A.y + B.y); }Vector operator - (Vector A, Vector B) { return Vector(A.x - B.x, A.y - B.y); }Vector operator * (Vector A, double p) { return Vector(A.x*p, A.y*p); }Vector operator / (Vector A, double p) { return Vector(A.x/p, A.y/p); }bool operator < (const Point& a, const Point& b){ return a.x < b.x || (a.x == b.x && a.y < b.y);}int dcmp(double x){ if(fabs(x) < eps) return 0; return x < 0 ? -1 : 1;}bool operator == (const Point& a, const Point& b){ return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0;}double Dot(Vector A, Vector B) { return A.x*B.x + A.y*B.y; }double Length(Vector A) { return sqrt(Dot(A, A)); }double Angel(Vector A, Vector B) { return acos(Dot(A, B) / Length(A) / Length(B)); }double Cross(Vector A, Vector B) { return A.x*B.y - A.y*B.x; }double Area2(Vector A, Vector B, Vector C) { return Cross(B-A, C-A); }Vector Normal(Vector a) //a向量的垂直法向量{ return Vector(-a.y/Length(a), a.x/Length(a));}struct Line{ Point p; Vector v; double ang; Line() {} Line(Point p, Vector v): p(p), v(v) {ang = atan2(v.y, v.x); } bool operator < (const Line& L) const { return ang < L.ang; }};//点p在半平面的左边bool onLeft(Line L, Point p) { return Cross(L.v, p-L.p) > 0; }//直线交点Point GetIntersection(Line a, Line b){ Vector u = a.p-b.p; double t = Cross(b.v, u) / Cross(a.v, b.v); return a.p + a.v*t;}const int maxn = 200;Point p[maxn], poly[maxn];Line L[maxn];Vector v[maxn], v2[maxn];int n;//半平面交Point pp[maxn];Line qq[maxn];int HalfplaneIntersection(Line* L, int n, Point* poly){ sort(L, L+n); int first, last; qq[first=last=0] = L[0]; FF(i, 1, n) { while(first < last && !onLeft(L[i], pp[last-1])) last--; while(first < last && !onLeft(L[i], pp[first])) first++; qq[++last] = L[i]; if(fabs(Cross(qq[last].v, qq[last-1].v)) < eps) { last--; if(onLeft(qq[last], L[i].p)) qq[last] = L[i]; } if(first < last) pp[last-1] = GetIntersection(qq[last-1], qq[last]); } while(first < last && !onLeft(qq[first], pp[last-1])) last--; if(last-first <= 1) return 0; pp[last] = GetIntersection(qq[last], qq[first]); int m = 0; FF(i, first, last+1) poly[m++] = pp[i]; return m;}int main(){ while(scanf("%d", &n), n) { REP(i, n) scanf("%lf%lf", &p[i].x, &p[i].y); REP(i, n) { v[i] = p[(i+1)%n]-p[i]; v2[i] = Normal(v[i]); } double l=0, r=20000, mid; while(r - l > eps) { mid = (l+r) / 2.0; REP(i, n) L[i] = Line(p[i]+v2[i]*mid, v[i]); int m = HalfplaneIntersection(L, n, poly); if(!m) r=mid; else l=mid; } printf("%.6f\n", l); } return 0;}
- UVALive 3890 Most Distant Point from the Sea(凸包最大内接圆)
- [凸包最大内接圆 二分 半平面交] POJ 3525 Most Distant Point from the Sea
- (2分+半平面交) Most Distant Point from the Sea UVALive 3890
- Uvalive 3890 Most Distant Point from the Sea(半平面交+二分)
- 1396 - Most Distant Point from the Sea
- POJ3525-Most Distant Point from the Sea
- uva1396 Most Distant Point from the Sea
- POJ3525 Most Distant Point from the Sea
- Most Distant Point from the Sea POJ
- Most Distant Point from the Sea - POJ 3525 求多边形最大内接圆半径
- POJ 3525 || Most Distant Point from the Sea (凸包求最大内接圆,半平面交内推r
- POJ 3525 Most Distant Point from the Sea (半平面交+二分求最大内切圆)
- PKU 3525 Most Distant Point from the Sea
- poj 3525 Most Distant Point from the Sea
- UVA 1396 Most Distant Point from the Sea
- POJ 3525 Most Distant Point from the Sea
- poj 3525 Most Distant Point from the Sea
- POJ 3525 Most Distant Point from the Sea
- CSDN的SDCC大会(2013)中使用的PPT分享
- QT 5.0.2 VS2010开发环境搭建
- C#抽象类
- 榜单
- boost::asio 的同步方式
- UVALive 3890 Most Distant Point from the Sea(凸包最大内接圆)
- 在python中引入rabbitmq消息中间件
- python学习九:SocektServer学习、bisect、list的sort详解、清空字典的两种方法、zip初探
- boost::asio的异步方式
- NOSQL启蒙: What? Why? When?
- 你必须非常努力,才能看起来毫不费力
- Codeforces Round #147 (Div. 2) / 237A Free Cash (模拟)
- 解结构体、类等内存字节对齐
- 我神圣的2,3,5