半平面交总结and模板
博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/40859973
这两天刷了POJ上几道半平面交,对半平面交有了初步的体会,感觉半平面交还是个挺有用的知识点。
半平面交主要是看的ZZY的国家队论文,他提出的是一种O(n×log(n))的排序增量法。
附论文地址: 算法合集之《半平面交的新算法及其有用价值》。
题目大意:
World finals 要開始了,比赛场地是一个多边形。裁判跟教练坐在多边形的边上,问场地里是不是存在一个区域使得这个区域内的每一个点都能看到多边形边上的计分板。
解题思路:
非常单纯的推断多边形的核是不是存在。
题目大意:
一个360度摄像头。给你一个多边形。问多边形中是否存在一个区域。将摄像头放进去能够监控整个多边形区域。
解题思路:
相同的半平面交推断多边形是否存在核。
POJ 3130 How I Mathematician Wonder What You Are!
题目大意:
给出星型的定义:一个多边形F是星形的条件是有一点C∈F,随意点P∈F。线段CP都在多边形F内。
给出一个多边形。推断他是不是一个星型。
解题思路:
一样的求多边形的核是否存在。
题目大意:
给出一个画廊(不一定是凸多边形),找到一块区域。使得这块区域内的每一个点都能看到整个画廊。求出这块区域的面积。
解题思路:
半平面交求多边形的核,须要求核的面积。
id=2451">POJ 2451 Uyuw's Concert
题目大意:
在一个10000*10000的正方形内举办演唱会,中间会有一些警戒线,舞台仅仅能布置在全部警戒线的左側,给定一些线段,问最后舞台的面积是多少。
解题思路:
这是zzy当初为他半平面交排序增量法而出的一个题。可是后来POJ改过数据,所以O(n*n)的算法也是能够过去的。
事实上还是一个半平面交,求交出来的面积的问题。
半平面交的题就做了差点儿相同这些,主要还是看出来题目类型是求半平面交就能够了,剩下的就好说了。
因为题目都差点儿相同,代码没有太大的变化,所以就仅仅贴一个代码了。
POJ 2451 的AC代码,能够当做模板来用了,当时还由于数组开小了而WA了10多遍。。。。。。为什么不给我返回个RE。。!
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
const double eps = 1e-8;
const int maxn = 20010; int tail, head, it;
struct Point {
double x, y;
} P[maxn];
struct Line {
Point a, b;
double angle;
void getAngle() {angle = atan2(b.y-a.y, b.x-a.x);}
} L[maxn], deq[maxn]; int dcmp(double x) {
return x < -eps ? -1 : x > eps;
}
double xmult(Point a, Point b, Point c) {
return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x);
}
bool cmp(Line u, Line v) {
int d = dcmp(u.angle-v.angle);
if(d) return d > 0;
return dcmp(xmult(u.a, v.a, v.b)) > 0;
///Clockwise:大于0取向量左半部分为半平面,小于0。取右半部分
}
Point intersection(Line u, Line v)
{
Point ret = u.a;
double t = ((u.a.x-v.a.x)*(v.a.y-v.b.y)
-(u.a.y-v.a.y)*(v.a.x-v.b.x))
/ ((u.a.x-u.b.x)*(v.a.y-v.b.y)
-(u.a.y-u.b.y)*(v.a.x-v.b.x));
ret.x += (u.b.x-u.a.x)*t, ret.y += (u.b.y-u.a.y)*t;
return ret;
}
bool judge(Line l1, Line l2, Line l3) {
Point p = intersection(l2, l3);
return dcmp(xmult(p, l1.a, l1.b)) < 0;
///Clockwise:大于小于符号与上面cmp()中凝视处相反
}
void HPI(Line L[], int n){
sort(L, L+n, cmp);
int tmp = 1;
for(int i = 1; i < n; ++i) {
if(dcmp(L[i].angle-L[tmp-1].angle) != 0) {
L[tmp++] = L[i];
}
}
n = tmp;
deq[0] = L[0], deq[1] = L[1];
head = 0, tail = 1;
for(int i = 2; i < n; ++i) {
while(head < tail && judge(L[i], deq[tail-1], deq[tail]))
tail--;
while(head < tail && judge(L[i], deq[head+1], deq[head]))
head++;
deq[++tail] = L[i];
}
while(head < tail && judge(deq[head], deq[tail-1], deq[tail]))
tail--;
while(head < tail && judge(deq[tail], deq[head+1], deq[head]))
head++;
if(head == tail) return ;
it = 0;
for(int i = head; i < tail; ++i) {
P[it++] = intersection(deq[i], deq[i+1]);
}
if(tail > head+1) {
P[it++] = intersection(deq[head], deq[tail]);
}
}
double getArea(Point p[], int n) {
double area = 0;
for(int i = 1; i < n-1; ++i) {
area += xmult(P[0], P[i], P[i+1]);
}
return fabs(area)/2.0;
} int main()
{
int n;
while(~scanf("%d", &n)) {
n += 4;
L[0] = (Line){(Point){0, 10000}, (Point){0, 0}};
L[1] = (Line){(Point){10000, 10000}, (Point){0, 10000}};
L[2] = (Line){(Point){10000, 0}, (Point){10000, 10000}};
L[3] = (Line){(Point){0, 0}, (Point){10000, 0}};
L[0].getAngle(), L[1].getAngle(), L[2].getAngle(), L[3].getAngle();
for(int i = 4; i < n; ++i) {
scanf("%lf%lf%lf%lf", &L[i].a.x, &L[i].a.y, &L[i].b.x, &L[i].b.y);
L[i].getAngle();
}
HPI(L, n);
printf("%.1f\n", getArea(P, it));
} return 0;
}
半平面交总结and模板的更多相关文章
- 半平面交模板(O(n*n)&& O(n*log(n))
摘自http://blog.csdn.net/accry/article/details/6070621 首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分 ...
- POJ 半平面交 模板题 三枚
给出三个半平面交的裸题. 不会的上百度上谷(gu)歌(gou)一下. 毕竟学长的语文是体育老师教的.(卡格玩笑,别当真.) 这种东西明白就好,代码可以当模板. //poj1474 Video Surv ...
- 再来一道测半平面交模板题 Poj1279 Art Gallery
地址:http://poj.org/problem?id=1279 题目: Art Gallery Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- bzoj 2618 半平面交模板+学习笔记
题目大意 给你n个凸多边形,求多边形的交的面积 分析 题意\(=\)给你一堆边,让你求半平面交的面积 做法 半平面交模板 1.定义半平面为向量的左侧 2.将所有向量的起点放到一个中心,以中心参照进行逆 ...
- [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和
一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson Simpson's Rule: \[ \int ^b_a f(x)dx\approx ...
- POJ 3525 /// 半平面交 模板
题目大意: 给定n,接下来n行逆时针给定小岛的n个顶点 输出岛内离海最远的点与海的距离 半平面交模板题 将整个小岛视为由许多半平面围成 那么以相同的比例缩小这些半平面 一直到缩小到一个点时 那个点就是 ...
- 三道半平面交测模板题 Poj1474 Poj 3335 Poj 3130
求半平面交的算法是zzy大神的排序增量法. ///Poj 1474 #include <cmath> #include <algorithm> #include <cst ...
- bzoj 2618【半平面交模板】
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> usin ...
- 【模板】凸包向内推进求不严格的半平面交——poj3384
想不明白这题写严格的半平面交为什么会错 /* 凸包所有边向内推进r */ #include<iostream> #include<cstring> #include<cs ...
随机推荐
- Windows7在自由的虚拟机(微软官方虚拟机)
Windows7在自由的虚拟机(微软官方虚拟机) 前言: 不是说windows7自带的虚拟机最好用,但他的正式版.免费.只是希望你能windows7用户.它将能够自由使用: 还是Vmware. 微软为 ...
- STL顺序容器【vector】【deque】【list】
我们都知道,stl在集装箱船分为两类,订购集装箱和相关的容器. 顺序容器有三种即动态数组vector,双端队列deque,以及链表list (对csdn的文字排版严重吐槽.写好的版发表了就变了) 一: ...
- 【POJ1741】Tree 树分而治之 模板略?
做广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog. ...
- Python验证码识别处理实例(转)
一.准备工作与代码实例 1.PIL.pytesser.tesseract (1)安装PIL:下载地址:http://www.pythonware.com/products/pil/(CSDN下载) 下 ...
- 小强的HTML5移动开发之路(50)——jquerymobile页面初始化过程
为了方便说明和更加直观的展示jquerymobile的页面初始化过程以及各个事件的触发过程,我绘制了一幅流程图: 图中用红色框圈起来的是界面中的事件,測试代码例如以下: <!DOCTYPE ht ...
- iis虚拟目录引发的路径问题
在iis上把web程序配置成站点是ok的,但配置成虚拟目录,就会发现 图片路径不能,样式不能加载,链接出错. 解决方案: 1,上传图片 ~/upload 2,cs程序,链接跳转,请用~/index. ...
- WPF设置VistualBrush的Visual属性制作图片放大镜效果
原文:WPF设置VistualBrush的Visual属性制作图片放大镜效果 效果图片:原理:设置VistualBrush的Visual属性,利用它的Viewbox属性进行缩放. XAML代码:// ...
- 他们主动布局(autolayout)环境的图像编辑器
hi,all: 在经过了一番犹豫之后.我决定将我自己做的这个小APP的源代码发布给大家: 其出发点是和大家一起学习iOS开发.仅供学习參考之用. 之前代码是托管与gitlab 上的,今天我将其pull ...
- 用友财务总帐(GL)模BI数据ETL分析
业务需求,如下面的: 现在用友总帐一家公司BI分析案例. /* Sql Server2012使用作业设置定时任务,为了保证有一天运行时间 */ /* 意temp1表里一定要保证要有记录,否则以temp ...
- ASP.NET自定义控件组件开发 第一章 第三篇
原文:ASP.NET自定义控件组件开发 第一章 第三篇 第三篇:第一章的完结篇 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待 ...