processing으로 눈송이를 만들어 보자.
2192 단어 processing
소개
만나서 반갑습니다. 아다치입니다.
이번에는 Processing을 사용하여 클릭하면 모서리의 수가 늘어나는 눈결정의 프로그램을 공개하려고 합니다.
주의
Processing에 대해서는 Processing3.4의 Java 모드를 사용하고 있습니다.
code
코드는 다음과 같습니다.
ArrayList<Koch>koch=new ArrayList<Koch>();
ArrayList<Koch>kochSTK=new ArrayList<Koch>();
void setup() {
size(800, 800);
strokeWeight(0);
stroke(#ffffff);
fill(255);
noFill();
int n=6;
for (int i=0; i<n; i++) {
float d=i*TWO_PI/n;
float r=width*0.37;
koch.add(new Koch(width/2+cos(d)*r, height/2+sin(d)*r,
width/2+cos(d+TWO_PI/n)*r, height/2+sin(d+TWO_PI/n)*r));
}
noLoop();
}
void mousePressed() {
redraw();
}
void draw() {
background(0);
beginShape();
for (Koch k : koch) {
k.update();
kochSTK.addAll(k.mkKoch());
}
endShape();
koch.clear();
koch.addAll(kochSTK);
kochSTK.clear();
println("step : "+frameCount);
}
public class Koch {
float sx, sy, ex, ey;
public Koch(float sx, float sy, float ex, float ey) {
this.sx=sx;
this.sy=sy;
this.ex=ex;
this.ey=ey;
}
public void update() {
vertex(sx, sy);
vertex(ex, ey);
}
public ArrayList<Koch>mkKoch() {
ArrayList<Koch>koch=new ArrayList<Koch>();
float l=sqrt((sq(sx-ex)+sq(sy-ey)))/3;
float a=atan2(ey-sy, ex-sx)+PI/3;
float x=lerp(sx, ex, 1./3.);
float y=lerp(sy, ey, 1./3.);
float xx=x+cos(a)*l;
float yy=y+sin(a)*l;
koch.add(new Koch(sx, sy, x, y));
koch.add(new Koch(x, y, xx, yy));
x=lerp(sx, ex, 2./3.);
y=lerp(sy, ey, 2./3.);
koch.add(new Koch(xx, yy, x, y));
koch.add(new Koch(x, y, ex, ey));
return koch;
}
}
실행 결과
↑클릭 6회했을 때의 눈의 결정
참고문헌
쓰라네의 일기 : h tp : // 고드름. 는 bぉ. jp/엔트리/2015/03/01/002827
Reference
이 문제에 관하여(processing으로 눈송이를 만들어 보자.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/adachi111/items/6f9082ac829b27e1dc5d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
코드는 다음과 같습니다.
ArrayList<Koch>koch=new ArrayList<Koch>();
ArrayList<Koch>kochSTK=new ArrayList<Koch>();
void setup() {
size(800, 800);
strokeWeight(0);
stroke(#ffffff);
fill(255);
noFill();
int n=6;
for (int i=0; i<n; i++) {
float d=i*TWO_PI/n;
float r=width*0.37;
koch.add(new Koch(width/2+cos(d)*r, height/2+sin(d)*r,
width/2+cos(d+TWO_PI/n)*r, height/2+sin(d+TWO_PI/n)*r));
}
noLoop();
}
void mousePressed() {
redraw();
}
void draw() {
background(0);
beginShape();
for (Koch k : koch) {
k.update();
kochSTK.addAll(k.mkKoch());
}
endShape();
koch.clear();
koch.addAll(kochSTK);
kochSTK.clear();
println("step : "+frameCount);
}
public class Koch {
float sx, sy, ex, ey;
public Koch(float sx, float sy, float ex, float ey) {
this.sx=sx;
this.sy=sy;
this.ex=ex;
this.ey=ey;
}
public void update() {
vertex(sx, sy);
vertex(ex, ey);
}
public ArrayList<Koch>mkKoch() {
ArrayList<Koch>koch=new ArrayList<Koch>();
float l=sqrt((sq(sx-ex)+sq(sy-ey)))/3;
float a=atan2(ey-sy, ex-sx)+PI/3;
float x=lerp(sx, ex, 1./3.);
float y=lerp(sy, ey, 1./3.);
float xx=x+cos(a)*l;
float yy=y+sin(a)*l;
koch.add(new Koch(sx, sy, x, y));
koch.add(new Koch(x, y, xx, yy));
x=lerp(sx, ex, 2./3.);
y=lerp(sy, ey, 2./3.);
koch.add(new Koch(xx, yy, x, y));
koch.add(new Koch(x, y, ex, ey));
return koch;
}
}
실행 결과
↑클릭 6회했을 때의 눈의 결정
참고문헌
쓰라네의 일기 : h tp : // 고드름. 는 bぉ. jp/엔트리/2015/03/01/002827
Reference
이 문제에 관하여(processing으로 눈송이를 만들어 보자.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/adachi111/items/6f9082ac829b27e1dc5d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(processing으로 눈송이를 만들어 보자.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/adachi111/items/6f9082ac829b27e1dc5d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)