2014-10-28 3 views
0

Я хотел бы иметь возможность взять файл STL (триангулированную поверхностную сетку) и заполнить сетку точками так, чтобы плотность точек была постоянной. Я пишу программу в Фортране.Настраивая поверхностную сетку STL равномерно с точками

До сих пор я мог читать в двоичных файлах STL и хранить вершины и нормали поверхности. Вот пример файла, который был прочитан (2D-просмотр для простоты).

Example STL file in 2 dimensions.

Мой текущий алгоритм заполняет каждый треугольник, используя следующую формулу:

х = v1 + а (v2 - v1) + Ь (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

Люди, кажется, действительно слишком чувствительны с downvotes в последние дни, хотя некоторые из них были на месте. Можете ли вы попытаться изменить интервал так, чтобы область (объем) блока единицы была постоянной? Решение не будет изотропным, но плотность должна быть постоянной. –

+0

Я был в замешательстве относительно того, почему меня опустили, комментарий был бы полезен, поэтому я мог бы изменить свой вопрос, чтобы сделать его более полезным/понятным. Я думаю, было бы сложно достичь изотропии. Я стараюсь, как вы предлагаете, и выработать объем каждой плоскости/треугольника. Исходя из этого, попробуйте и убедитесь, что количество частиц в области постоянное. – 1QuickQuestion

+1

Попробуйте масштабировать расстояние так, чтобы четырехугольник, сделанный из векторов v12/расстояние и v13/расстояние, имел определенную область. Btw. в Fortran 2008 существует функция 'norm2', которая может использоваться для легкого вычисления длины вектора. –

ответ

0

Решение, с которым я пошел, заключалось в том, чтобы разделить каждый треугольник на два прямоугольных треугольника. Это делается путем проецирования ветекса напротив самого длинного края ортогонально на самый длинный край. Это разбивает треугольник на два меньших треугольника, каждый с углом 90 градусов. Подробный ответ о том, как это сделать, можно найти: here. Путем создания точек вдоль обоих изгибов 90 ° можно добиться равномерного распределения частиц.

Этот метод необходимо адаптировать, чтобы частицы не генерировались более одного раза по краям, которые являются общими для нескольких треугольников. Я еще этого не делал. См. Изображение ниже для получения результатов. Это решение не достигает изотропного распределения, но это не является проблемой для моего предполагаемого применения.

(Спасибо Владимиру Ф за его комментарии и рекомендации по норме2, я попытался реализовать его подход, но не был достаточно компетентен, чтобы заставить его работать).

enter image description here