getColor를 제외한 나머지 코드 부분은 사실 별 거 없어.

PVector라는 것도 그냥 Processing에서 하나의 점 좌표를 보관/표현하기 위한 구조체인 것으로 보이고.


그 외에 자세히 설명하진 않겠지만, ArcPath.display()는 맨 처음에 그려지는 활꼴들의 선을 그리는 함수이고.

프로세싱에서 제공해 주는 arc() 함수로 활꼴 객체가 담는 정보대로 선을 그려주는 거야.


이제 ArcPath.getColor 함수를 자세히 보면,

  color getColor() {     int index = min(c.length-2, (int)((c.length-1)*t));     float ct = min(1.0, (t-(1.0/(c.length-1))*index)*(c.length-1));     return lerpColor(c[index], c[index+1], ct);        }

이렇게 되어 있는데,

lerpColor 함수는 아까 설명했으니까 생략하고. index와 ct의 의미는 다음 그림을 봐.



ti는 내가 넣어본 가상의 값인데, 0, 1, 2 값이 0.0, 0.5, 1.0으로 변환된다고 할 때 0.0, 0.5, 1.0을 ti로 놓고 그 공식을 보여주기 위해서

ti를 설정했어. 자 이제 코드를 보자.


int index = min(c.length-2, (int)((c.length-1)*t));


min(c.length - 2, ...); 는 c.length - 2와 ...의 최소값이라는 건데 두번쨰 값이 c.length - 2보다 크면 c.length - 2가 빠져나오겠지?
즉 두번째 값이 아무리 커도 c.length - 2보다 크지 않게 하기 위한 것이야.


두번째 값은 (c.length - 1) * t라고 했는데 말 그대로야. 마지막 인덱스에 비율을 곱해서 적절한 위치를 찾아준 거야.

다만 t가 1.0이 되면 c.length - 1가 되어서 index와 index+1을 쓸 떄 c.length를 써버리게 되니깐 min으로 c.length - 2보다 큰 값은

못 빠져나가게 해 놓은 거지.


이제 ct를 보자.


float ct = min(1.0, (t-(1.0/(c.length-1))*index)*(c.length-1));


이것도 아무리 커도 1.0보단 크지 않도록 안전 조치를 해 놨어.

실제 계산은 (t-(1.0/(c.length-1))*index)*(c.length-1)인 셈인데,

위에 내가 t_i = i * (1.0 / (c.length - 1)) 적어놓은 거 기억하지?


t에 1.0 / (c.length - 1) * index를 빼면 이런 식으로 되겠지.



0.0 ~ 0.5 범위의 값으로 바뀌어.

근데 저걸 0.0 ~ 1.0로 바꿔야 하는데. 0.5는 1/2 == 1 / (c.length - 1)이니깐.


뺀 값에 * (c.length - 1)을 해주면 분모가 사라지면서 0.0 ~ 1.0 범위의 값으로 스케일링이 되겠지.

그래서 (t-(1.0/(c.length-1))*index)*(c.length-1) 로 해 준거야.