This was not the plan - but I'm posting this 20% done Turtle because it looks kinda nice by accident.
Log in to post a comment.
// LL 2021 Canvas.setpenopacity(1); const turtle = new Turtle(); const length = 10000; /// min=1 max=100000 step=1 const radius = 90; /// min=1 max=100 step=1 const width = 1; // min=0.1 max=10 step=0.1 const seed = 0; // min=0 max=100 step=1 const hatch = 1; // min=0 max=1 step=1 (No,Yes) const style = 1; /// min=0 max=1 step=1 (No HSR,HSR) let polygons; let list; function walk(i, t) { if (i == 0) { const length_t = length * t; rng = undefined; polygons = new Polygons(); list = []; const or = radius; const oθ = random() * Math.PI *2; const oφ = random() * Math.PI *2; const sr = random() * Math.PI * 2 / 300; const sθ = Math.PI * 2 / (500 + 200 * random()); // + random() * Math.PI * 2 / 500; const sφ = Math.PI * 2 / (500 + 200 * random()); // + random() * Math.PI * 2 / 500; for (var j=0; j<length_t; j++) { const r = or * Math.cos(sr * j); const φ = oφ + sφ * j; const θ = oθ + sθ * j; const x = r * Math.cos(φ) * Math.sin(θ); const y = r * Math.sin(φ) * Math.sin(θ); const z = r * Math.cos(θ); const a = θ + φ; const r2 = (j==0 || j>=length_t-1) ? 0 : 1; //(Math.sin(j / length_t * Math.PI * 2) * 0.5 + 0.5); const obj = {x:x, y:y, z:z, a:a, r:r2}; const points = getPoints(obj); if (j!=0) { points[0] = list[list.length-1].points[1]; points[3] = list[list.length-1].points[2]; } obj.points = points; list.push(obj); } list.sort(function(a, b) { return a.z - b.z; }); } if (list.length < 1) return false; const obj = list.shift(); const hmin = 0.05, hmax = 0.9; const h = hatch ? (hmax - (obj.z + radius) / radius / 2 * (hmax-hmin)) : 0; drawPoints(obj.points, h); return true; } function getPoints(obj) { const r = (100 - obj.z) * width / 100 * obj.r; const x = obj.x; const y = obj.y; const steps = 4; const points = []; for (var j=0; j<steps; j++) { const a = Math.PI / 4 + Math.PI * 2 / steps * j; const cx = r/4 * Math.cos(a); const cy = r * Math.sin(a); const rx = rotX(cx, cy, obj.a); const ry = rotY(cx, cy, obj.a); const fx = x + rx; const fy = y + ry; points.push([fx,fy]); } return points; } function rotX(x, y, a) { return Math.cos(a) * x - Math.sin(a) * y; } function rotY(x, y, a) { return Math.sin(a) * x + Math.cos(a) * y; } function drawPoints(dpoints, hatching=0, angle=Math.PI/4) { if (style == 0) { // turtle.jump(dpoints[dpoints.length-1]); // dpoints.forEach(p=>turtle.goto(p)); turtle.jump(dpoints[0]); turtle.goto(dpoints[1]); turtle.jump(dpoints[2]); turtle.goto(dpoints[3]); } else { const p1 = polygons.create(); p1.addPoints(...dpoints); //p1.addOutline(); p1.dp.push(p1.cp[0], p1.cp[1]); p1.dp.push(p1.cp[2], p1.cp[3]); if (hatching) p1.addHatching(-angle, hatching); polygons.draw(turtle, p1, true); } } // Random with seed var rng; function random() { if (rng === undefined) rng = new RNG(seed); return rng.nextFloat(); } function RNG(t){return new class{constructor(t){this.m=2147483648,this.a=1103515245,this.c=12345,this.state=t||Math.floor(Math.random()*(this.m-1))}nextFloat(){return this.state=(this.a*this.state+this.c)%this.m,this.state/(this.m-1)}}(t)} //////////////////////////////////////////////////////////////// // Polygon Clipping utility code - Created by Reinder Nijhoff 2019 // https://turtletoy.net/turtle/a5befa1f8d //////////////////////////////////////////////////////////////// function Polygons(){const t=[],s=class{constructor(){this.cp=[],this.dp=[],this.aabb=[]}addPoints(...t){let s=1e5,e=-1e5,h=1e5,i=-1e5;(this.cp=[...this.cp,...t]).forEach(t=>{s=Math.min(s,t[0]),e=Math.max(e,t[0]),h=Math.min(h,t[1]),i=Math.max(i,t[1])}),this.aabb=[(s+e)/2,(h+i)/2,(e-s)/2,(i-h)/2]}addSegments(...t){t.forEach(t=>this.dp.push(t))}addOutline(){for(let t=0,s=this.cp.length;t<s;t++)this.dp.push(this.cp[t],this.cp[(t+1)%s])}draw(t){for(let s=0,e=this.dp.length;s<e;s+=2)t.jump(this.dp[s]),t.goto(this.dp[s+1])}addHatching(t,e){const h=new s;h.cp.push([-1e5,-1e5],[1e5,-1e5],[1e5,1e5],[-1e5,1e5]);const i=Math.sin(t)*e,n=Math.cos(t)*e,a=200*Math.sin(t),p=200*Math.cos(t);for(let t=.5;t<150/e;t++)h.dp.push([i*t+p,n*t-a],[i*t-p,n*t+a]),h.dp.push([-i*t+p,-n*t-a],[-i*t-p,-n*t+a]);h.boolean(this,!1),this.dp=[...this.dp,...h.dp]}inside(t){let s=0;for(let e=0,h=this.cp.length;e<h;e++)this.segment_intersect(t,[.1,-1e3],this.cp[e],this.cp[(e+1)%h])&&s++;return 1&s}boolean(t,s=!0){if(Math.abs(this.aabb[0]-t.aabb[0])-(t.aabb[2]+this.aabb[2])>=0&&Math.abs(this.aabb[1]-t.aabb[1])-(t.aabb[3]+this.aabb[3])>=0)return this.dp.length>0;const e=[];for(let h=0,i=this.dp.length;h<i;h+=2){const i=this.dp[h],n=this.dp[h+1],a=[];for(let s=0,e=t.cp.length;s<e;s++){const h=this.segment_intersect(i,n,t.cp[s],t.cp[(s+1)%e]);!1!==h&&a.push(h)}if(0===a.length)s===!t.inside(i)&&e.push(i,n);else{a.push(i,n);const h=n[0]-i[0],p=n[1]-i[1];a.sort((t,s)=>(t[0]-i[0])*h+(t[1]-i[1])*p-(s[0]-i[0])*h-(s[1]-i[1])*p);for(let h=0;h<a.length-1;h++)(a[h][0]-a[h+1][0])**2+(a[h][1]-a[h+1][1])**2>=.001&&s===!t.inside([(a[h][0]+a[h+1][0])/2,(a[h][1]+a[h+1][1])/2])&&e.push(a[h],a[h+1])}}return(this.dp=e).length>0}segment_intersect(t,s,e,h){const i=(h[1]-e[1])*(s[0]-t[0])-(h[0]-e[0])*(s[1]-t[1]);if(0===i)return!1;const n=((h[0]-e[0])*(t[1]-e[1])-(h[1]-e[1])*(t[0]-e[0]))/i,a=((s[0]-t[0])*(t[1]-e[1])-(s[1]-t[1])*(t[0]-e[0]))/i;return n>=0&&n<=1&&a>=0&&a<=1&&[t[0]+n*(s[0]-t[0]),t[1]+n*(s[1]-t[1])]}};return{list:()=>t,create:()=>new s,draw:(s,e,h=!0)=>{for(let s=0;s<t.length&&e.boolean(t[s]);s++);e.draw(s),h&&t.push(e)}}}