计算几何
Glory_g
明日之我胸中有沟壑,立马振山河
展开
-
计算几何小结 我对计算几何的理解以及叉积和点积
关于计算几何 : 在我看来计算几何不同于解析几何,解析几何注重用代数的方法解决几何问题,太暴力将几何中一些优美的位置关系都给忽略了,都是通过代数解决,不够优美,而计算几何更加注重点和点、线和线、点和线的关系,通过位置关系转化成向量的一些运算,相比于解析几何,不仅仅突出了几何关系的优美,并且通过几何关系简化了一些无用的运算提高了计算的精度。叉积 : 是一种用来判断两个向量的位置关原创 2017-09-13 16:36:00 · 1293 阅读 · 0 评论 -
POJ 3335 判断一个多边形是否存在核
什么是多边形的核呢 ? 多边形的核是一个点的集合,在这个集合里面的所有的点与多边形上所有的点的连线都在多边形的内部。 就是说从这个点可以看到多边形上所有的点。多边形的核应该怎么求呢 ?首先有一个结论就是 : 能看到一条完整直线的点分布在直线的一侧,这样的话我们就可以求所有线段的一侧 (相当于直线的一侧) 就是看半平面是否有交点就可以了。注意 :求是否存在核不能用面积等于0去判断,因为半平面交可原创 2017-09-19 11:17:44 · 422 阅读 · 0 评论 -
POJ 1755 判断线性区域是否存在可行区域
题意 : 给你每个人在每一段的速度,让你求出是否存在一种路程的安排使得这个人可以赢得这场比赛题解 :可以去列方程组,然后发现是一个三维的变元,但是发现有一个变元,可以除过去就成了一个二元方程就是一个二维平面然后判断一个线性方程式组是否存在可行域.发一个求线性区域的可行区域的模版 #include <iostream>#include <algorithm>#include <cstring>#原创 2017-09-27 20:56:18 · 258 阅读 · 0 评论 -
poj 2540 求半平面交
题意 : 给你n 个点和一个标志,告诉你离这个点远了还是近了,让你求出那个点的可能位置。题解 : 不难发现其实每一个点对应这一条垂直平分线然后看看这个区域有多大就可以了。#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <cmath>#include <string>usi原创 2017-09-27 23:01:07 · 192 阅读 · 0 评论 -
POJ 1375 求圆外一点引圆的切线
关键在于对问题的思考,要画图找出几何关系不要用解析几何方法做 (精度不够) 计算几何的微妙之处也在于几何位置关系和角度而不是用解析几何算 画个图 就可以了 #include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <cmath>using namespace std;const原创 2017-09-28 11:55:45 · 1038 阅读 · 0 评论 -
POJ 3525 Most Distant Point from the Sea
题意 :给你一个小岛,是一个凸多边形,问你这个多边形的内部的点到所有边的最小值最大。题解 :对于最小值最大的问题,不难想到要用二分去做,不难发现这个题的距离是满足二分性质的,然后将每天边向内部缩 dist 怎么缩呢 ? (通过一天边旋转90 度 就可以了) 。由于这个题给你的是一个凸多边形所以剩下的就可以用半平面交解决了,如果半平面交存在,那么这个答案检验就是可以的。emmm……. 剩下的就是半平面原创 2017-09-20 18:35:03 · 207 阅读 · 0 评论 -
POJ 3384 Feng Shui(半平面交)
题意 : 给你一个凸多边形,让你在其中找两个圆,使得圆的覆盖面积最大。这个题目和 poj 3525 有点类似,那个题目是一个圆,想到两者的联系,可以发现两个圆覆盖面积最大就是重叠面积最小,怎样使得重叠面积最小呢 ? 肯定就是两个圆心的圆心距最大,这样就可以了,先将边向内部缩 R (半径大小)求一个半平面交,然后在半平面交上找到距离最远的两个点就可以了。#include <algorithm>#in原创 2017-09-20 19:55:46 · 198 阅读 · 0 评论 -
POJ 3608 求两个凸包之间的最小距离
题解 :首先我们要知道一种遍历所有对踵点的算法 : 就是用旋转卡壳加上叉积判断是否旋转的一种算法。 剩下的就是求对踵点了 因为我们不难发现,对于两个凸包来说,他们之间的最小距离肯定在对踵点上。然后我们就可以去便利所有的对踵点这样同时保留最小距离这样就可以了。注意求一个线段到另一条线段的最小距离应该用点积去算就好了 还有我们需要深入理解关于旋转卡壳的几个有关的概念 1. 支撑线 2. 对原创 2017-10-01 21:04:16 · 1496 阅读 · 0 评论 -
旋转卡壳伪代码
旋转卡壳 伪代码begin begin p0 := pn; q := next[p]; while (Area (p,next[p],nxet[q]) > Area (p,next[p],q)) do // 有向面积 q := next[q]; // q 转动 q0 := q; while (q != p0) do原创 2017-10-02 12:47:45 · 279 阅读 · 0 评论 -
POJ 2079 求最大三角形面积
题解 :这个题目的关键之处在于你要发现这个一个凸包,然后许多东西在凸包上面就有了单调性,旋转卡壳就是用了这个道理才得以实现。 我们发现对于每一个 i j 来说 k 都是单调的这样我们就可以通过枚举i j 利用 k 的单调性 使得时间复杂度降到 n ^ 2 凸包的优美性质啊 单调性 然后就是旋转卡壳了#include <iostream>#include <cstdio>#includ原创 2017-10-02 13:32:15 · 207 阅读 · 0 评论 -
HDU 6158 圆的反演
上一篇介绍了院的反演,这一篇就是一道网络赛圆的反演的题目。其实感觉这道题目有点…. 感觉它卡的东西不是太好 反正计算几何你一定要注意精度问题。emmmm…… 这个题目就是圆的反演,你只需要找对里面的几何关系就好了注意由于反演 中具有一一对应的性质,只有原来相交的点到后面才会可能相交,剩下的就是圆的反演了 (这个东西没有模版).#include <iostream>#include <algori原创 2017-10-05 14:28:52 · 243 阅读 · 0 评论 -
HDU 4773 反演变换
为什么能想到反演,关键就在于这个题的p 是圆上的一点,这就说明这个题目可能用反演去进行变换了。任意规定反演半径和反演基圆(但是要注意精度)然后把两个圆反演出去 (根据结论 不过反演中心的圆反演后还是圆,反演中心是他们的一个位似中心) 然后再求外公切线 (因外题目要求是外切),再把得到的直线反演回来就可以了。#include<cmath>#include<cstdio>#include<cstdl原创 2017-10-05 16:04:37 · 292 阅读 · 0 评论 -
POJ 1584 计算几何基础判断
这个题目就是让你判断三件事情 1. 这些点能不能构成一个凸包 2. 圆心是不是在这个凸包的内部 3. 这个凸包能不能包含这个圆 第一个根据凸包的性质用叉积判断一下下就好了 第二个的话根据多边形的一个性质 在内部的点的 与所有点连接起来所有的角加起来是 360 度 第三个的话通过距离判断一下就可以了“`#include <iostream>#include <algorithm>#原创 2017-10-06 16:38:36 · 206 阅读 · 0 评论 -
圆的面积并 辛普森积分法模版
#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>#define ld double#define eps 1e-13using namespace std;int n,top,st,ed;ld xl[1001],xr[1001];ld ans;bool de原创 2017-10-14 09:52:26 · 391 阅读 · 0 评论 -
HDU 4631
题意 : 平面上n个点依次加入,然后让你不断求任何两个点的最小距离。 题解 : 看到这个题目我们不难想到求平面上的最近点对的做法 先将加入的所有点的x按照从小到大排序, 每次向两边扫描x距离小于 当前最小值的所有点,不断更新当前最小值,直到出现0就停止这种操作,关键是怎样每次都保证x有序呢 ? 当然是不断加入 multiset 中 (因为点可以重复). #include <cstdio>#inc原创 2017-10-31 22:48:30 · 153 阅读 · 0 评论 -
HDU 4454 计算几何 (三分)
题意 : 给你一个点和一个圆形和一个矩形,让你求这个点先到矩形,再到圆形折线的最小值。 题解 : 我们发现,对于圆上的任意一个点我们都可以求出这个点到这个矩形的最小距离,然后我们就可以通过三分圆上的点找到这个最优解就可以了#include <iostream>#include <algorithm>#include <cstdio>#include <cmath>#include <cst原创 2017-11-01 19:14:38 · 430 阅读 · 0 评论 -
HDU 4667 计算几何 (乱搞)
题意 : 不说了自己看 题解 : 做这个题就像发现了新大陆,因为发现了一个计算几何的乱搞的方法,就是如果让你找一个点的话我们就可以把一个圆或者一个线段等分成若干份就好了,等分成若干份然后暴力 或者加点什么优化这类的东西,这个题就是这样啊.#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#in原创 2017-11-01 20:14:23 · 211 阅读 · 0 评论 -
通过半平面交求多边形的核
半平面交 (POJ 1279(第一道半平面NLOGN)完整注释 ) 半平面交的O(NLOGN)算法(转载)求n个半平面的交有三种做法:第一种就是用每个平面去切割已有的凸多边形,复杂度O(n^2)。第二种就是传说中的分治算法。将n个半平面分成两个部分,分别求完交之后再将两个相交的区域求交集。由于交出来的都是凸多边形,利用凸多边形的交可以在O(n)时间内完成的性质,将复杂度降为O(转载 2017-09-19 10:58:31 · 469 阅读 · 0 评论 -
发一个半平面交的模版
就是求半平面交发一个刘汝佳半平面交模版 #include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <cmath>using namespace std;#define N 50005const double eps=1e-8;int dcmp(double x) { if原创 2017-09-18 23:25:42 · 803 阅读 · 1 评论 -
POJ 1265 Pick 定理
题意 : 给你n个点 这些点都在整点处,让你求这些点包围的面积,内部的点,边缘上的点。题解 : 首先这个图非常特殊是一个网格图 (还是整点)对于这种图我们可以利用gcd求出边上的点 (数论中常用啊) 面积的话就可以用普通多边形求面积的方法求出,关键在于在内部的点怎么求 !这个时候就要用 Pick 定理 ,这是一个什么样的定理呢 ? 就是说在一个顶点全部都是整点的网格图上 面积与内部的点,边上的点有一原创 2017-09-17 22:44:45 · 202 阅读 · 0 评论 -
计算几何基础算法
计算几何尽量避免除法,开根号等等损失精度的东西。 判断点是否在一个矩形内 :判断的方法非常简单就是根据点和矩形本身的位置关系即点的坐标位于矩形的坐标内部 即 (x > min (x1,x2) && x 判断点是否在园的内部 : 求一下点到圆心的距离,然后判断一下和半径的关系即可判断一点是否在直线上: 只需要看一下直线上任意一点到该点的向量叉该直线的方向向量是不是等于0就可以了。判断点是否在线段上原创 2017-09-13 21:12:54 · 667 阅读 · 0 评论 -
poj 2318 TOYS 二分+叉积
题解 :我们发现这个题目的隔板是按照x从小到大排列的,所以当一个点在某个隔板的左边时它一定也在它右边隔板的左边这样的话这个题在第几个搁板后面就满足了二分性质然后我们就可以二分答案,看看每个点在哪两个板中间就可以了注意二分的边界,二分时一定要判断两个东西 判断边界 防止进入死循环判断每个点是否都能被访问 #include <iostream>#include <algorithm>#原创 2017-09-14 20:00:54 · 172 阅读 · 0 评论 -
POJ 3304 Segments [枚举+叉乘判断线段相交]
题意 : 给你n条线段,问你是否存在一条直线使得所有的线段投影到该直线的时候都会有交点题解:所有的线段投影到一条直线是否存在交点,这个问题等价于是否存在一条垂直于某条直线的直线穿过所有的线段,因为直线是任意的,所以垂直于这条直线的直线也是任意的,那么这个问题就转化为了,是否存在一条直线穿过所有的线段。 对于这个问题我们可以发现直线穿过线段的端点一定比穿过线段的中间某个点更优 (端点的时候才是正好使原创 2017-09-14 20:55:58 · 288 阅读 · 0 评论 -
POJ 1269 Intersecting Lines(直线相交判断,求交点)
题意 : 就是让你求直线是否相交,若相交求出交点题解 :先要有一个意识就是求直线方程不是很麻烦,我就是被这个给坑了,会求直线方程这个问题就解决了 剩下的就是解方程了 (注意斜率不存在的情况就好了)#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <cmath>using na原创 2017-09-14 22:01:18 · 168 阅读 · 0 评论 -
POJ 1556 错误代码
POJ 1556 扔一个写错了代码 而且不知道那里错了#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <cmath>#include <queue>#include<iomanip>using namespace std;const int maxn = 1005;c原创 2017-09-15 19:04:37 · 179 阅读 · 0 评论 -
POJ1556 The Doors(线段与线段相交 + 最短路
题意 :给你一些门和一些墙,让你判断从 (0,5) 到 (10,5) 的最短路;题解 :关键在于建图,枚举任意两个点,然后依次判断是否和每个墙相交,他们之间的距离用两点间的距离公式算一下就好了。由于点的数目太少最短路用什么方法都可以过判断线段相交比较好写,也比较快的方法是两个实验 : 1. 快速排斥实验 2. 跨立实验 3.计算几何 关键还是要有稳定的模版啊 #include<cstdio>原创 2017-09-15 19:10:44 · 224 阅读 · 0 评论 -
POJ 2653 Pick-up sticks(判断线段相交)
题意 : 有n条线段可能相交,问你最后顶上的线段一共有多少条。题解 : 关键在于注意到这个题目 top sticks 最多不会超过 1000 这是这个题目的关键,我们可以从前往后依次将可能在顶上的线段放进一个数组里,然后每次对于一条新的线段,枚举判断是否与前面的线段相交相交的话把前面的线段从答案中删除就可以了。#include <algorithm>#include <cstring>#incl原创 2017-09-15 20:16:25 · 195 阅读 · 0 评论 -
poj1410(计算几何)
题解 : 多边形可以看成许多条线段,依次判断线段是否存在交点就可以了,注意需要判断线段是否在多边形内部 (用坐标判断一下就可以了)#include<cstdio>#include<cstdlib>#include<cstring>#define eps 1e-8using namespace std;struct point{ double x,y;};struct line{原创 2017-09-15 21:04:07 · 281 阅读 · 0 评论 -
POJ 计算几何入门题目推荐
POJ 计算几何入门题目推荐(转) 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中。之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途(例如本人的专业,GIS)。以后若有机会,我会补充、完善这个列表。计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重转载 2017-09-15 21:33:33 · 251 阅读 · 0 评论 -
POJ 1696 Space Ant (计算几何 + 极角排序)
题意 :给你 n 个点和三种走的限制条件,问你最多能走多少个点。题解 :首先这个题我们必须猜出一个结论,就是按照极角排序之后每次选取角度最小的那个点一定能将所有的点走完猜出这个结论以后就很容易了,无论你是用什么极角排序,还是凸包方法都可以解决这个问题了。说明一下极角排序 : 为什么称之为极角呢? 首先要有一个极点,按照这个极点逆时针排序就好了 逆时针排序怎么做到呢 ? 很容易就联想到叉积 ,叉原创 2017-09-16 20:48:25 · 312 阅读 · 0 评论 -
POJ 3347 Kadj Squares 复杂的线段相交问题。这个题目是计算几何的扩大数据运算的典型应用 有时候扩大数据范围避免浮点误差,这个题就是应用
题意 : 给你n个正方形每个正方形斜45度摆放,给你正方形的边长,从上向下看问你能看到哪些正方形。题解 :首先我们发现正方形最大能看到的长度对应着x轴上的对角线的长度。发现了这个以后我们就要想办法求出对角线最左和最右边的点的坐标,求坐标的时侯我们发现长度都带着根号2这个时候为了运算的精度我们就给所有的数都乘以一个根号2就可以了。画图可以找出求最左最右边坐标的方法。这种问题常常考虑能看到的最大原创 2017-09-16 23:26:50 · 189 阅读 · 0 评论 -
贴个线段相交模版
bool judge (seg a,seg b) { if (max (a.x1,a.x2) < min (b.x1,b.x2) || max (b.x1,b.x2) < min (a.x1,a.x2) || max (a.y1,a.y2) < min (b.y1,b.y2) ||max (b.y1,b.y2) < min (a.y1,a.y2)) return false; if原创 2017-09-17 10:44:36 · 334 阅读 · 0 评论 -
POJ 1113凸包模版题 (自己的凸包模版)
题解 : 可以画图验证加上推导一下就会发现这个题的答案就是凸包的周长加上外面圆的周长。剩下的就是模版了#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include <cstdio>using namespace std;const double eps = 1e-8;const int原创 2017-09-17 11:16:53 · 191 阅读 · 0 评论 -
POJ 3348 求凸包面积
题意 : 就是让你求出凸包面积然后除以50题解 :凸包的求法面积的求法 说一下面积的求法 : 和凸包的排序方式一样然后逆时针扫一遍凸包把所有的面积全部加起来就可以得到答案了。 (一定要先固定一个极点然后按照极角排序就可以了) ps : 计算几何输入一定要用scanf;#include <iostream>#include <algorithm>#include <cstring>#i原创 2017-09-17 18:47:48 · 230 阅读 · 0 评论 -
HDU 2306 求多边形面积
题意 : emmm……. 就是求多边形的面积。题解 : 首先我们要理解一下多边形这个东西首先我们中学讲平行四边形的时候就说过一个东西,多边形的点一定是按照顺序给出的,只有按照顺序给出这个多边形才可以确定,这样的话我们求面积就可以扫描了 (就因为它是按照顺序给出的)我们可以按照原点为极点求一圈叉积就可以了(相当于把多边形的面积拆分成很多小三角形的面积) 如果点不是按照一定的顺序给出,那么多边形都确定不原创 2017-09-17 19:49:20 · 296 阅读 · 0 评论 -
POJ 1654 求多边形面积
还是 : 要是用叉积求一个任意多边形的面积 ,多边形必须给定 ! (即顺序要有的)#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <cmath>#include <string>#define ll long longusing namespace std;const原创 2017-09-17 20:43:03 · 184 阅读 · 0 评论 -
2017 ICPC 沈阳 C 计算几何
这个题就是让你求最大空凸包 (区域赛竟然出了一道模板题) 那就抄模板好了 ,poj 原题 …..#include <iostream>#include <cmath>#include <cstdio>#include <algorithm>using namespace std;typedef double type_p;const double eps = 1e-6;const in原创 2017-11-11 16:31:28 · 1386 阅读 · 1 评论