暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Triangle Point Picking

写程序的日子 2021-08-03
862

去年,基于Revit做了一个三角形点填充的程序,试图从BIM 模型生成点云数据。形如:

其最核心的思路是:尽量以固定间距去划分三角形(所以从上图也可以看出,每个三角形内点的分布四四方方的)。

如图:

今天用C++ 做了类似的功能(三角形点填充,以及耳裁法),用于C# 绑定以及python绑定。

此时,想起 open3D 有个sample_points_uniformly
可以实现类似的点填充。

可以看出来,他是随机的:

所以就在思考,该如何实现随机?至少说,看上去是随机填充的,或者理论上的随机填充。

当然首先是看open3d 的C++ 实现:

从这段代码来看,他计算了整个模型的表面积:通过每个三角形面积占表面积的百分比,来计算该三角形需要多少个点来填充(落脚点都是三角形的点填充)

以上部分是SamplePointsUniformlyImpl
函数内部用于随机填充点的部分。
简化逻辑后通过python 实现的函数可以如下:

分割后的效果大致为:



从结果来看,是比较均匀的。

所以,至此,一开始的疑问(如何实现)就解决。

但同样产生了问题:是哪种方法论,让此处三角形的点填充,可以这么的均匀?

因为我并不能明白为何要做一个math.sqrt
操作。

尝试去除开根号,结果明显不均匀了。

猜测这应该是一个纯数学的问题,而代码只是它的实现,并且这个数学问题相对而言,比较冷门(亦或者,难以接触到)

https://stackoverflow.com/questions/68493050/sample-uniformly-random-points-within-a-triangle

stackoverflow上也同样有人提问,于是乎转移到了新的科普介绍:

https://mathworld.wolfram.com/TrianglePointPicking.html

可以看出,这里是一个数学结论和证明方面的网站,并且该连接重点讲述如何从三角形中均匀随机选取点。

PS:不得不说,IT 从业者的数学很重要

文章转载自写程序的日子,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论