最近项目中涉及到使用Unity3D来进行地图上国家的渲染,比如把中国圈起来染成红色的这样的需求。
Unity3D把区域渲染是用的MeshRender,关于MeshRender的用法我就不详细讲解了。
最终问题卡在一个点上,对于中国边界这样的凹多边形,如何将其剖分为一系列三角形。
本来以为这是个最常见的问题,应该会有很多求解方法的,结果我找了半天,就找到了上面给出网址的那个博客,而没找到成形的源码。
还好那个博客上有代码,就按照那个博客上的代码,运行了一下,反正在我电脑上有点小的BUG。
不过这个BUG很容易修改,虽然我忘记我是怎么修改的了,后来运行成功了。
于是,我就找到中国边界数据,把它读进去,然后运行。
等了一会儿,系统爆栈了,因为那个博客中算法用到了递归,而中国边界有八千多个点,一个点递归一次,需要递归八千次。
不得已,只好自己写代码了。
后来看到了一个翻译来自日本的凹多边形剖分算法,耳切法。
博客地址:
根据第二个博客中的思想,来设计如下算法:
步骤一:将多边形的所有点读入数组V中。
步骤二:判断该多边形是否为凸多边形,如果为凸多边形,按照凸多边形剖分算法进行处理,算法结束,否则转到步骤三。
步骤三:将所有顶点的序号读入一个数组A中保存起来,然后遍历多边形的顶点,判断每个顶点是否为“耳朵节点”,然后将所有“耳朵节点”保存到数组B。
步骤四:如果耳朵节点数组B为空或者顶点数组V的顶点数组小于三,则算法结束。否则,取出耳朵节点中的第一个顶点P来。
步骤五:找到该节点的前序节点M和后序节点N,这三个点MPN组成一个三角形,保存到结果数组R中,然后,把当前顶点P从耳朵节点中去掉,从数组V中去掉,从序号数组B中去掉。
步骤六:前序节点M和后序节点N,成为了“耳朵节点”的候选。则分别判断M与N是不是耳朵节点,如果是耳朵节点,且没有在当前的耳朵节点数组B中,则将判断为耳朵节点的点放入耳朵节点数组B中。
步骤七:跳转到步骤四。
然后通过以上算法,就得到了最终的结果,这个算法没有使用递归,算法的效率还行。
这个是我算法运行的结果。
算法源码: