【Houdini】포인트 번호를 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
Reference
이 문제에 관하여(【Houdini】포인트 번호를 VEX로 정렬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/harayoki/items/251eb886316a21d9846a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)