Grid waves

turtletoy.net/turtle/95530fc35d

Created by zoso95 on 2019/3/26
183
1

Log in to post a comment.

Canvas.setpenopacity(0.5);

// Global code will be evaluated once.
const turtle = new Turtle();
const size = 80.0;
class Noise {
	// http://mrl.nyu.edu/~perlin/noise/
	constructor(octaves = 1) {
		this.p = new Uint8Array(512);
		this.octaves = octaves;
		for (let i = 0; i < 512; ++i) {
			this.p[i] = Math.random() * 256*100;
		}
	}
	lerp(t, a, b) {
		return a + t * (b - a);
	}
	grad2d(i, x, y) {
		const v = (i & 1) === 0 ? x : y;
		return (i & 2) === 0 ? -v : v;
	}
	noise2d(x2d, y2d) {
		const X = Math.floor(x2d) & 255;
		const Y = Math.floor(y2d) & 255;
		const x = x2d - Math.floor(x2d);
		const y = y2d - Math.floor(y2d);
		const fx = (3 - 2 * x) * x * x;
		const fy = (3 - 2 * y) * y * y;
		const p0 = this.p[X] + Y;
		const p1 = this.p[X + 1] + Y;
		return this.lerp(
			fy,
			this.lerp(
				fx,
				this.grad2d(this.p[p0], x, y),
				this.grad2d(this.p[p1], x - 1, y)
			),
			this.lerp(
				fx,
				this.grad2d(this.p[p0 + 1], x, y - 1),
				this.grad2d(this.p[p1 + 1], x - 1, y - 1)
			)
		);
	}
	noise(x, y, scale=0.5) {
		let e = 1,
			k = 1,
			s = 0;
		for (let i = 0; i < this.octaves; ++i) {
			e *= scale; // This constant factor will adjust where the lines are drawn
			s += e * (1 + this.noise2d(k * x, k * y)) / 2;
			k *= 2;
		}
		return s;
	}
}
const perlin = new Noise(3);
// The walk function will be called until it returns false.

circle_dim = [5]


radius = []
cx = []
cy = []

spacing = 10
for(let i=-100;i<100;i+=spacing){
    
    for(let j=-100;j<100;j+=spacing){
        cx.push(i)
        cy.push(j)
        ind = Math.floor(Math.random()*circle_dim.length)
         radius.push(circle_dim[ind])
    }
    
}


turtle.up();
function walk(i) {
    scale = 300;
    // J is x coordinate for it to start
    
    //(𝑥𝑝−𝑥𝑐)2+(𝑦𝑝−𝑦𝑐)2 with 𝑟2
    
    for (let j = -100; j < 100; j+= 0.5) {
        const h = perlin.noise(100 + j * 0.01, 100 + i * 0.01, 0.4);
        turtle.goto(j, 0.2 * (i-1000) + h * 300 - 100);
        ax = Math.abs(turtle.x());
        ay = Math.abs(turtle.y());
        
        turtle_up = true
        
        for(let c = 0;c<radius.length;c++){
            if (((Math.pow(ax - cx[c], 2)+Math.pow(ay-cy[c], 2)) < Math.pow(radius[c], 2))){
                //turtle.down();
                turtle_up = false
            }
        }
        if(turtle_up){
            turtle.up();
        }else{
            turtle.down();
        }
        
        /*
        if (((Math.pow(ax, 2)+Math.pow(ay, 2)) < Math.pow(size / 1.1, 2)))
            turtle.down();
        else if (((Math.pow(ax, 2)+Math.pow(ay, 2)) < Math.pow(size / 1.05, 2)))
            turtle.up();
        else if((Math.pow(ax, 2)+Math.pow(ay, 2)) < Math.pow(size, 2))    
            turtle.down();
        else
    	    turtle.up();
    	*/
	}
	turtle.up();
    return i < 2200;
}