Я хотел бы иметь возможность взять файл STL (триангулированную поверхностную сетку) и заполнить сетку точками так, чтобы плотность точек была постоянной. Я пишу программу в Фортране.Настраивая поверхностную сетку STL равномерно с точками
До сих пор я мог читать в двоичных файлах STL и хранить вершины и нормали поверхности. Вот пример файла, который был прочитан (2D-просмотр для простоты).
Мой текущий алгоритм заполняет каждый треугольник, используя следующую формулу:
х = v1 + а (v2 - v1) + Ь (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
Люди, кажется, действительно слишком чувствительны с downvotes в последние дни, хотя некоторые из них были на месте. Можете ли вы попытаться изменить интервал так, чтобы область (объем) блока единицы была постоянной? Решение не будет изотропным, но плотность должна быть постоянной. –
Я был в замешательстве относительно того, почему меня опустили, комментарий был бы полезен, поэтому я мог бы изменить свой вопрос, чтобы сделать его более полезным/понятным. Я думаю, было бы сложно достичь изотропии. Я стараюсь, как вы предлагаете, и выработать объем каждой плоскости/треугольника. Исходя из этого, попробуйте и убедитесь, что количество частиц в области постоянное. – 1QuickQuestion
Попробуйте масштабировать расстояние так, чтобы четырехугольник, сделанный из векторов v12/расстояние и v13/расстояние, имел определенную область. Btw. в Fortran 2008 существует функция 'norm2', которая может использоваться для легкого вычисления длины вектора. –