日常の進捗

主に自分のための,行為とその習慣化の記録

#Codevember day03: Carrot

人参みたいなかわいいお題,いけるんかなとおもったけどいけた.過去に書いた根茎図のプログラムがつかえるなーと思ってp5.jsに転用した.

takawo.hatenablog.com

//modify from my past sketch in p5.
//http://takawo.hatenablog.com/entry/2017/12/30/152858

let len = 55;
let font;

function preload() {
    font = loadFont("Lato-Italic.ttf");
}

function setup() {
    createCanvas(400, 400);
    colorMode(HSB, 360, 100, 100, 100);
    angleMode(DEGREES);
    noLoop();
}

function draw() {
    let f = frameCount;
    background(220);

    push();
    translate(width * 1 / 2 - 20, height * 1 / 2 - 20);
    rotate(45);
    tree(floor(random(3, 6)), 100);
    pop();

    noStroke();
    push();
    translate(width / 4, height * 2 / 3);
    rotate(45);
    fill(30, 80, 100);
    beginShape();
    for (let i = 0; i < 360; i++) {
        let x = cos(i - 90) * 80 * noise((f * 100 + i) * 0.008);
        let y = sin(i - 90) * 120;
        vertex(x, y);
    }
    endShape(CLOSE);

    fill(0, 0, 100, 20);
    beginShape();
    for (let i = 0; i < 360; i++) {
        let x = cos(i - 90) * 70 * noise((f * 100 + i) * 0.18);
        let y = sin(i - 90) * 100;
        vertex(x, y);
    }
    endShape(CLOSE);
    pop();

    textSize(30);
    fill(0, 0, 0);
    noStroke();
    text("Codevember #day03\nCarrot", 20, 40);

}

function mousePressed() {
    redraw();
}

function tree(depth, l) {
    if (depth > 0) {
        let n = floor(random(3, 10));
        for (let angle = 180; angle < 360; angle += random(30, 60)) {
            push();
            rotate(angle);
            stroke(120, random(50, 80), random(80, 100), 100);
            noFill();
            let sw = map(l, 0, len, 0, 3);
            strokeWeight(sw);
            if (random(100) < 50) {
                bezier(0, 0, l / 2, l / 2, l / 2, -l / 2, l, 0);
            } else {
                bezier(0, 0, l / 2, -l / 2, l / 2, l / 2, l, 0);
            }
            //line(0, 0, l, 0);
            noStroke();
            fill(120, 80, 100, 100);
            let d = map(l, 0, len, 0, 5);
            ellipse(l, 0, d, d);
            translate(l, 0);
            rotate(360 / n / 2);
            if (l > 15) {
                tree(depth - 1, l * 0.45);
            }
            pop();
        }
    }
}