我希望能够获取STL文件(三角形曲面网格)并使用点填充网格,使得点的密度保持不变。我正在Fortran编写程序。
到目前为止,我可以读取二进制STL文件并存储顶点和曲面法线。这是一个已读入的示例文件(为简单起见,2D视图)。
我当前的算法使用以下公式填充每个三角形:
x = v1 + a(v2 - v1)+ b(v3 - v1)(from here)
其中v1,v2,v3是三角形的顶点,x是三角形内(或边缘上)的任意位置。 “a”和“b”在0和1之间变化,它们的总和小于1.它们表示沿两条边(从同一顶点开始)的距离。每个边缘的颗粒之间的间隙应该相同。以下是我得到的结果示例:
如果没有接近均匀,则得到的颗粒密度。您是否知道如何调整我的代码以使密度从三角形到三角形不变?相关代码如下:
! Do for every triangle in the STL file
DO i = 1, nt
! The distance vector from the second point to the first
v12 = (/v(1,j+1)-v(1,j),v(2,j+1)-v(2,j),v(3,j+1)- v(3,j)/)
! The distance vector from the third point to the first
v13 = (/v(1,j+2)-v(1,j),v(2,j+2)-v(2,j),v(3,j+2)- v(3,j)/)
! The scalar distance from the second point to the first
dist_a = sqrt( v12(1)**2 + v12(2)**2 + v12(3)**2 )
! The scalar distance from the third point to the first
dist_b = sqrt( v13(1)**2 + v13(2)**2 + v13(3)**2 )
! The number of particles to be generated along the first edge vector
no_a = INT(dist_a / spacing)
! The number of particles to be generated along the second edge vector
no_b = INT(dist_b / spacing)
! For all the particles to be generated along the first edge
DO a = 1, no_a
! For all the particles to be generated along the second edge
DO b = 1, no_b
IF ((REAL(a)/no_a)+(REAL(b)/no_b)>1) EXIT
temp(1) = v(1,j) + (REAL(a)/no_a)*v12(1) + (REAL(b)/no_b)*v13(1)
temp(2) = v(2,j) + (REAL(a)/no_a)*v12(2) + (REAL(b)/no_b)*v13(2)
temp(3) = v(3,j) + (REAL(a)/no_a)*v12(3) + (REAL(b)/no_b)*v13(3)
k = k + 1
s_points(k, 1:3) = (/temp(1), temp(2), temp(3)/)
END DO
END DO
j = j + 3
END DO
答案 0 :(得分:0)
我采用的解决方案是将每个三角形分成两个直角三角形。这是通过将与最长边相对的vetex正交投影到最长边上来完成的。这将三角形分成两个较小的三角形,每个三角形具有90度角。有关如何执行此操作的详细答案可以在here找到。通过沿两个90°弯曲产生点,可以实现颗粒的均匀分布。
需要调整此方法,以便沿着多个三角形共有的边缘不会生成多于一次的粒子。我还没有这样做。有关结果,请参见下图。此解决方案无法实现各向同性分布,但这不是我预期应用的关注点。
(感谢Vladimir F对norm2的评论和建议,我尝试实施他的方法,但没有足够的能力让它发挥作用)。