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를 설정했어. 자 이제 코드를 보자.
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를 보자.
이것도 아무리 커도 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) 로 해 준거야.
와 갑자기 난이도 급상승 ㄷㄷ 정독했어요. 아직 ct부분은 이해가 좀 안가지만 나머지 부분은 종이에 쓰면서 보니까 어느정도 이해가 갑니다!! 친절한 설명 정말 감사드립니다. 늦은 시간인데 ㅜㅜ 수고해주셔서 정말 감사합니다. 10%도 이해 안갔었는데 님과 다른 고닉분들 설명을 듣고나서 꽤 많이 이해가 갔습니다 감사합니다 ㅜㅜ
ct 부분은 빨-노-초 로 이어지는 전체 그라데이션에서 0.25라는 값에서 빨-노 를 뽑아냈으면, 이제 이 0.25 값이 빨-노 사이에서 무슨 단계에 있는지 그 단계 비율 값 0.5을 찾아야 하는데 이 0.5 값이 바로 ct야.
오 이해갔어요 명쾌하시네요 진짜로
정말 감사합니다 ㅠㅠㅠㅠㅠ
ㅇㅇ. 내 그림만 보고 이해하려고 하지 말고 한번 너가 수식으로 직접 구해봐. 똑같은 수식 나올 것임. ㅋㄷㅋㄷ
t가 0.75라면 노~초 사이인데 노~초는 0.5~1.0이고, 0.5~1.0 -> 0.0~0.5 -> 0.0~1.0 순으로 범위를 변경해서 t를 0.0~1.0 사이의 값인 ct로 바꾸는 거지. 첫번째 0.5~1.0 -> 0.0~0.5의 변환은 t - t[index](해당하는 두 개의 색 중 첫번째 색의 시작 비율) == t - (1.0/(clength - 1)*index) 을 하면 되고. 0.0~0.5 -> 0.0~1.0 의 변환은 0.5가 1/(c.length - 1)이니깐 *(c.length - 1)을 곱해주면 변환되겠지.
ㄴ아 또 직접 수식으로 구해보려니까 어렵네요 흠 밑에 설명 정독하고 공부해보겠습니다 ㅜㅜ 진짜 여러모로 감사합니다여 복받으세요 늦은시간까지 고생이 많으셨습니다 ㅜㅜ
두 분 다 수고하셨습니다.
ㄴ고닉님도 감사합니다ㅠ새벽에 계속 덧글로 한 수 가르쳐주셨던 분들. 모두 복받으시고 행복한 하루 되십시오!
http://autogram.tk/이
중고차 어플리케이션 어떤가요?