Some lines made with Perlin noise. Note that with this implementation the lines are more regular to the bottom left of the canvas.
Log in to post a comment.
// https://github.com/joeiddon/perlin/blob/master/perlin.js let perlin = { rand_vect: function(){ let theta = Math.random() * 2 * Math.PI; return {x: Math.cos(theta), y: Math.sin(theta)}; }, dot_prod_grid: function(x, y, vx, vy){ let g_vect; let d_vect = {x: x - vx, y: y - vy}; if (this.gradients[[vx,vy]]){ g_vect = this.gradients[[vx,vy]]; } else { g_vect = this.rand_vect(); this.gradients[[vx, vy]] = g_vect; } return d_vect.x * g_vect.x + d_vect.y * g_vect.y; }, smootherstep: function(x){ return 6*x**5 - 15*x**4 + 10*x**3; }, interp: function(x, a, b){ return a + this.smootherstep(x) * (b-a); }, seed: function(){ this.gradients = {}; this.memory = {}; }, get: function(x, y) { if (this.memory.hasOwnProperty([x,y])) return this.memory[[x,y]]; let xf = Math.floor(x); let yf = Math.floor(y); //interpolate let tl = this.dot_prod_grid(x, y, xf, yf); let tr = this.dot_prod_grid(x, y, xf+1, yf); let bl = this.dot_prod_grid(x, y, xf, yf+1); let br = this.dot_prod_grid(x, y, xf+1, yf+1); let xt = this.interp(x-xf, tl, tr); let xb = this.interp(x-xf, bl, br); let v = this.interp(y-yf, xt, xb); this.memory[[x,y]] = v; return v; } } perlin.seed(); // http://davidbau.com/archives/2010/01/30/random_seeds_coded_hints_and_quintillions.html#more !function(a,b,c,d,e,f,g,h,i){function j(a){var b,c=a.length,e=this,f=0,g=e.i=e.j=0,h=e.S=[];for(c||(a=[c++]);d>f;)h[f]=f++;for(f=0;d>f;f++)h[f]=h[g=s&g+a[f%c]+(b=h[f])],h[g]=b;(e.g=function(a){for(var b,c=0,f=e.i,g=e.j,h=e.S;a--;)b=h[f=s&f+1],c=c*d+h[s&(h[f]=h[g=s&g+b])+(h[g]=b)];return e.i=f,e.j=g,c})(d)}function k(a,b){var c,d=[],e=typeof a;if(b&&"object"==e)for(c in a)try{d.push(k(a[c],b-1))}catch(f){}return d.length?d:"string"==e?a:a+"\0"}function l(a,b){for(var c,d=a+"",e=0;e<d.length;)b[s&e]=s&(c^=19*b[s&e])+d.charCodeAt(e++);return n(b)}function m(c){try{return o?n(o.randomBytes(d)):(a.crypto.getRandomValues(c=new Uint8Array(d)),n(c))}catch(e){return[+new Date,a,(c=a.navigator)&&c.plugins,a.screen,n(b)]}}function n(a){return String.fromCharCode.apply(0,a)}var o,p=c.pow(d,e),q=c.pow(2,f),r=2*q,s=d-1,t=c["seed"+i]=function(a,f,g){var h=[];f=1==f?{entropy:!0}:f||{};var o=l(k(f.entropy?[a,n(b)]:null==a?m():a,3),h),s=new j(h);return l(n(s.S),b),(f.pass||g||function(a,b,d){return d?(c[i]=a,b):a})(function(){for(var a=s.g(e),b=p,c=0;q>a;)a=(a+c)*d,b*=d,c=s.g(1);for(;a>=r;)a/=2,b/=2,c>>>=1;return(a+c)/b},o,"global"in f?f.global:this==c)};if(l(c[i](),b),g&&g.exports){g.exports=t;try{o=require("crypto")}catch(u){}}else h&&h.amd&&h(function(){return t})}(this,[],Math,256,6,52,"object"==typeof module&&module,"function"==typeof define&&define,"random"); Math.seedrandom("aaa"); function iterTurtle(turtle, angle) { const p = perlin.get(turtle.x() / scale, turtle.y() / scale); // let p = perlin(turtle.x() / scale, turtle.y() / scale); turtle.seth(p * 45 + angle); turtle.forward(10); } const scale = 50.0; let time; // You can find the Turtle API reference here: https://turtletoy.net/syntax Canvas.setpenopacity(1); // Global code will be evaluated once. const turtle = new Turtle(); turtle.penup(); turtle.goto(0, 0); turtle.pendown(); const hTurtles = []; for (let i = 0; i < 100; ++i) { const turtle = new Turtle(); turtle.penup(); turtle.goto(-100, (i - 50) * 5); turtle.pendown(); hTurtles.push(turtle); } const vTurtles = []; for (let i = 0; i < 100; ++i) { const turtle = new Turtle(); turtle.penup(); turtle.goto((i - 50) * 5, 100); turtle.pendown(); vTurtles.push(turtle); } // The walk function will be called until it returns false. function walk(i) { hTurtles.forEach((t) => iterTurtle(t, 0)); vTurtles.forEach((t) => iterTurtle(t, -90)); return hTurtles.some((turtle) => turtle.x() < 100) || vTurtles.some((turtle) => turtle.y() > -100); }