POJ 1474 Video Surveillance
2012-02-19 16:16
316 查看
POJ_1474
对于半平面交的一些简明扼要的介绍可以参考这篇博客:http://blog.csdn.net/accry/article/details/6070621。此外,这篇博客上介绍的还有我敲出的程序都只是比较好理解的O(n^2)的求半平面交的算法,对于O(nlogn)的算法可以参考朱泽园的论文。
由于这个题目指明了多边形上的点是按顺时针序给出的,因而就不用再将每组数据都其统一成某个顺序了。
POJ上这个题目INF不宜开太大,开太大比如0x3f3f3f3f会WA,但在ZOJ就没事,计算几何的精度问题太玄妙了,所以只好自己把握尺度啦。
对于半平面交的一些简明扼要的介绍可以参考这篇博客:http://blog.csdn.net/accry/article/details/6070621。此外,这篇博客上介绍的还有我敲出的程序都只是比较好理解的O(n^2)的求半平面交的算法,对于O(nlogn)的算法可以参考朱泽园的论文。
由于这个题目指明了多边形上的点是按顺时针序给出的,因而就不用再将每组数据都其统一成某个顺序了。
POJ上这个题目INF不宜开太大,开太大比如0x3f3f3f3f会WA,但在ZOJ就没事,计算几何的精度问题太玄妙了,所以只好自己把握尺度啦。
#include<stdio.h> #include<string.h> #define MAXD 210 #define zero 1e-8 #define INF 100000 struct point { double x, y; }p[MAXD], wa[MAXD], wb[MAXD], *a, *b; int N, na, nb; double det(double x1, double y1, double x2, double y2) { return x1 * y2 - x2 * y1; } double fabs(double x) { return x < 0 ? -x : x; } int dcmp(double x) { return fabs(x) < zero ? 0 : (x < 0 ? -1 : 1); } void init() { int i, j, k; for(i = 0; i < N; i ++) scanf("%lf%lf", &p[i].x, &p[i].y); p = p[0]; } void add(double x, double y) { b[nb].x = x, b[nb].y = y; ++ nb; } void cut(int k) { int i, j, nt; point *t; double x, y, t1, t2; nb = 0; for(i = 0; i < na; i ++) { t1 = det(p[k + 1].x - p[k].x, p[k + 1].y - p[k].y, a[i].x - p[k].x, a[i].y - p[k].y); t2 = det(p[k + 1].x - p[k].x, p[k + 1].y - p[k].y, a[i + 1].x - p[k].x, a[i + 1].y - p[k].y); if(dcmp(t1) <= 0) add(a[i].x, a[i].y); if(dcmp(t1) * dcmp(t2) < 0) { x = (fabs(t2) * a[i].x + fabs(t1) * a[i + 1].x) / (fabs(t1) + fabs(t2)); y = (fabs(t2) * a[i].y + fabs(t1) * a[i + 1].y) / (fabs(t1) + fabs(t2)); add(x, y); } } t = a, a = b, b = t; nt = na, na = nb, nb = nt; a[na] = a[0]; } void solve() { int i, j, k; a = wa, b = wb; na = 4; a[0].x = -INF, a[0].y = -INF, a[1].x = -INF, a[1].y = INF, a[2].x = INF, a[2].y = INF, a[3].x = INF, a[3].y = -INF; a[na] = a[0]; for(i = 0; i < N; i ++) cut(i); if(na == 0) printf("impossible.\n"); else printf("possible.\n"); } int main() { int t = 0; for(;;) { scanf("%d", &N); if(!N) break; init(); printf("Floor #%d\nSurveillance is ", ++ t); solve(); printf("\n"); } return 0; }
相关文章推荐
- 半平面交入门 poj 3335 poj 1474 poj 1279 半平面交模板
- POJ 1474 多边形的核(半平面交)
- POJ 1474 半平面交
- POJ 1474 Video Surveillance 半平面交求多边形是否有核
- poj 1474 Video Surveillance 半平面交
- poj1474(半平面交)
- [POJ1474]Video Surveillance(半平面交)
- POJ 1474
- ●poj 1474 Video Surveillance
- Video Surveillance POJ - 1474
- poj 1474 Video Surveillance (半平面交)
- poj 3335 && poj 3130 && poj 2451 && poj 1474(n(logn)求解半平面交)
- poj 1474 Video Surveillance (半平面交)
- bsoj 1850 【POJ1474】监控摄像头
- POJ 1474 ZOJ 1248 HDU 1469 Video Surveillance 半平面交
- POJ 1474 Video Surveillance 半平面交
- poj 1474 Video Surveillance 【半平面交】
- POJ 1474 Video Surveillance
- POJ 1474 Video Surveillance 笔记
- POJ 1474 Video Surveillance(判断多边形是否有核)