
计算几何学习
directx3d_beginner
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
二,几何相交-5,BO算法分析--(1)正确性
因为两条线段从不相邻到相邻,或者其中一条线段不存在到相邻,都会进行一次相交测试。因为在相交之前,这两条线段必然紧邻。所以必然会经过相交测试。也就是说,BO算法有没有可能误报或者漏报?一,为什么不会误报?二,为什么不会漏报?原创 2024-06-04 19:06:26 · 301 阅读 · 0 评论 -
二,几何相交-5,BO算法实现--(4)扫描线状态
扫描线状态用平衡二叉搜索树BBST表示,定义了每个时刻,从上到下的各线段的相互关系。功能:查找直接前驱和直接后继。操作:插入,删除和交换。原创 2024-04-25 19:56:12 · 214 阅读 · 0 评论 -
二,几何相交-5,BO算法实现--(3)事件和操作
比如1+4相交事件后,会发现3+4交点,于是将3+4交点放入优先级队列。值得注意的是,1+4相交事件并非是发现交点的唯一途径。1,初始化,将n条线段的2n个端点从左到右依次加入优先队列。2,相交事件时,将交点放入优先队列的合适位置。原创 2024-04-24 19:35:24 · 227 阅读 · 0 评论 -
二,几何相交-5,BO算法实现--(2)事件队列
那么,在1+4相交这个事件发生后,线段4和线段3相交,所以要加入3+4这个事件,放入优先队列中,那么优先级在哪里呢?从左向右,应该是在线段6的左端点的右边,以及线段1的右端点的左边,所以优先队列改为6左端点->3+4->1的右端点。在1+4相交这个事件以前,线段3和线段4不相邻,具体来说,从上到下是线段4->线段1->线段3,从时间轴上看应该是1+4交点->6左端点->1的右端点。事件队列用的数据结构是优先队列。原创 2024-04-16 08:37:01 · 249 阅读 · 1 评论 -
二,几何相交-5,BO算法实现--(1)退化情况
(4)有四条线段分别两两相交,其中这两个交点同时过扫描线。(1)扫描线与线段垂直,即该线段的左右端点同时达到扫描线。右边是从上到下四种退化情况,(其中四,五个图是一种情况)(2)一条线段的左端点和另一条线段的右端点相交。(2)两条线段搭接,即,有无数个交点。其中,左下三种从左到右分别是。(1)两条线段的右端点相交。(3)两条线段的左端点相交。上图是退化情况,不考虑。(3)多条线段交于一点。原创 2024-03-27 08:19:14 · 223 阅读 · 0 评论 -
二,几何相交---4,BO算法---(4)可能的三种情况
第三种情况,经过e和f的交点,状态pred->e->f->suc,变成pred->f->e->suc,这时候pred和f可能相交,e和suc也可能相交,需要分别做相交测试。第二种情况,经过线段e的右端点,状态pred->e->suc,变成pred->suc,这时候prd和suc可能相交,进行相交测试。第一种情况,加入线段e的左端点,那么原来的状态pred->suc变成pred->e->suc。相交测试也简单,对两线段的4个端点,做四次toleft测试即可。原创 2024-03-14 18:41:38 · 270 阅读 · 0 评论 -
二,几何相交---4,BO算法---(3)数据结构
数据结构分两块,一个是某一时间状态的局部相交线段。一个是事件队列,是某一时刻局部相交线段的集合。原创 2024-03-13 07:49:41 · 296 阅读 · 0 评论 -
二,几何相交---4,BO算法---(2)比较和排序
在某一时刻x=t,扫描线从左到右时,一部分线段会与扫描线相交,此时此刻,线段可以分成高低顺序,那么对于给定两条线段,是如何变化的呢?有两个端点,左端点和右端点,2,在右端点右边,仍然也只有一条线段与扫描线相交,1,在左端点左边,只有一条线段与扫描线相交,3,在左端点之间,扫描线与两条线段都相交。原创 2024-03-11 19:09:05 · 245 阅读 · 0 评论 -
二,几何相交---4,BO算法---(1)接近性和可分离性
3,从左向右扫描线只需要观察每个线段的两个端点和一些可能的相交点。1,如果一条直线(比如竖直)可以分开两个线段,则这两个线段不相交。2,只需要观察与隔离线相交的几个线段。原创 2024-03-08 08:25:21 · 231 阅读 · 0 评论 -
二,几何相交----3.线段相交测试
则可以使用burteforce两两测试,使用四次toleft即可。比如,线段(a,b)和线段(c,d)相交,必然线段的两个端点在另一个线段的两侧。这样时间复杂度就是成为了o(n2)其实,时间复杂度可以降低到o(nlogn+i),i是交点个数。将与X轴平行的线段扩展到一般平面上的线段。原创 2024-03-06 09:14:57 · 170 阅读 · 0 评论 -
二,几何相交----2,区间相交检测IID
3,线性扫描,从小到大,根据模式判断是否相交,假设不相交,则应该是LRLR的模式,即首尾相连;如果有LL或者RR,则相交。对于空间的线段是否相交,假设都是与x平行,则需要三步。时间复杂度是nlog(n),在第二段排序上。1,对各线段左右端点设置为L,R标志。2,从小到大进行排序。原创 2024-03-04 18:36:21 · 214 阅读 · 0 评论 -
二,几何相交----1,预备------(4)IEU整数元素唯一性
IEU是EU的一个特例,元素都是整型的,计算复杂度也是o(nlogn)原创 2024-02-29 09:12:17 · 188 阅读 · 0 评论 -
二,几何相交-----1,预备---(3)MaxGap最大缝隙
2,如果距离比较悬殊,则很明显有空桶,则剔除空桶后,前一个桶的最后一个元素和后一个桶的第一个元素之间就有若干个桶的距离。而同一个桶内的相邻元素之间的缝隙是小于一个桶的,所以成立。2,借助散列表,将[lo,hi)均匀分配到0到n-2,共n-1个桶中,而最大值hi放到第n-1个桶内。4,将每个桶的最后一个元素和下一个桶的第一个元素取出,对这些元素找最大的缝隙,即为maxGap。1,假如是相对均匀,每个桶一个元素,正好,从小到大把各个数都取出,计算这n个值两两之间的差距。如上图所示,最大缝隙用到了散列表,原创 2024-02-28 19:36:37 · 214 阅读 · 0 评论 -
二,几何相交---1,预备---(2)MinGap最小缝隙
最小缝隙顾名思义,找到相邻的两个元素的最小缝隙。类似于EU,先进行排序,然后两两比较相邻的差值,得出最小的那个。不妨想下,如果差值为0,则元素不唯一;如果差值不为0,则元素唯一。所以,可以把EU问题归结到到mingap,时间复杂度o(nlogn)原创 2024-02-27 18:48:49 · 239 阅读 · 0 评论 -
二,几何相交---1,预备--(1)元素唯一性EU
先通过o(nlogn)的时间复杂度排序(上下界都是o(nlogn),再比较相邻的两个元素即可。如何获取数组中元素的唯一性?原创 2024-02-26 19:15:25 · 167 阅读 · 0 评论 -
一凸包----------12,分而治之(2)
进行zigzag,如果一侧的顶点前驱和后继不是同时toleft,或者toleft,则继续找它的后继(或者前驱)。如果前驱和后继的toleft同号了,则反向计算。根据以前的方法,很可能认为是两个子凸包上顶点与上顶点相连,下顶点与下顶点相连,形成两条支撑线,缝合成一个新的凸包。在上节中,两部分子凸包有重合的部分,不简洁。这一节是沿着某个方向,子凸包不重叠,如下图。左边的子凸包的最右侧的点和左侧子凸包的最左点开始连线。这样就得到了上边的支撑线,同理,可以得到下边的支撑线,缝合成一个新的凸包。原创 2024-02-21 18:48:57 · 182 阅读 · 0 评论 -
一,凸包----11,分而治之(1)
对于第二种情况,如下图所示,仍然按照toleft,将凸包P2极点中的st部分保留(逆时针),将ts部分抛弃,并将st部分的极点和p1中的极点,仍然按照以公共核为中心,逆时针按照极角的大小,形成新的顶点集合。对该顶点集合再次使用Graham scan算法,形成新的凸包。1,确定公共核,该点在其中一个顶点内,设置为重心,可以任意三点的中心线交点获得重心(不用管总共多少顶点),这样,就可以以该重心点为准,按照逆时针的极角排序,获取该预处理后的顶点,根据Gramham scan算法,获取该部分凸包的顶点。原创 2024-02-20 08:50:01 · 269 阅读 · 0 评论 -
一,凸包-----10,GrahamScan分析
如果一共有N个顶点,初始时S栈有两个点,T栈是N-2,那么A = 2 + 2*(N-2)= 2N-2,也是O(n)2,假设初始点是Y轴负值无穷远处,则Presort,可以得知是从右到左,依次入栈,然后通过ToLeft可以获取上凸包8->7->2->1。3,同样,假设初始点是Y轴正值无穷远处,则Presort,可以得知是从左到右,依次入栈,然后通过ToLeft可以获取上凸包1->4->8。内部各边不相交,(虚线是预处理角度部分,紫色是回溯部分,黄色是判断但是没有入栈部分)所以,不会超过3n,即O(n)原创 2024-02-19 09:28:23 · 347 阅读 · 2 评论 -
一,凸包------9,Graham Scan:正确性
如果当K>3时,比如由点1-9组成兔凸包后,判断10号点是否凸包,则由点8和点9组成的直线,根据toleft,判断点10是在左侧(绿色区域)还是右侧(蓝色区域),如果在左侧,则说明10号点是新的极点。从1号点是通过先下后左找到的极点,2号点是从1号点为顶点,对角度排序的最小的点,可知,1号点和2号点必然是极点,最差也会和新的点组成个三角形。如果10号点在右侧(蓝色区域),说明9号点在1,8,10三个点组成的三角形内,必须剔除掉,依次类推,必然过10号点有一条原凸包的切线,如下图所示。原创 2024-02-06 07:35:39 · 192 阅读 · 0 评论 -
一,凸包-----8,Graham Scan:实例
继续,从S栈的栈顶元素4和次栈顶元素3取出,画一条线(3,4),弹出T栈顶元素5,根据toleft,发现5在线段(3,4)的右侧,不符合条件,将4从S栈顶弹出。继续,从S栈的栈顶元素5和次栈顶元素3取出,画一条线(3,5),弹出T栈顶元素6,根据toleft,发现6在线段(3,5)的右侧,不符合条件,将5从S栈顶弹出。依次类推,从S栈的栈顶元素3和次栈顶元素2取出,画一条线(2,3),弹出T栈顶元素4,根据toleft,发现4在线段(2,3)的左侧,符合条件,将4压入S栈顶。原创 2024-02-05 08:20:39 · 345 阅读 · 0 评论 -
一,凸包.----7,Graham Scan:算法描述
如图从右到左,红色是S栈的栈顶元素和此栈顶元素,以及T栈比较的栈顶元素,这三个点进行ToLeft测试,绿色是S栈不进行比较的元素,蓝色是T栈不进行比较的元素,最终,T栈为空,S栈全为绿色。根据先下后左的方式,找到凸包的第一个元素,放入S栈,再将该点的极角,从小到大排序,放入T栈,其中,T栈的第一个元素放入S栈,形成第一个极边。S栈的栈顶元素和次栈顶元素连成直线,将T栈的栈顶元素弹出,如果T栈顶元素满足ToLeft测试,则把T栈顶元素压入S栈栈顶,依次类推,直到T栈顶为空,则S栈从下到上为逆时针的凸包。原创 2024-02-04 19:26:57 · 215 阅读 · 0 评论 -
一,凸包------6,构造凸包的时间复杂度下限
根据排序算法,可以在时间复杂度为o(n)的基础上,将蓝色的1,2,3,4在x轴排序,如果画一个抛物线或其他曲线,将这些点映射到抛物线上,可以看到,最左侧的点是凸包的起点,这些凸包上的点也是在x轴有序排列。类似,左边的问题就是称石块,已知问题;右边的问题就是称象,未知问题。比如曹冲称象,可以将象的重量转换为石块的重量,从而解决问题。如果能在线性时间转换输入,则两个算法时间复杂度相同。二,如何断定凸包问题时间复杂度下限是o(n)?原创 2024-02-03 09:52:13 · 225 阅读 · 0 评论 -
一,凸包-----5,Jarvis March
如果水平轴是X轴,竖直轴是Y轴,那么找最下面的,即Y最小的那个点,如果有若干个点都是最小的Y值,那么找最左边的,即,先找最下,再找最左,必定是凸包上的顶点。这样可以通过连接凸包上的最后一个点和未组成凸包的点的连线,查看是否有在右侧的,如果有,则说明在右侧的点比当前点更适合做凸包的边。同样从上图可以看到,组成凸包的过程0/5->1/5->2/5->3/5->4/5->5/5,找到新的合适的点后依次首尾相连。Jarvis March算法借鉴了选择排序,从未排序的数组中,选出最大值,放入已排序数组的首部。原创 2024-02-02 19:47:17 · 194 阅读 · 0 评论 -
一,凸包--------4,Incremental construct
如上图所示将点X加入到原凸包,(即S黄Vt蓝V所在的凸包)那么可以观察到,将会组成新的凸包XS黄Vt,也就是说,逆时针来看,保留st这段,舍弃ts这段。3,对点黄V,x->黄V这条线,黄V的直接后继(即在S黄V这段)在线的右侧,黄V的直接前驱(即在黄V到t这段)在线的左侧,即R+L。4,对点蓝V,x->蓝V这条先,蓝V的直接后继(即在t蓝V这段)在线的左侧,蓝V的直接前驱(即在蓝V到s这段)在线的右侧,即L+R。2,xs也是凸包的切线,不管t是直接后继也好,直接前驱也好,都在xs这条线的左侧,即L+L。原创 2024-02-01 09:10:27 · 270 阅读 · 0 评论 -
一,凸包---3,极边
极边就是组成凸包的边的集合。时间复杂度是o(n3),比判断极点快(时间复杂度(On3)快。为什么呢?试想,不论极边也好,极点也好,判断的依据是三角形的方向,(无论是海伦公式,还是向量叉乘)。极边是需要三个点组成一个三角形,是一个三重循环,即可用toleft方法来排除内部的边而判断极点是在构成这个三角形的同时,还要加一个点,四重循环,才能够做这个toleft测试。如下图所示,这个图可能看不清楚要干啥。下图就一目了然了。邓老师果然厉害,感谢邓老师。...原创 2022-03-26 12:55:40 · 658 阅读 · 0 评论 -
一,凸包---2,极点
组成凸包的点有极性,叫做极点。反之,是非极点。从下图可以看到,蓝色的点组成凸包,是极点。内部的青色的点是非极点。极点的特征是,过该点必然至少有一条直线,直线的一边为空,另一边是凸包上的所有点。比如,p,q,r就是极点。...原创 2022-03-24 22:02:36 · 1188 阅读 · 0 评论 -
一,凸包--1,凸相关
这节课举了两个例子,第一个例子是形象地说明了什么是凸包,第二个是说明了点之间怎样的关系才能形成凸包(是否凸相关)一,在黑板上的钉子(红点),用橡皮筋(蓝线段)撑住,橡皮筋就可以认为是凸包,与橡皮筋挂着的钉子对凸包起作用,外部的不起作用。,当然如果内部的钉子发生变化,则对凸包起作用的钉子也会可能发生变化,即,原来起作用的不再起作用,原来不起作用的,可能会起作用。第二个例子讲的是颜料,rgb三种颜色按照比例不同,可以勾兑成其他不同的颜色一开始看的迷茫了,琢磨了下,其实就是是否具有线性关系,当然,线原创 2022-03-22 20:33:55 · 802 阅读 · 0 评论 -
计算几何-序
再开个坑,计算几何的学习,邓俊辉老师的学堂在线。以前看过一些,看着看着就不知道去哪里了。所以,要记录一下。加深印象。原创 2022-03-22 19:26:57 · 339 阅读 · 0 评论