python凹多边形分割_直线切割凹多边形
一,算法原理
以上图为例,直线(start,end)切割凹多边形ABCDEFGHIJKLMNOP。
记
切割线divLine=(start,end)。
多边形顶点序列vertexList=(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P)。
边序列edgeList=(AB,BC,CD,DE,EF,FG,GH,HI,IJ,JK,KL,LM,MN,NO,OP,PA)。
下面开始计算:
1,求切割点。
遍历edgeList,拿其中各edge与divLine求交,得切割点序列divPointList=(1,2,3,4,5,6,7,8)。
注:线段与直线求交,见:http://www.cnblogs.com/wantnon/p/6384543.html
插入切割点后顶点序列vertexList_afterDiv=(A,1,B,C,2,D,E,3,F,G,4,H,I,5,J,K,6,L,M,7,N,O,8,P)。
插入切割点后的边序列edgeList_afterDiv=(A1,1B,BC,C2,2D,DE,E3,3F,FG,G4,4H,HI,I5,5J,JK,K6,6L,LM,M7,7N,NO,O8,8P,PA)。
2,求各边在切割线哪一侧。
所谓“点在切割线左侧”是指:当站在start面朝end时,点在左手边。
可以使用点到直线的带符号距离来判断点在直线的哪一侧,参考:http://www.cnblogs.com/wantnon/p/6384543.html
求得结果为:B,C,F,G,J,K,N,O在切割线右侧,A,D,E,H,I,L,M,P在切割线左侧。
则切割后的边集edgeList_afterDiv被划分为两个集合:
右侧边集合:rightSideEdgeSet={1B,BC,C2,3F,FG,G4,5J,JK,K6,7N,NO,O8}。
左侧边集合:leftSideEdgeSet={A1,2D,DE,E3,4H,HI,I5,6L,LM,M7,8P,PA}。
3,求封口边。
将divLine反向延长得到点veryFarStart,我们假定点veryFarStart足够远,以至于divPointList中的所有点都在射线[veryFarStart,end)上。
然后我们根据到veryFarStart的距离对divPointList中的点进行排序,得到divPointList_sorted=(1,2,3,8,7,4,5,6)。
然后把divPointList_sorted中的点相邻两个结对儿,得到12,38,74,56。可以发现规律:
线段12,线段38,线段74,线段56,正好都是左侧子多边形的封口。
而将上面每个线段都反向,得到:线段21,线段83,线段47,线段65,正好都是右侧子多边形的封口。
所以有:
leftSideCapSet={12,38,74,56},
rightSideCapList={21,83,47,65}。
4,重新组装。
右侧边和封口形成的集合为rightSideEdgeAndCapSet=rightSideEdgeSet与rightSideCapSet的并集={1B,BC,C2,3F,FG,G4,5J,JK,K6,7N,NO,O8,21,83,47,65},
左侧边和封口形成的集合为leftSideEdgeAndCapSet=leftSideEdgeSet与leftSideCapSet的并集={A1,2D,DE,E3,4H,HI,I5,6L,LM,M7,8P,PA,12,38,74,56}。
对rightSideEdgeAndCapSet中的边进行组装,可得多边形:1BC2,3FG47NO8,5JK6,
对leftSideEdgeAndCapSet中的边形行组装,可得多边形:A12DE38P,4HI56LM7
(注意,组装过程并不需要比较坐标(比较坐标的方法不但效率低,而且特殊情况还有可能产生错误),只需对线段端点字母进行匹配即可)。
所以凹多边形ABCDEFGHIJKLMNOP被直线(start,end)切割成五个子多边形:1BC2,3FG47NO8,5JK6,A12DE38P,4HI56LM7。
计算完毕。
二,实现
在unity里进行了试验,效果如下:
开源地址:http://git.oschina.net/wantnon2/polygonDiv
python凹多边形分割_直线切割凹多边形相关推荐
- python凹多边形分割_使用Opencv python从Image中裁剪凹面多边形
Steps find region using the poly points create mask using the poly points do mask op to crop add whi ...
- python 字符串分割_如何使用python语言split方法对不同字符串分割
在JavaScript中,可以使用split()将字符串分割成字符串数组:而在python语言中,split()方法也可以将字符串进行分割,分割之后的结果放置在列表中.下面利用几个实例说明split( ...
- python语音分割_用7行Python代码构建自己的有声读物
点击关注我哦 欢迎关注 "小白玩转Python",发现更多 "有趣" 有声读物是我们可以通过音频听取一本书或者其他作品的内容,是现下一种很受欢迎的阅读方式.类似 ...
- python阈值分割_根据阈值分割numpy数组的更快方法
X[~Z]比X[Z==0]快:In [13]: import numpy as np In [14]: X = np.random.random_integers(0, 1000, size=1000 ...
- python集群_使用Python集群文档
python集群 Natural Language Processing has made huge advancements in the last years. Currently, variou ...
- mask rcnn实例分割_使用Mask-RCNN的实例分割
mask rcnn实例分割 In this article, I will be creating my own trained model for detecting potholes. For d ...
- python gis库_使用开放的python库自动化GIS和遥感工作流
python gis库 Over my career I've worked on many geospatial related projects using the ArcGIS platform ...
- 检测和语义分割_分割和对象检测-第5部分
检测和语义分割 有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU's YouT ...
- python 时间序列预测_使用Python进行动手时间序列预测
python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...
- opencv 阈值分割_用 OpenCV 去除图片中的水印,骚操作!
点击上方 小张Python,加为星标 第一时间收到 Python 技术干货! 参考连接:https://stackoverflow.com/questions/32125281/removing-wa ...
最新文章
- 如何ping别人的计算机名来获取IP?
- 手把手带你复现ICCV 2017经典论文—PyraNet
- version control(版本控制)
- MapReduce-流量统计求和-排序-JobMain代码和测试运行
- 老罗android oat,入门ART虚拟机(5)——OAT文件
- AgileEAS.NET平台开发Step By Step系列-药店系统-索引
- vscode remote 第三方库_还能这么玩?用VsCode画类图、流程图、时序图、...不要太爽
- python y轴倒转_python – Config Kivy y轴的反转输入
- 《InsideUE4》GamePlay 架构(二)Level 和 World
- Firebug Console API
- C中取得数组的地址,赋值给数组结构的字段
- java队列类_用Java编写一个队列类
- 一种数字全息散斑干涉测量仿真模拟系统
- 【ViPER音效插件】,完美提升电脑音乐播放效果
- PetaLinux 添加启动后自动执行脚本
- 《蔡康永说话之道》书摘
- 基于Html5 的canvas容器实现定制印章(圆形、椭圆、方形)
- 我家的三个犹太小富豪
- 解读|TARS开源项目发布Go语言版本 1
- 关于语料库中OOV未登录词的处理方式
热门文章
- python调用java之Jpype异常机制
- Linux CPU负载率的计算方式
- linux4755代表什么权限,CentOS下chmod 755和4755的区别是什么?
- mcu,单片机选型以及厂家推荐
- IIS无法启动计算机上的服务W3SVC如何修复、万维网发布服务(w3svc)已停止解决办法
- 电阻和电容式触摸屏区别
- amr转mp3,amr怎么转换mp3?
- 高中计算机教师学期论文,高中信息技术论文范文
- Netbean 打开报 Cannot locate java installation in specified jdkhome: ***错误
- Windows 7 SP1 多国语言包(MUI language packs)官方下载