轮廓布尔运算原理及实现思路

轮廓布尔运算包括以下运算:反、交、并、差、异或。

一、取反

一个轮廓既可以代表实体也可以代表负实体,约定轮廓逆时针时为实体轮廓,顺时针时为负实体轮廓,轮廓取反即反转轮廓方向即可。

实体轮廓
轮廓取反

二、轮廓交

轮廓交

三、轮廓并

轮廓并

四、轮廓差

轮廓差

五、轮廓异或

两个多边形的异或是一个多边形,其内部区域为原来两个多变性差的并

六、其中取反和交是两种基础运算,其他运算可以基础运算的组合来实现

取反:\Gamma

交:\cap

并:P\cup Q=\Gamma (\Gamma P\cap \Gamma Q)

差:P\setminus Q=P\cap \Gamma Q

异或:P\oplus Q=\Gamma ((\Gamma (P\cap \Gamma Q))\cap (\Gamma (Q\cap \Gamma P)))

七、轮廓交实现

轮廓取反实现就是将轮廓方向反转,轮廓交实现稍微复杂一点。

两种方法,先说第一种,以两个实体轮廓P、Q为例;

(1)求P、Q交点

(2)最终求交得到的轮廓的顶点由P\Q交点、P在Q内部的顶点、Q在P内部的顶点三部分构成,如下图

intersection vertex、vertex of P in Q、vertex of Q in P;

(3)这三部分点比较容易求得,那么接下来的关键是这些点的顺序问题了,

两个实体轮廓求教后所得也是一个实体轮廓,即顶点为逆时针方向,这些顶点是沿着原始轮廓边一个接一个的连接着的,

即顶点中和原始轮廓P相关的两部分:intersection vertex、vertex of P in Q,在P看来是沿着P的边进行排序的;而和原始轮廓Q相关的两部分:intersection vertex、vertex of Q in P,在Q看来是沿着Q的边进行排序的。这样两个排序好的顶点列表进行合并即得到求教后轮廓的顶点列表;当然合并是有一定规则的。

(4)规则即:1.与P相关的部分:intersection vertex、vertex of P in Q依据在P边上的位置进行排序得到lstVertexP;与Q相关的两部分intersection vertex、vertex of Q in P依据在Q边上的位置进行排序得到lstVertexQ;2.由lstVertexP第一个点出发,若下一个点与当前点在P中的同一条边上并且它们俩的中点在轮廓Q内,那么继续第2步;否则切换到lstVertexQ中与当前点对应的点开始出发,规则同第2步;3.直到形成闭合轮廓,并且这三部分中所有点都已走过;这样即得到相交的轮廓。

与P相关的两部分点依据其在P上的位置进行排序
与Q相关的两部分点依据其在Q上的位置进行排序

 

具体过程:当前点为lstVertexP中点0,由当前点0出发,下一点1与点0同在P的一条边上,然后当前点为点1,下一点2与点1不属于P上的同一条边,即寻找当前点在lstVertexQ上的位序即lstVertexQ中的点6,当前点为点6,由当前点出发,下一点7与点6同属于Q中的一条边,当前点为点7,下一点8与点7不满足条件,点前点切换为lstVertexP中的点2...最终形成两个轮廓。

 

再来看第二种方法,不用于第一种方法以点为单位寻找下一点来最终构成轮廓,第二种方法以边为单位,寻找下一条边来构成轮廓。

获取“交边”进而构成轮廓

可以看出第二种方法相对较为简单,那么还有可以优化的地方吗?是的。

八、两种方法比较

1.第一种以点为单位,粒度小;第二种以边为单位,粒度大,问题规模较小;

2.第二种方法以边为单位,边是有方向的,这样以边来寻找下一条边最终构成轮廓的过程要简单些;

3.两种方法都可以优化,第一种求交点过程以及第二种求“交边”过程可以用空间分区二叉树来减小计算次数。

我实现了第一种以点为单位的方法求轮廓交,下载https://download.csdn.net/download/baidu_38621657/11522410

九、其他轮廓布尔运算可通过组合取反、求交运算来实现。

示例效果见文章开始图片。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章