Фрактали. Побудови
Рекурсивні кола
void setup() { size(400,400); smooth(); } void draw() { background(255); stroke(0); noFill(); drawCircle(width/2,height/2,200); } void drawCircle(float x, float y, float radius) { ellipse(x, y, radius, radius); if(radius > 2) { drawCircle(x + radius/2, y, radius/2); drawCircle(x- radius/2, y, radius/2); } }
Рекурсивні квадрати
void kvadrat(int x, int y, int n) { if (n>1) { int x2=x+n; int y2=y+n; rect(x,y,n,n); n=int(n/2); kvadrat(x2,y2,n); } } Виклик процедури: kvadrat(100,100,100);
Фрактальні дерева
void fract(int x, int y, float l, float u){ if (l>5) { l = l * 0.7; line(x,y,round(x+l*cos(u)),round(y-l*sin(u))); x = round(x + l * cos(u)); y = round(y - l * sin(u)); fract(x, y, l, u + PI / 4); fract(x, y, l, u - PI / 12); } } void fract2(int x, int y, float l, float u){ if (l>5) { l = l * 0.7; line(x,y,round(x+l*cos(u)),round(y-l*sin(u))); x = round(x + l * cos(u)); y = round(y - l * sin(u)); fract(x, y, l, u + PI / 12); fract(x, y, l, u - PI / 4); } } void fract3(int x, int y, float l, float u){ if (l>5) { l = l * 0.95; line(x,y,round(x+l*cos(u)),round(y-l*sin(u))); x = round(x + l * cos(u)); y = round(y - l * sin(u)); fract(x, y, l, u + PI / 4); fract(x, y, l, u - PI / 4); } } Виклик процедур: fract(mouseX,mouseY,int(random(100))+20,PI/2); fract2(mouseX,mouseY,int(random(100))+20,PI/2); fract3(mouseX,mouseY,int(random(100))+20,PI/2);
Трикутник Серпінського
void tr(float x1, float y1, float x2, float y2, float x3, float y3) { line(int(x1), int(y1), int(x2), int(y2)); line(int(x2), int(y2), int(x3), int(y3)); line(int(x3), int(y3), int(x1), int(y1)); } void dr(float x1, float y1, float x2, float y2, float x3, float y3, int n) { if (n>0) { float x1n = (x1 + x2) / 2; float y1n = (y1 + y2) / 2; float x2n = (x2 + x3) / 2; float y2n = (y2 + y3) / 2; float x3n = (x3 + x1) / 2; float y3n = (y3 + y1) / 2; tr(x1n, y1n, x2n, y2n, x3n, y3n); dr(x1, y1, x1n, y1n, x3n, y3n, n - 1); dr(x2, y2, x1n, y1n, x2n, y2n, n - 1); dr(x3, y3, x2n, y2n, x3n, y3n, n - 1); } } Виклик процедури: int iter=5; tr(320,10,600,470,40,470); dr(320,10,600,470,40,470,iter);
Лінія Коха
void koh2(float startx, float endx, float starty, float endy, float level) { if (level==1 ) { line(int(startx), int(starty), int(endx), int(endy)); } else { float L = sqrt( (endx-startx) * (endx-startx) + (endy-starty) * (endy-starty) ); float h = L /(2 * sqrt(3)); float sina = (endy - starty)/L; float cosa = (endx - startx)/L; float x1 = startx + (endx - startx)/3; float x2 = (endx + startx)/2 + h * sina; float x3 = startx + 2 * (endx - startx)/3; float y1 = starty + (endy - starty)/3; float y2 = (endy + starty)/2 - h * cosa; float y3 = starty + 2 * (endy - starty)/3; koh2(startx, x1, starty, y1, level-1); koh2(x1, x2, y1, y2, level-1); koh2(x2, x3, y2, y3, level-1); koh2(x3, endx, y3, endy, level-1); } } Виклик процедури: koh2(0,500, 500, 500, 5);
Квадрати: void setup() { size(400,400); smooth(); } void draw() { background(255); stroke(0); noFill(); kvadrat(10,10,100); kvadrat2(390,10,100); kvadrat3(10,390,100); kvadrat4(390,390,100); } void kvadrat(int x, int y, int n) { if (n>1) { int x2=x+n; int y2=y+n; rect(x,y,n,n); n=int(n/2); kvadrat(x2,y2,n); } } void kvadrat2(int x, int y, int n) { if (n>1) { int x2=x-n; int y2=y+n; rect(x-n,y,n,n); n=int(n/2); kvadrat2(x2,y2,n); } } void kvadrat3(int x, int y, int n) { if (n>1) { int x2=x+n; int y2=y-n; rect(x,y-n,n,n); n=int(n/2); kvadrat3(x2,y2,n); } } void kvadrat4(int x, int y, int n) { if (n>1) { int x2=x-n; int y2=y-n; rect(x-n,y-n,n,n); n=int(n/2); kvadrat4(x2,y2,n); } } ====================================
Остання зміна: субота 30 листопада 2019 18:06