凹多边形三角剖分算法实现---基于Unity3D

本项目的部分代码参考自下面博客

https://www.cnblogs.com/lan-yt/p/9200621.html

 

最近项目中涉及到使用Unity3D来进行地图上国家的渲染,比如把中国圈起来染成红色的这样的需求。

Unity3D把区域渲染是用的MeshRender,关于MeshRender的用法我就不详细讲解了。

最终问题卡在一个点上,对于中国边界这样的凹多边形,如何将其剖分为一系列三角形。

本来以为这是个最常见的问题,应该会有很多求解方法的,结果我找了半天,就找到了上面给出网址的那个博客,而没找到成形的源码。

还好那个博客上有代码,就按照那个博客上的代码,运行了一下,反正在我电脑上有点小的BUG。

不过这个BUG很容易修改,虽然我忘记我是怎么修改的了,后来运行成功了。

于是,我就找到中国边界数据,把它读进去,然后运行。

等了一会儿,系统爆栈了,因为那个博客中算法用到了递归,而中国边界有八千多个点,一个点递归一次,需要递归八千次。

不得已,只好自己写代码了。

后来看到了一个翻译来自日本的凹多边形剖分算法,耳切法。

博客地址:

https://blog.csdn.net/u010019717/article/details/52753855

根据第二个博客中的思想,来设计如下算法:

步骤一:将多边形的所有点读入数组V中。

步骤二:判断该多边形是否为凸多边形,如果为凸多边形,按照凸多边形剖分算法进行处理,算法结束,否则转到步骤三。

步骤三:将所有顶点的序号读入一个数组A中保存起来,然后遍历多边形的顶点,判断每个顶点是否为“耳朵节点”,然后将所有“耳朵节点”保存到数组B。

步骤四:如果耳朵节点数组B为空或者顶点数组V的顶点数组小于三,则算法结束。否则,取出耳朵节点中的第一个顶点P来。

步骤五:找到该节点的前序节点M和后序节点N,这三个点MPN组成一个三角形,保存到结果数组R中,然后,把当前顶点P从耳朵节点中去掉,从数组V中去掉,从序号数组B中去掉。

步骤六:前序节点M和后序节点N,成为了“耳朵节点”的候选。则分别判断M与N是不是耳朵节点,如果是耳朵节点,且没有在当前的耳朵节点数组B中,则将判断为耳朵节点的点放入耳朵节点数组B中。

步骤七:跳转到步骤四。

 

然后通过以上算法,就得到了最终的结果,这个算法没有使用递归,算法的效率还行。

 

这个是我算法运行的结果。

算法源码:

https://download.csdn.net/download/kongxinyue/11230469

 

 

 

  • 1
    点赞
  • 1
    评论
  • 11
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值