ArcPath[] paths;
PVector traveler;
int pIndex;
void setup() {
size(400, 400);
paths = new ArcPath[5];
PVector pos0 = new PVector(width/2, height/2);
color[] c0 = {
color(255, 192, 0), color(255, 0, 0), color(255, 192, 0)
};
paths[0] = new ArcPath(pos0, 100.0, radians(300.0), radians(600.0), true, c0);
PVector pos1 = new PVector(pos0.x+cos(radians(240.0))*120.0, pos0.y+sin(radians(240.0))*120.0);
color[] c1 = {
color(255, 192, 0), color(255, 255, 0)
};
paths[1] = new ArcPath(pos1, 20.0, radians(415.0), radians(235.0), false, c1);
// pos2 would be the same as pos0
color[] c2 = {
color(255, 255, 0), color(255, 0, 0), color(192, 0, 192), color(255, 0, 0), color(255, 255, 0)
};
paths[2] = new ArcPath(pos0, 140.0, radians(600.0), radians(300.0), false, c2);
PVector pos3 = new PVector(pos0.x+cos(radians(300.0))*160.0, pos0.y+sin(radians(300.0))*160.0);
color[] c3 = {
color(255, 255, 0), color(255, 255, 0)
};
paths[3] = new ArcPath(pos3, 20.0, radians(115.0), radians(300.0), true, c3);
// pos4 would be the same as pos0
color[] c4 = {
color(255, 255, 0), color(255, 0, 0), color(0, 0, 255), color(255, 0, 0), color(255, 192, 0)
};
paths[4] = new ArcPath(pos0, 180.0, radians(300.0), radians(570.0), true, c4);
traveler = new PVector();
reset();
}
void draw() {
ArcPath ref = paths[pIndex];
float theta = ref.thetaStart+(ref.thetaEnd-ref.thetaStart)*ref.t;
traveler.x = ref.pos.x+cos(theta)*ref.radius;
traveler.y = ref.pos.y+sin(theta)*ref.radius;
// ref.t += 1.0/ref.radius makes the traversing speed constant
if (ref.t < 1.0 && pIndex < paths.length)
ref.t += 1.0/ref.radius;
if (ref.t >= 1.0 && pIndex < paths.length-1)
pIndex++;
if (ref.t < 1.0 && pIndex < paths.length) {
fill(ref.getColor());
ellipse(traveler.x, traveler.y, 20, 20);
}
}
void mousePressed() {
reset();
}
void reset() {
background(255);
noFill();
stroke(0);
for (int i = 0; i < paths.length; i++) {
paths[i].t = 0.0;
paths[i].display();
}
noStroke();
pIndex = 0;
}
class ArcPath {
PVector pos;
float diameter, radius, t, thetaStart, thetaEnd;
boolean clockwise;
color[] c;
ArcPath(PVector pos, float radius, float thetaStart, float thetaEnd, boolean clockwise, color[] c) {
this.pos = pos.get();
diameter = radius*2.0;
this.radius = radius;
this.thetaStart = thetaStart;
this.thetaEnd = thetaEnd;
this.clockwise = clockwise;
this.c = c;
}
void display() {
if (clockwise)
arc(pos.x, pos.y, diameter, diameter, thetaStart, thetaEnd);
else
arc(pos.x, pos.y, diameter, diameter, thetaEnd, thetaStart);
}
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);
}
}
이게 코드 전체입니다 진짜로 알려주시면 냉큼 받아먹기만 하지 않고 혼자서도 꼭꼭 공부하고 머리써보겠습니다 아까 전 글에도 대략적으로 설명 달아주신 분들 계시던데 감사드리고 코드가 조금 긴것 같아서 보기 힘드실까봐 아까는 부분만 올렸었습니다.
제가 가장 이해 안된 부분은 마지막 부분 그라데이션 부분입니다 color getColor 부분이요 ㅠㅠ
제가 뭘 제대로 배웠어야 질문을 자세히 드릴텐데 진심 하나도 뭘 몰라서 이렇게 두루뭉술하게 밖에 질문이 안되네요! 죄송합니다
대강뭐하는거지 알겠는데 소스코드이거맞음? arcpath내에있는 float t 를 쓰는곳은 있어도 할당하는곳은 없는데?
코드 개지저분 ㄷㄷ
뭐가좀이상한뎅;;
코드를 발로 짰네 ㅋㄸㅋ
nyangdu // 잘 보면 draw() 함수에서 t 값 조정하고 있음 ㄷㄷ 구조 진짜 안 좋은 ㅋㅋㅋ
밖에서 할당하잖아. zzz
와 존나참신;; 생각도못함 ㅋㅋ
리셋 함수에서 0으로 할당하공
참신이 아니라 쓰레기 ㅋㅋㅋ
발로 짠 코드인데 주석도 달고 앞에서 설명도 해야해서 ㅠㅠㅠ이게 진짜 전문가분들이 보기엔 발로 짠 코드군요 전 엄청 잘 짠 코드인줄 알았네요
저걸생성자에서 0으로 초기화하는게 훨씬좋지않을까;;
draw 에서 반지름으로 나눈 만큼씩 증가시키고 ㅋㅋ
딱 보고 다 해석하시는구나 전 존나 몇일밤 새서 겨우 한 20% 이해했는데...
보아하니 draw()는 Processing 레퍼런스 설명 보니까 프레임마다 자동으로 불리는 함수인 모양 ㅋㄷㅋㄷ
음 t의값을 초기화하려고 저랬나보네
이건 뭐 학원 한달차가 객체 개념없이 짠 수준.
이게 t가 draw call 될때마다 += 로 계속 변환하는데 마우스클릭할때마다 초기화시켜줄라고 저래짠듯
그렇게 t 를 1까지 다 채운다음엔 다음 인덱스로 넘어가는거고 ㅋㅋ
우선 니말대로 getcolor가 뭐하는건지부터 알려줌. draw call 될때마다 캔버스에 그라데이션을 타원형으로 그려주는데 니가 말한 getcolor가 color 1~2 사의의 비율을 리턴하는거라고하니 실제로 getcolor는 그라데이션 색상을실질적으로 뽑아주는 함수가 아닌가싶다. fill(color)는 아마 켄버스를 해당색상을 입히는거고 구글링해보니 ellipse는 타원을그려주는 함수라네?
네 ellipse(x중심점, y중심점, 반지름, 반지름) 으로 원을 그리는 함수입니다.
함튼 draw 라는함수는 프레임마다 캔버스를 새로 draw해주는 콜백함수일꺼야. 캔버스에 그라데이션을 타원으로 색칠하려고하는데 drawcall시마다 color 값을 더해줘서 프레임마다 color를 변경해주고 매 draw시마다 색상을 채우고 타원으로그리는거지 실직적으로 니가 눈에 보이는 건 if(~~) { fill 함수와 eillpse함수} 이 두가지가 니눈에 보이는거야 나도 프로세싱이란걸 안해서 잘 설명해주기가 애매하네;
저기 위에 코사인 사인 들어가 있는 코드는
ref.pos.x 와 y 를 회전 중심으로 radius 를 반지름으로 해서 theta 각도만큼 회전한 x, y 를 얻는거야
그 x y 를 기준으로 타원을 그리는데 타원의 장축과 단축의 지름이 20으로 동일하니 지름 20짜리 원을 그린거지.
아닙니다. 유일하게 draw의 반복 개념은 이해를 하고 있기 때문에 설명이 충분히 이해가 갔습니다. 프로세싱 안하시는데도 정말 대단하시네요...
즉 ref.pos.x 랑 y 를 기준으로 radius 반지름에 theta 각도만큼 회전한 원이 뿅뿅 뿅 그려진단 말씀.
이때 이원의 색깔을 그라디에이션에서 뽑아오게 되어있는거고
ㄴ아 그렇군요! 정말 이해가 잘됩니다...설명도 진짜 잘하시네요. 우와...
이때의 theta 역시 시작 각에서 끝각 까지를 그라디언트의 단위인 t (0~1) 을 이용해서 선형으로 얻어냈기 땜에 그라디언트를 나눈 단위 갯수만큼 일정각도로 움직이게 되지
으아 시바 지금까지쓴거다날아감;
여기 금칙어 졸짱남.
저기서 실질적으로 구현한건 함수밖에없엉
리셋함수하고 아크페스라는클래스박에없음
죄송한데 t 부분 보충 설명 가능하신가요?
마우스프래스 함수는 마우스입력 이벤트에대한 콜백 셋업은 프로그램 실행시 가장먼저초가화 되는것 드로우는 매프레임마다 호출되는 함수지 여기서 아크패스라는 클래스는 니가원하는 그라데이션정보를 가지고 처리해주는 하나의 묶음같은거야 셋업에서 여러개의 칼라값을 만든후 아크패스라는 배열을만들어서 초기화하는게 그이유지 드로우함수에서 매프레임마다 값을 변경해줘서 색상을 채우고 타원을 그려주는거야 마우스프래스할때 리셋을 해줘서 그려진 모든정보와 변한 값을들 초기화시켜주는역활이지
왜...왜 그라디언트 단위가 t인거죠...?
pos0 는 화면 중심이고.
ㄴ아아 클래스의 개념이 좀 더 잘 이해가 되네요. 이렇게 쉽게 설명도 가능하군요. 네이버 블로그은 다 너무 어렵게 정리해놔서 이해가 안됐었는데 감사합니다.
레프.t의 변화량이 각도마다변하지?
프로세싱 깔아서 직접 돌려 봤다. 이제 설명해 줌.
ㄴ 와 진심으로 감사합니다. 깔아주시기까지 ㄷㄷㄷㄷㄷ 게다가 한번 돌려보고 바로 설명하시는 전공자 클라스 ㄷㄷ 쩌네요
네! 각도마다 변합니다.
즉 드로우콜마다 각도량에 반비례해서 더해지게되는거야 t값이 근데 이t값을쓰는게 겟 칼라 라는함수 이지 걍쉽게말하면 그라데이션은 색상의 연속된정보야 알지비 (0,0,0)에서 (255,255,0) 을그라데이션으로뽑으면 000 110 220 이순으로 진행되겠지? 각도마다 t값을 변환시켜서 그 겟칼라함수 안에서 인자로 받은 칼라 배열을 선택하고 거기에따른 비율을 고르는거야 그래서 그라데이션이 그려지지
pos1 은 화면 중심 기준 120픽셀 떨어진 240도 회전된 지점이고
야 치사하게 깔아서 돌려보기냐.
이해가되나모르겠당
아니 난 깔아봤다는게 더신기한데
와 그럼 두분은 지금까지 실행도 안해보시고 코드만 보시고 설명해주신거예요? 진짜 대단들하시네요...와......우와
pos2 는 역시 화면 중심, pos3 는 화면 중심 기준 160픽셀 떨어진 300도 회전 지점이구
그리고 전공자 라서 뭐따로 알려주는게아니라 모르는거 있을때 그 존나딮빡치는 기분을 알아서 알려주는거야 나도 가끔모르면 여따질문하기도하니까 원래 서로서로 도와가면서해야지
음 아직 알듯말듯 한데 공부해보겠습니다 근데 아까보다는 훨씬 이해가 갑니다
ㅅㅅㅅ 가 종결할거야 ㅋㄷㅋㄷ
여기 글쓴 댁이나 나나 각자 잘하는게 있는거고 거기에따라서 서로모르는게있으면 물어보는거지뭐 너 디자인학과라고했지? 우리가 디자인모르면 물어보는거랑 비슷해 각자 잘하는게있으니 너무자신을 낮추지마셈
예 ㅠㅠ 전 진짜로 제가 이 과에서 이런 걸 배우게 될 줄은 몰라서 하나부터 열까지 다 모르겠고 빡치는걸 넘어 죽고싶었는데 여기서 이렇게 도움을 받네요. 진작 여기에 왔어야했어요.뭐하러 답장도 안하시는 교수님을 붙잡고 늘어졌었는지.정말 감사합니다 ㅠㅠ
x = 중심x + cos(각도) * 반지름; y = 중심y + sin(각도) * 반지름; 이건 회전변환 공식이니 걍 통째로 외우면 돼
원래 교수님들은 좀 고지식해서 메일보다 찾아오는걸 좋아하는 타입이라 가서 캔음료라도 하나 사가서물어봐
만약 니가 중심x, y 에다 화면 중앙 좌표를 주고, 반지름에다 화면 크기의 절반 값을 주고, 각도를 0 ~ 2PI 까지 주게 되면 화면 중심을 기준으로 반지름만큼 떨어진 원 위의 x, y 를 다 얻을 수 있지
저기 radian 이라고 된 함수는 degree 를 라디안으로 변환해주는거지 우리가 0~360 도 라고 부르는걸 0~2PI 로 바꿔주는거.
즉, 3.141592... 를 곱하고 180 을 나눈거.
엌 나 출근해야 되는데 놀고 있음.
ㄴ 그렇군요. 그렇게 아예 정해져있는 공식이군요 새로운걸 알았네요 감사합니다
http://dblack.tk
커뮤니티 사이트 입니다 많은 이용 부탁 드립니다.