多边形求交并差

2023-11-22 04:50
文章标签 多边形 求交

本文主要是介绍多边形求交并差,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码:Github:team79/PolygonOverlayAnalysis

基本概念介绍

多边形交并差计算的算法的相关证明过程是很繁琐,因此在这里将直接给出算法所需的概念以及算法所用到的一些性质。具体的相关证明过程在ZHU Ya-Yin[1]论文中有详细证明。
算法中的一些概念:

  • 1、∂A :多边形A 的边的集合, 或A 的边界上点的集合;
  • 2、P ↓:过点P 作的垂直向下射线;
  • 3、<:点的小于比较符, P < Q (Px < Qx )∨(Px =Qx ∧ Py < Qy);
  • 4、P x , Py :P 的横、纵坐标;
  • 5、Lp(e):e 的左端点, 即e 两端点中较小的一个;
  • 6、Rp(e):e 的右端点, 即e 两端点中较大的一个;
  • 7、I(e):e 内点(e 上除端点外的其他点)的集合;
  • 8、e , s :边;
  • 9、C(P ,∂ A):与P ↓有交点, 且右端点不在P ↓上的A 的边集合.即C(P , ∂A)={s s ∈ A , s ∩P ↓≠ , R p(s) P ↓};
  • 10、s1 >P s2 :边s1 , s2 在通过P 点的垂直线x =Px上的比较, 即s1 >P s2 (Q1 >Q2)∨ (Q1 =Q2 ∧Ks1 >Ks2), 其中点Q1 , Q2 表示边s1 , s2 与过P 点的垂线的交点, Ks1 , Ks2 分别表示s1 , s2 的斜率;
  • 11、max(C(P , ∂A)):表示C(P , ∂A)中在P 点处的最大边。

算法所用到的定理与性质:

  • 1、对于多边形A 的任一条边,设P是e的内点, 如果C(P , ∂A)有奇数条边, 则称e是A的奇边, 简记为+e,否则称e是A的偶边,简记为-e;
  • 2、对于任意两条边s1 , s2 ∈ C(P ,∂ A), 如果s2 是在P 点处小于s1 的最大边, 即s1 >P s2 , 且不存在边e ∈ C(P ,∂ A), 使得s1 >P e , e >P s2 同时成立, 则s1 , s2 在A 中的奇偶相异;
  • 3、对于任一不在多边形A 边界上的点P , 如果过点P 所作的垂直向下的射线与多边形A
    的相交的最大边是偶边, 或没有与A 的任何边相交, 则P 在多边形A 的外域, 其逆亦然;如果射线与A 相交的最大边是奇边, 则P 在多边形A 的内域,其逆亦然;
  • 4、内边:e 的所有内点均位于A 的内域, P , P∈ I(e) P ∈ I (A);
  • 5、外边:e 的所有内点均位于A 的外域, P , P∈ I(e) P ∈ E(A);
  • 6、重叠边: s , s ∈ A , P , P ∈ e P ∈ s;
  • 7、简单边:内边、外边、重叠边;
  • 8、复杂边:不属于简单边的其他边。

算法总体流程

算法整体步骤如下:

  • Setp1 .在平面扫描过程中, 计算A , B 的交点(包括切点), 分解复杂边为简单边, 同时根据算法1 , 2 , 确定A , B 边的奇偶性及其拓扑类型, 并记录在数据结构中;
  • Setp2 .针对多边形交、并、差的具体计算特点,分别根据算法2-11、2-12、2-13进行边的跟踪, 输出构成A ∩B , A ∪ B , A -B 的中间多边形;
  • Setp3 .依次构造各中间多边形的Border , 确定中间多边形的方向性.根据定理与性质判断其是洞还是外接多边形;
  • Setp4 .判断洞Border 与外接多边形Border 的包含被包含关系, 确定洞归属于哪个外接多边形, 进而确定A ∩ B , A ∪ B , A -B.

多边形求交算法

多边形求交的伪代码表示如下表:

I   for each e of A , B 的边{
II  if e 没有访问过∧ (e 是内边∨ )then
III         do{
IV          标记e 为已访问;如果e 是重叠边, 还要标记其重叠边e′为已访问;
V               if e 是奇边then {
VI              把e 的左端点添加到顶点链表中;
VII                 P →e 的右端点;
VIII            }else {∥隐含条件e 是偶边
IX                  把e 的右端点添加到顶点链表中;
X                   P →e 的左端点;
XI              }
XII             if (在连接P 的另一输入多边形的邻边中, 存在着满足条件的内边s :
XIII                s 是奇边且P =Lp(s), 或者s 是偶边且P =Rp(s))then e →s ;
XIV             else e →连接P 的本输入多边形的邻边;
XV          }until P 与顶点链表中的第1 个顶点相等;
XVI         输出顶点链表中顶点组成的中间多边形, 并清空顶点链表;
XVII    } ∥end if
XVIII} ∥end fo r

多边形求并算法

多边形求并的伪代码表示如下表:

I   for each e of A , B 的边{
II  if e 没有访问过∧ (e 是外边∨ )then
III         do{
IV          标记e 为已访问;如果e 是重叠边, 还要标记其重叠边e′为已访问;
V               if e 是奇边then {
VI              把e 的左端点添加到顶点链表中;
VII                 P →e 的右端点;
VIII            }else {∥隐含条件e 是偶边
IX                  把e 的右端点添加到顶点链表中;
X                   P →e 的左端点;
XI              }
XII             if 连接P 的本输入多边形的邻边s 是外边then e→s;
XIII            else if 连接P 的另一输入多边形的邻边中, 存在着外边s′then e →s′.
XIV             else e →连接P 的本输入多边形的邻边;
XV          }until P 与顶点链表中的第1 个顶点相等;
XVI         输出顶点链表中顶点组成的中间多边形, 并清空顶点链表;
XVII    } ∥end if
XVIII} ∥end fo r

多边形求差算法

多边形求差的伪代码表示如下表:

I   for each e of A , B 的边{
II  if e 没有访问过∧ ((e 是A 的外边)∨ (e 是B 的内边))then {
III         do{
IV          记e 为已访问;如果e 是重叠边, 还要标记其重叠边e′为已访问;
V               if e 是A 的奇边或是B 的偶边then {
VI              把e 的左端点添加到顶点链表中;
VII                 P →e 的右端点;
VIII        }else {∥隐含条件:e 是A 的偶边或是B 的奇边
IX                  把e 的右端点添加到顶点链表中;
X                   P →e 的左端点;
XI              }
XII             if e 是A 的边, 与P 相连的属于B 的邻边中, 存在着满足条件的内边s:s 是B 的奇边且P 是s的右端点, 或者s 是偶边且P 是s 的左端点then e →s ;
XII             else if e 是B 的边, 与P 相连的属于A 的邻边中, 存在着满足条件的外边s′:s′是奇边且P 是s′的左端点, 或s′是偶边且P 是s′的右端点then e →s′
XIV             else e →连接P 的本输入多边形的邻边;
XV          }until P 与顶点链表中的第1 个顶点相等;
XVI         输出顶点链表中顶点组成的中间多边形, 并清空顶点链表;
XVII    } ∥end if
XVIII} ∥end fo r

多边形:

这里写图片描述

交:

这里写图片描述

并:

这里写图片描述

差:

这里写图片描述

这篇关于多边形求交并差的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/407621

相关文章

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

【Godot4.3】多边形的斜线填充效果基础实现

概述 图案(Pattern)填充是一个非常常见的效果。其中又以斜线填充最为简单。本篇就探讨在Godot4.3中如何使用Geometry2D和CanvasItem的绘图函数实现斜线填充效果。 基础思路 Geometry2D类提供了多边形和多边形以及多边形与折线的布尔运算。按照自然的思路,多边形的斜线填充应该属于“多边形与折线的布尔运算”范畴。 第一个问题是如何获得斜线,这条斜线应该满足什么样

模拟退火判断一个圆是否可以放在一个多边形内

/*给定n个点的一个多边形,一个圆的半径,判断圆是否可以放在多边形里*//* ***********************************************Author :rabbitCreated Time :2014/7/3 22:46:38File Name :2.cpp**********************************************

利用向量积(叉积)计算三角形的面积和多边形的面积(hdu2036)

开始撸计算几何题目了。。。。。。。 预备知识:叉乘求多边形面积 参考证明资料: 公式证明: http://www.cnblogs.com/xiexinxinlove/p/3708147.html 高中知识: http://wenku.baidu.com/view/867e6edfad51f01dc281f11a.html #include<stdio.h>#inclu

HDU 2036 求多边形面积

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2036 对用(按逆时针排列)描述的多边形,其面积为: 若按顺时针排列,取负数即可。 资料链接: http://zh.wikipedia.org/wiki/%E5%A4%9A%E8%BE%B9%E5%BD%A2 不知道这公式是咋推导的,网上找不到,先留着。 #

图形几何-如何将凹多边形分解成若干个凸多边形

凹多边形的概念         凹多边形是指至少有一个内角大于180度的多边形。与之相对,凸多边形的所有内角均小于或等于180度,且任意两点之间的连线都完全位于多边形内部。将凹多边形分解成若干个凸多边形是计算几何中的一个重要问题。 分解原理         将凹多边形分解为凸多边形的基本原理是通过绘制对角线来消除凹角。对角线是连接多边形两个非相邻顶点的线段。通过适当选择对角线,可以将凹多边形

判断点在多边形内的算法(Winding Number详解)

在计算几何中,判定点是否在多边形内,是个非常有趣的问题。通常有两种方法: 1.Crossing Number(交叉数) 它计算从点P开始的射线穿过多边形边界的次数。当“交叉数”是偶数时,点在外面;当它是奇数时,点在里面。这种方法有时被称为“奇-偶”检验。 2.Winding Number(环绕数) 它计算多边形绕着点P旋转的次数。只有当“圈数”wn = 0时,点才在外面; 否则,点在

多边形快速凸包算法(Melkman‘s Algorithm)

前言 平面点集的凸包算法一文介绍了如何计算平面点集或者任意多边形的凸包。对于随机的平面点集,Graham scan和Andraw's 单调链算法已经是最快的算法了。但是对于没有自相交的封闭的简单多边形,存在线性复杂度的算法。下面介绍这一优雅高效的算法。 一般的2D凸包算法,首先将点进行排序(时间复杂度),然后利用栈操作在O(n)的时间复杂度内计算凸包。初始的排序决定了最终的时间复杂度。但是本文

多边形游戏问题——动态规划

题目:单人游戏,开始有一个由n个顶点构成的多边形,每个顶点赋予一个整数值,每条边一个运算符“+”,“ *” 所有边依次用整数1到n编号, 游戏第一步,将一条边删除,随后n-1操作: 选择一条边E及E连接两个顶点V1,V2;用一个新的顶点取代边E及由E连接的两个顶点V1,V2,将由顶点V1和V2整数值通过边E上 的运算得到的结果赋予新顶点,然后所有边呗删除,游戏结束,游戏得分即为所剩顶点整数

利用Leaflet.js创建交互式地图:绘制多个多边形和点位

引言         在地理信息系统(GIS)和地图可视化领域,Leaflet.js是一个轻量级但功能强大的JavaScript库,它提供了丰富的API来创建交互式地图。本文将通过一个实际的Vue组件示例,展示如何使用Leaflet.js在地图上绘制多边形和点位,并且实现多边形上文字的动态缩放效果。 功能概述         1.地图初始化                 首先,我们需