用点均匀地填充STL表面网格

时间:2014-10-28 11:43:48

标签: fortran computational-geometry particles

我希望能够获取STL文件(三角形曲面网格)并使用点填充网格,使得点的密度保持不变。我正在Fortran编写程序。

到目前为止,我可以读取二进制STL文件并存储顶点和曲面法线。这是一个已读入的示例文件(为简单起见,2D视图)。

Example STL file in 2 dimensions.

我当前的算法使用以下公式填充每个三角形:

x = v1 + a(v2 - v1)+ b(v3 - v1)(from here)

其中v1,v2,v3是三角形的顶点,x是三角形内(或边缘上)的任意位置。 “a”和“b”在0和1之间变化,它们的总和小于1.它们表示沿两条边(从同一顶点开始)的距离。每个边缘的颗粒之间的间隙应该相同。以下是我得到的结果示例: Example STL file in 2 dimensions populated with points

如果没有接近均匀,则得到的颗粒密度。您是否知道如何调整我的代码以使密度从三角形到三角形不变?相关代码如下:

        ! 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 

1 个答案:

答案 0 :(得分:0)

我采用的解决方案是将每个三角形分成两个直角三角形。这是通过将与最长边相对的vetex正交投影到最长边上来完成的。这将三角形分成两个较小的三角形,每个三角形具有90度角。有关如何执行此操作的详细答案可以在here找到。通过沿两个90°弯曲产生点,可以实现颗粒的均匀分布。

需要调整此方法,以便沿着多个三角形共有的边缘不会生成多于一次的粒子。我还没有这样做。有关结果,请参见下图。此解决方案无法实现各向同性分布,但这不是我预期应用的关注点。

(感谢Vladimir F对norm2的评论和建议,我尝试实施他的方法,但没有足够的能力让它发挥作用)。

enter image description here