2014-02-09 8 views
1

가 시작되도록 "v2_p"모든 포인트의 목록에서 모든 삼각형의 목록Octave의 주문 된 여과 목록에 Delaunay 삼각형 목록을 어떻게 주문합니까?

v2_T = delaunay(v2_p) 

을 감안할 때

v2_N = neighbors(v2_T) 

가 어떻게 "v2_T"을 주문할 수있는 모든 삼각형 이웃의 목록을 제공 첫 번째 삼각형이 올라가고, "v2_T"에서 찾은 다음 삼각형은 항상 이전에 나열한 하나 이상의 삼각형 이웃을 가질 것입니다. 비슷한 작업을 수행하는 closet 함수는 이진 트리 검색 또는 재귀 알고리즘과 관련된 것일 수 있습니다.

샘플 옥타브 코드를 제공 할 수 있습니까? 감사.

답변

0

위의 질문에 대한 저의 커밋되지 않은 해결책은 다음과 같습니다. 이것은 파일 이름 "dlf_percolate.cc"로 C++로 작성된 Octave의 동적 링크 기능입니다. 이 함수를 컴파일하려면 octave 터미널에 system 명령 ('mkoctfile filedirectory/dlf_percolate.cc') 또는 mkoctfile "filedirectory/dlf_percolate.cc"명령을 사용하십시오. 여기서 파일 디렉토리 "filedirectory"를 지정해야합니다. dlf_percolate.cc "가 저장됩니다. v1_I = dlf_percolate (v2_N) 함수를 테스트하려면 v2_N = neighbors (v2_T)의 생성 된 목록이 필요합니다. 여기서 v2_T는 생성 된 delaunay 삼각형 목록이고 neighbors()는 아직 Octave에없는 함수입니다. 이웃 v2_N은 "msh"패키지 http://octave.sourceforge.net/msh/에서 사용되는 함수를 사용하여 계산할 수 있습니다. 하나가 v2_N을 가졌 으면 수퍼 콜렉션 된 삼각형 숫자 순서를 v1_I = dlf_percolate (v2_N, v_first_neigh)로 계산할 수 있습니다. 여기서 "v_first_neigh"는 나열된 삼각형 "v1_I"의 계산 순서를 계산하기위한 첫 번째 삼각형입니다.

#include <octave/oct.h> 
void func_perc 
    (
     Matrix & v2_neigh_list 
     , 
     ColumnVector & v1_perc_list 
     , 
     ColumnVector & b1_toggled_neigh 
     , 
     int & v0_perc_index 
     , 
     int v0_next_neigh 
    ) ; 
DEFUN_DLD (dlf_percolate, args, , 
"Returns a list of sorted indices of the neighbors in percolated order." 
) { 
    int v0_first_neigh = 1 ; 
    switch(args.length()) 
    { 
    case 1: 
     // v0_first_neigh = 1 default value 
     break; 
    case 2: 
     v0_first_neigh = args(1).scalar_value() ; 
     break; 
    default: 
     error("Only one or two inputs are needed!") ; 
     return args; 
     break; 
    } 
    octave_value_list o1_retval ; 
    Matrix v2_neigh_list = args(0).matrix_value() ; 
    int v0_cols = v2_neigh_list.cols(); 
    int v0_rows = v2_neigh_list.rows(); 
    if((v0_first_neigh <= 0) || (v0_rows < v0_first_neigh)) 
    { 
     error("v0_first_neigh must be a valid member of the list!") ; 
     return args; 
    } 
    ColumnVector v1_perc_list(v0_rows,0); 
    ColumnVector b1_toggled_neigh(v0_rows,false); 
    int v0_perc_index = 0 ; 
    func_perc 
     (
      v2_neigh_list 
      , 
      v1_perc_list 
      , 
      b1_toggled_neigh 
      , 
      v0_perc_index 
      , 
      v0_first_neigh 
     ) ; 
    o1_retval(0) = v1_perc_list ; 
    return o1_retval ; 
} 
void func_perc 
    (
     Matrix & v2_neigh_list 
     , 
     ColumnVector & v1_perc_list 
     , 
     ColumnVector & b1_toggled_neigh 
     , 
     int & v0_perc_index 
     , 
     int v0_next_neigh 
    ) 
    { 
     if 
      (
       (v0_next_neigh > 0) 
       && 
       ((v0_perc_index) < v1_perc_list.length()) 
       && 
       (b1_toggled_neigh(v0_next_neigh - 1) == false) 
      ) 
      { 
       v1_perc_list(v0_perc_index) = v0_next_neigh ; 
       v0_perc_index++; 
       b1_toggled_neigh(v0_next_neigh - 1) = true ; 
       for(int v0_i = 0 ; v0_i < v2_neigh_list.cols() ; v0_i++) 
        { 
         func_perc 
          (
           v2_neigh_list 
           , 
           v1_perc_list 
           , 
           b1_toggled_neigh 
           , 
           v0_perc_index 
           , 
           v2_neigh_list(v0_next_neigh - 1 , v0_i) 
          ) ; 
        } 
      } 
     return ; 
    } 

계산 된 퍼콜 레이션 경로에는 재귀 알고리즘이 포함되어야합니다. 그렇지 않은 경우 최소한 재귀는 이러한 유형의 문제를 해결하기위한 코드 구현을 용이하게합니다. 옥타브 스크립트에서이 함수를 위해 설계 한 첫 번째 빌드는 재귀 알고리즘의 각 단계에서 점진적으로 느리게 실행되는 Octave 함수를 반복적으로 호출했습니다. 필자는 옥타브 함수의 재귀가 해석 언어의 기능적 오버 헤드 때문에 매우 효율적이지 않다고 믿습니다. Octave 용 C++로 원시 함수를 작성하는 것은 재귀 알고리즘을 효율적으로 구현하는 좋은 방법입니다. C++ 함수 func_perc()는 dlf_percolate()에서 사용되는 재귀 알고리즘입니다.