一,算法原理

以上图为例,直线(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凹多边形分割_直线切割凹多边形相关推荐

  1. python凹多边形分割_使用Opencv python从Image中裁剪凹面多边形

    Steps find region using the poly points create mask using the poly points do mask op to crop add whi ...

  2. python 字符串分割_如何使用python语言split方法对不同字符串分割

    在JavaScript中,可以使用split()将字符串分割成字符串数组:而在python语言中,split()方法也可以将字符串进行分割,分割之后的结果放置在列表中.下面利用几个实例说明split( ...

  3. python语音分割_用7行Python代码构建自己的有声读物

    点击关注我哦 欢迎关注 "小白玩转Python",发现更多 "有趣" 有声读物是我们可以通过音频听取一本书或者其他作品的内容,是现下一种很受欢迎的阅读方式.类似 ...

  4. python阈值分割_根据阈值分割numpy数组的更快方法

    X[~Z]比X[Z==0]快:In [13]: import numpy as np In [14]: X = np.random.random_integers(0, 1000, size=1000 ...

  5. python集群_使用Python集群文档

    python集群 Natural Language Processing has made huge advancements in the last years. Currently, variou ...

  6. mask rcnn实例分割_使用Mask-RCNN的实例分割

    mask rcnn实例分割 In this article, I will be creating my own trained model for detecting potholes. For d ...

  7. python gis库_使用开放的python库自动化GIS和遥感工作流

    python gis库 Over my career I've worked on many geospatial related projects using the ArcGIS platform ...

  8. 检测和语义分割_分割和对象检测-第5部分

    检测和语义分割 有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU's YouT ...

  9. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  10. opencv 阈值分割_用 OpenCV 去除图片中的水印,骚操作!

    点击上方 小张Python,加为星标 第一时间收到 Python 技术干货! 参考连接:https://stackoverflow.com/questions/32125281/removing-wa ...

最新文章

  1. 如何ping别人的计算机名来获取IP?
  2. 手把手带你复现ICCV 2017经典论文—PyraNet
  3. version control(版本控制)
  4. MapReduce-流量统计求和-排序-JobMain代码和测试运行
  5. 老罗android oat,入门ART虚拟机(5)——OAT文件
  6. AgileEAS.NET平台开发Step By Step系列-药店系统-索引
  7. vscode remote 第三方库_还能这么玩?用VsCode画类图、流程图、时序图、...不要太爽
  8. python y轴倒转_python – Config Kivy y轴的反转输入
  9. 《InsideUE4》GamePlay 架构(二)Level 和 World
  10. Firebug Console API
  11. C中取得数组的地址,赋值给数组结构的字段
  12. java队列类_用Java编写一个队列类
  13. 一种数字全息散斑干涉测量仿真模拟系统
  14. 【ViPER音效插件】,完美提升电脑音乐播放效果
  15. PetaLinux 添加启动后自动执行脚本
  16. 《蔡康永说话之道》书摘
  17. 基于Html5 的canvas容器实现定制印章(圆形、椭圆、方形)
  18. 我家的三个犹太小富豪
  19. 解读|TARS开源项目发布Go语言版本 1
  20. 关于语料库中OOV未登录词的处理方式

热门文章

  1. python调用java之Jpype异常机制
  2. Linux CPU负载率的计算方式
  3. linux4755代表什么权限,CentOS下chmod 755和4755的区别是什么?
  4. mcu,单片机选型以及厂家推荐
  5. IIS无法启动计算机上的服务W3SVC如何修复、万维网发布服务(w3svc)已停止解决办法
  6. 电阻和电容式触摸屏区别
  7. amr转mp3,amr怎么转换mp3?
  8. 高中计算机教师学期论文,高中信息技术论文范文
  9. Netbean 打开报 Cannot locate java installation in specified jdkhome: ***错误
  10. Windows 7 SP1 多国语言包(MUI language packs)官方下载