2014-10-28 8 views
0

STL 파일 (삼각형 표면 메쉬)을 가져 와서 메쉬에 점의 밀도가 상수가되도록 메터를 채울 수 있기를 원합니다. 나는 Fortran에서 프로그램을 작성 중이다.점으로 STL 표면 메쉬를 균등하게 채우기

지금까지 바이너리 STL 파일을 읽고 정점과 표면 법선을 저장할 수 있습니다. 다음은 읽은 예제 파일입니다 (단순화를 위해 2D보기). - + B (V3 - V1) (from here)

V1, V2

X = V1 + A (V1, V2)

Example STL file in 2 dimensions.

내 현재 알고리즘은 다음 식을 이용하여 각각의 삼각형을 채운다 , 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

나는 왜 내가 downwvoted에 관해서 혼란 스러웠다. 내가 더 유용하고 명확하게하기 위해 나의 질문을 편집 할 수 있도록 주석이 유용했을 것이다. 등방성을 달성하는 것이 까다로울 것이라고 생각합니다. 아프지 만 각 평면/삼각형의 볼륨을 제안하고 연습하십시오. 그로부터 구역 당 입자의 수가 일정하다는 것을 확인하고 시도하십시오. – 1QuickQuestion

+1

벡터 v12/간격과 v13/간격으로 만든 사변형이 정의 된 영역을 갖도록 간격을 조정하십시오. Btw. Fortran 2008에는 벡터의 길이를 쉽게 계산할 수있는 'norm2'함수가 있습니다. –

답변

0

해결 방법은 각 삼각형을 두 개의 직각 삼각형으로 분할하는 것입니다. 이것은 가장 긴 가장자리 반대편에있는 vetex를 가장 긴 가장자리에 직각으로 투영함으로써 수행됩니다. 이것은 trianlge를 각각 90도 각도의 두 개의 작은 삼각형으로 나눕니다. 이를 수행하는 방법에 대한 자세한 대답은 here입니다. 양쪽 90 ° 굴곡을 따라 점을 생성함으로써 균일 한 입자 분포를 얻을 수 있습니다.

이 방법은 입자가 여러 삼각형에 공통 인 가장자리를 따라 두 번 이상 생성되지 않도록 조정해야합니다. 나는 아직 이것을하지 않았다. 결과는 아래 이미지를 참조하십시오. 이 솔루션은 등방 분포를 달성하지 못하지만, 이것은 의도 된 어플리케이션에 대한 관심이 아닙니다.

(norm2에 대한 그의 의견과 조언에 대해 블라디미르 F에게 감사 드리며, 나는 그의 접근 방식을 구현하려했지만 제대로 작동하지는 못했습니다). 그들 중 일부는 자리에 있었지만

enter image description here