【Houdini】포인트 번호를 VEX로 정렬

8653 단어 VEXHOUDINI
vex를 사용해 포인트를 임의의 룰로 소트 하려고 생각하면 조금 수고했으므로 메모해 둡니다.

우선 sort SOP로 대답 맞추기



서클에 scatter 해 sortSOP 에 Y축의 값으로 소트시킨 것이 이쪽입니다.



vex에서 정렬



이러한 코드로 정렬했습니다. ranover는 detail입니다. 고급 언어의 정렬 함수에 해당하는 것은 존재하지 않기 때문에, argsort 함수로 다른 배열에 정렬이 끝난 순서를 대입하는 것으로 정렬 처리의 대신으로 합니다. argsort 함수는 문자 코드와 숫자의 내림차순으로만 정렬 할 수있는 것 같습니다.
float pos_arr[] = {}; // y座標の配列
for(int i=0;i<@numpt;i++) {
    vector p = point(0, "P", i);
    push(pos_arr, p.y);
}
int ordering[] = argsort(pos_arr); // 数値が大きい順にポイント番号(ただしくは配列のインデックス番号)を格納する
ordering = reverse(ordering); // 小さい順にしたいので反転する。

// visualizeさせるために適当なアトリビュートに代入する
//(ordering配列のまま処理を進めるだけならばこの処理は必要ない)
for(int i=0;i<@numpt;i++) {
    setpointattrib(0, "sort_index", ordering[i], i);
}

sort_index를 visialize 한 것이 여기입니다.



visualize를 위해 sort_index 속성을 설정했지만 일반적으로 위의 코드에서 ordering에 해당하는 배열에 정렬 된 포인트 번호가 들어 있기 때문에 그것을 그대로 사용합니다.

또 다른 요소로 정렬



argsort 함수(및 sort SOP)는 stable sort 라고 해, 평가 순위가 같은 것은 원래의 순서를 유지한 채의 소트 구현이라고 합니다. 즉, 다른 요소로 2번째의 정렬을 해도 같은 우선순위를 가지는 부분에서는 1번째의 정렬 순서를 유지할 것입니다.

원에서는 알기 어렵기 때문에 2x2의 그리드를 준비합니다.



상단 왼쪽에서 그리드 작성시 그대로, SortSOP에 의한 Y 좌표 오름차순 정렬, SortSOP에 의한 X 좌표 내림차순 정렬의 순서에 대응한 것, 하단은 그리드 그대로를 SortSOP에 의한 X 좌표 내림차순 정렬만 대응한 것입니다. 맨 오른쪽 상단의 그리드에서는 포인트 번호가 오른쪽 방향에서 그리고 위 방향에서 나란히 있는 것을 확인할 수 있습니다.

이것을 vex로 동등한 처리를 해 보겠습니다.
float pos_arr[] = {};
int ordering[];
vector p;

// y座標を収集
for(int i=0;i<@numpt;i++) {
    p = point(0, "P", i);
    push(pos_arr, p.y);
}

// y軸で降順ソートして昇順に変換
ordering = reverse(argsort(pos_arr));

// x座標を収集
pos_arr = {};
for(int i=0;i<@numpt;i++) {
    p = point(0, "P", ordering[i]);
    push(pos_arr, p.x);
}
// x軸で降順ソートして昇順に変換
ordering = reverse(argsort(pos_arr));

for(int i=0;i<@numpt;i++) {
    setpointattrib(0, "index", ordering[i], i);
}


요구하고 있는 상태가 되었습니다.

sort SOP의 파라미터 설정으로는 대응할 수 없는 복잡한 소트에서도, vex 라면 대응시킬 수 있을 것 같습니다.

실제로 포인트 번호를 정렬 순서로 할당하고 싶습니다.



프로그램으로 그대로 처리하는 경우는 ordering 배열을 그대로 취급하면 됩니다만, 실제로 포인트 번호를 바꾸고 싶은 경우는, sort SOP에 애트리뷰트를 바탕으로 정렬시켜 버리는 것이 간단합니다.



이것을 vex 로 하려면 , 포인트의 위치를 ​​바꿔, 정점을 다시 연결하면 가능한 생각은 합니다. 해보시겠습니까?

고찰



이번에는 0부터 나란한 포인트 번호를 정렬시켰기 때문에 필요 없었다(ordering 배열을 원하는 것 그 자체였다)이지만, 임의의 요소를 정렬시켰을 경우, reorder 함수로 소트 끝난 임의의 배열을 얻는 처리 필요합니다.
참고 vex : argsort

좋은 웹페이지 즐겨찾기