凹多边形三角剖分算法实现---基于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

 

 

 

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
多边形三角剖分算法可以使用Delaunay三角剖分算法。Delaunay三角剖分算法是一种较为优秀的三角剖分算法,它将多边形划分为一组不重叠的三角形,且保证了生成的三角形的外接圆不包含任何其他顶点。这样的剖分具有良好的性质和稳定性。 实现Delaunay三角剖分算法通常有以下几个步骤:首先,选择一个起始点,然后按照某种规则依次遍历多边形的所有顶点。在每一次遍历中,判断当前的三个顶点是否可以构成一个三角形,并且判断该三角形的第三边是否在多边形内部。如果满足条件,就进行三角形的剖分,并将第二个顶点移除,在下一次遍历时继续判断剩余的顶点。如果不满足条件,则将三个顶点向后移动一位,继续下一次的剖分。当遍历完成后,回到起始点,完成所有的三角剖分。 要实现多边形三角剖分算法,你可以使用以上的步骤作为参考,并根据具体的编程语言和需求进行代码实现。可以根据Delaunay三角剖分的原理,从起始点开始遍历多边形的顶点,判断每组三个顶点是否满足构成三角形的条件,然后进行剖分。最后,通过合适的数据结构存储剖分后的三角形,并进行必要的输出或进一步处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [三角剖分算法](https://blog.csdn.net/weixin_45963815/article/details/118894886)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值