STL 파일 (삼각형 표면 메쉬)을 가져 와서 메쉬에 점의 밀도가 상수가되도록 메터를 채울 수 있기를 원합니다. 나는 Fortran에서 프로그램을 작성 중이다.점으로 STL 표면 메쉬를 균등하게 채우기
지금까지 바이너리 STL 파일을 읽고 정점과 표면 법선을 저장할 수 있습니다. 다음은 읽은 예제 파일입니다 (단순화를 위해 2D보기). - + B (V3 - V1) (from here)
V1, V2
X = V1 + A (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 정말 너무 민감한 것 같다. 단위 상자의 면적 (부피)이 일정하도록 간격을 변경하려고 할 수 있습니까? 용액은 등방성이 아니지만 농도는 일정해야합니다. –
나는 왜 내가 downwvoted에 관해서 혼란 스러웠다. 내가 더 유용하고 명확하게하기 위해 나의 질문을 편집 할 수 있도록 주석이 유용했을 것이다. 등방성을 달성하는 것이 까다로울 것이라고 생각합니다. 아프지 만 각 평면/삼각형의 볼륨을 제안하고 연습하십시오. 그로부터 구역 당 입자의 수가 일정하다는 것을 확인하고 시도하십시오. – 1QuickQuestion
벡터 v12/간격과 v13/간격으로 만든 사변형이 정의 된 영역을 갖도록 간격을 조정하십시오. Btw. Fortran 2008에는 벡터의 길이를 쉽게 계산할 수있는 'norm2'함수가 있습니다. –