후디니 튜토리얼 소개/팁

연결된 점들에서 마지막 점 선택하기

정재화 2020. 7. 22. 17:18
728x90
반응형

연결된 점들에서 마지막 점 선택하기

오디포스에서 찾아서 공부하고 있는 내용입니다.

아래 그림처럼 마지막 점들만 찾는 방법을 Alvaro씨가 질문했습니다.

Henry씨가 아래와 같이 neighbours 함수를 사용하는 팁을 알려주었네요.

int n = neighbours(0, @ptnum);
if(len(n) < 2) {
    @group_ends = 1;
}

Henry씨는 MOPs를 개발한 분으로 유명하죠.

 

Alvaro씨가 다시 질문을 합니다.

"고마워 헨리. 하지만 그 방법으로 하니까 안되요.😥"

 

그러면서 neighbours( ) 함수에 대해 궁금증을 던집니다.

 

잠시후 러시아의 Victor Sh씨가

neighbours 함수는 array 로 반환해준다고 알려주면서

Henry가 타입에 대한 부분을 잘 못했다고 알려주네요.

 

그랬더니 독일에 Konstantin 씨가 Point Wrangle 또는 Group Expression SOP을 통해

사용해보길 권합니다.

neighbourcount(0, @ptnum) < 2

간결해졌습니다.

 

Alvaro씨는 바로 어썸~을 날리며 Victor씨에게 고맙다와 함께

바꾼 코드를 보여줍니다.

int n []= neighbours(0 , @ptnum);

if(len(n) < 2) {
    @group_ends = 1;
}

그러면서 Konstantin씨가 말한게 더 쉽게 되었다고

더불어 말해줍니다.

if(neighbourcount(0, @ptnum) < 2)
{
    @group_ends = 1;
}

 

칭찬은 고래도 춤추게 한다하죠.

Konstantin씨가 바로 다른 방법을 제안해줍니다.

i@group_ends = neighbourcount(0, @ptnum) < 2;

그러자 잠시후 오하이오에 살고 있는 AtomicPerception님이 예시를 들어줍니다.

// @ptnum is zero based.
if (@ptnum==(@numpt-1)){i@group_ends=1;}

좋은 방법입니다.

 

그러자 뉴욕에 Tomas씨는 아래와 같은 코드로 변경해 보여줍니다.


no loops necessary and you should try to avoid them if you can

also first point of the primitive doesn't guarantee that it's at the start or at the end or even that the primitive has any start or end if it's closed, so you are better off using points belonging to first or last vertex and either checking if the prim is closed or using the neighbourcount() test

so to detect all you can combine first test with test whether point belongs to the first or the last vertex of the primitive

int pts[] = primpoints(0, @primnum);
int isend = neighbourcount(0, @ptnum) == 1;
int isfirst = @ptnum == pts[0];
int islast = @ptnum == pts[-1];

i@group_ends = isend;
i@group_start = isend && isfirst;
i@group_end = isend && islast;
int pts[] = primpoints(0, @primnum);
int isopen = !primintrinsic(0, "closed", @primnum);
int isfirst = @ptnum == pts[0];
int islast = @ptnum == pts[-1];

i@group_ends = isopen && (isfirst || islast);
i@group_start = isopen && isfirst;
i@group_end = isopen && islast;

 

다음날 AtomicPerception씨께서 구현해서 보여줍니다.

728x90
반응형