故事要从5月中旬说起,项目里刚好遇到一个3D数学类的问题,就用工作外学习3D数学的时间搞起了研究,断断续续花了两周的时间,弯弯绕绕,最后发现就是个很简单的定理型问题,挺有意思的,嗯...趁着端午的尾巴记录一下吧!
目录
#由于项目保密,没办法提供示意图,这里就用鼠标简单绘制要表达的内容。
待解决的问题
已知一张地图里面有很多的patch片(这些patch片本质上就相当于没有厚度的brush),如图1。但有可能因为平时美术师的误操作,导致这个patch片会在merge点的时候,点与点重合成一条线,这样会造成性能的浪费,是需要避免的,如图2。我们的工具目的就是检查出这种有悬浮点的patch片。
![](https://img-blog.csdnimg.cn/a1254a58991a4c06a7beb99af5540d80.png)
![](https://img-blog.csdnimg.cn/b8e6e4a4ca7043b280635c2e9a88fc09.png)
解决办法
这是很典型的检查退化三角形问题。这道题表面上是在找点与点重合,实际上可以把这个问题转述为如何找到面积为0的三角形。我们可以根据Map文件提供的信息,获知每个点的坐标,根据每个点与之相关联两个点组成的三角形,判断此三角形是否存在两边之和等于第三边的情况。
如果存在,说明三点共线,三角形面积为0,则为退化三角形。不过由于这里是检查悬浮的点,那么可以不考虑片内的退化三角形,对点的范围约束在边缘就可以了。
写成python就是这个样子:
#待更新
过程分析
虽然“判断是否为退化三角形”,其实是一个图形学很常见很简单的问题。但当我们还不知道这是什么,又必须解决这类Troubleshooting问题的时候,通常,可以先从找规律找不同入手,观察是否能先从逻辑层直接解决它,对比有问题的和没问题之间有什么不同,进而找到内在规律、写出工具。所以最开始,笔者也是发现只要错误的patch片一定存在两行及以上的横轴或竖轴的点坐标一样,但是发现不能倒推回来,并不是个充要条件,走不通。
所谓的规律无法推导出结论,再从原理出发,这个问题也是同理。走了很多弯路,从判断点是否在多边形上(point in polygon问题),看到图形学中如何三角化,电脑如何绘制出三角形,发现逐渐走偏,最终通过转述问题(换种问法,找面积为0的三角形)进而找到退化三角形(degnerated triangles)这个定义。问题解决√
优化改进
本质上,还是知识不成体系,了解得不多。所以3D数学知识的学习继续推进呢!