If you'd like fresh ones: Radioactive decay ☢️ (variation)
Derived (play with sliders):
Radioactive decay ☢️ (variation)
Radioactive decay ☢️ (variation)
Radioactive decay ☢️ (variation)
Log in to post a comment.
// Global code will be evaluated once.
const plottable = 0; //min=0 max=1 step=1 (Nay: give me opacity and pen thickness variation, Yea: less variation but at least I can frame it (be sure to manage intraCircleSpacing) )
const paletteSize = 5; //min=1 max=5 step=1
const gridSize = 5; //min=1 max=10 step=1
const padding = 1; //min=0 max=20 step=1
const border = 2; //min=0 max=30 step=1
const intraCircleSpacing = .5; //min=.2 max=2 step=.1
let maxArc = 1; //min=0 max=1 step=.01
let minArc = .6; //min=0 max=1 step=.01
const maxThickness = 5; //min=1 max=5 step=1
const minimumRadius = 0; //min=0 max=10 step=1
const interDeviation = .25 //min=0 max=1 step=.01
// You can find the Turtle API reference here: https://turtletoy.net/syntax
let baleSize = paletteSize
Canvas.setpenopacity(plottable == 1? -1: -1/baleSize);
const bales = plottable == 1? [new Turtle()]: Array.apply(null,{length: paletteSize}).map(b => new Bale(baleSize--, Slowbro));
maxArc = Math.max(maxArc, minArc);
minArc = Math.min(maxArc, minArc);
const pi2 = Math.PI * 2;
const circleResolution = 50;
const rot2 = (a) => [Math.cos(a), -Math.sin(a), Math.sin(a), Math.cos(a)];
const trans2 = (m, a) => [m[0]*a[0]+m[2]*a[1], m[1]*a[0]+m[3]*a[1]];
const grid = new Grid(gridSize, border, padding);
// The walk function will be called until it returns false.
function walk(i) {
const allRot = Math.random() * pi2;
for(let j = minimumRadius ; j <= grid.cellSize / 2; j+=intraCircleSpacing) {
let turtle = bales[bales.length * Math.random() | 0];
const arc = minArc * pi2 + (Math.random() * pi2 * (maxArc - minArc));
const rot = rot2(allRot + (pi2 * Math.random() * interDeviation));
const cell = grid.getCell(i);
turtle.up();
if(plottable == 0) turtle.set('thickness', (Math.random() * (maxThickness - 1) | 0) + 1);
for(let k = 0; k <= circleResolution; k++) {
const kk = k - circleResolution / 2;
turtle.goto(cell.map(trans2(rot, [Math.sin(arc * kk/circleResolution) * j, -Math.cos(arc * kk/circleResolution) * j]), 1));
turtle.down();
}
}
return i < grid.cellCount - 1;
}
let t = new Turtle();
////////////////////////////////////////////////////////////////
// Grid utility code. Created by Jurgen Westerhof 2022
////////////////////////////////////////////////////////////////
function Grid(size, border = 0, cellMargin = 0) {
const add2 = (a,b) => [a[0]+b[0],a[1]+b[1]];
const scale2 = (a,b) => [a[0]*b,a[1]*b];
class GridCell {
constructor(column, row, position, size) { this.column = column; this.row = row; this.position = position; this.size = size; }
map(vector, vectorScalar = this.size/2) { return add2(this.position, scale2(vector, vectorScalar)); }
}
class Grid {
size = 0; border = 0; cellMargin = 0; available = 200; topLeft = [-100,-100]; cellSize = 0; cellCount = 0;
constructor(size, border = 0, cellMargin = 0) { this.size = size; this.cellCount = this.size**2; this.border = border; this.cellMargin = cellMargin; this.recalibrate(); }
recalibrate() { this.cellSize = (this.available - (2 * Math.max(this.border, this.cellMargin)) - ((this.size - 1) * this.cellMargin)) / this.size; }
getCell(i) { const row = i / this.size | 0; const col = i % this.size; return new GridCell(col, row, add2(this.topLeft, [Math.max(this.border, this.cellMargin) + (.5 * this.cellSize) + (col * (this.cellSize+this.cellMargin)), Math.max(this.border, this.cellMargin) + (.5 * this.cellSize) + (row * (this.cellSize+this.cellMargin))]), this.cellSize); }
}
return new Grid(size, border, cellMargin);
}
////////////////////////////////////////////////////////////////
// Slowbro utility code. Created by Lionel Lemarie 2021
// Based on Slowpoke by Reinder, which removes most duplicate
// lines Slowbro adds optional thickness to the lines
////////////////////////////////////////////////////////////////
function Slowbro(x, y) {
const linesDrawn = {};
class Slowbro extends Turtle {
constructor(x, y) {
super(x, y);
this.thickness = 1; this.offset = 0.2;
this.slowpoke_skip = this.slowpoke_draw = 0;
}
goto(x, y) {
if (Array.isArray(x)) { y = x[1]; x = x[0]; }
const ox = this.x(), oy = this.y();
if (this.isdown()) {
const p = [x, y], o = [ox, oy];
const h1 = o[0].toFixed(2) + '_' + p[0].toFixed(2) + o[1].toFixed(2) + '_' + p[1].toFixed(2);
const h2 = p[0].toFixed(2) + '_' + o[0].toFixed(2) + p[1].toFixed(2) + '_' + o[1].toFixed(2);
if (linesDrawn[h1] || linesDrawn[h2]) {
super.up(); super.goto(p); super.down();
this.slowpoke_skip++;
return;
}
linesDrawn[h1] = linesDrawn[h2] = true;
this.slowpoke_draw++;
for (var dx = this.thickness-1; dx >=0 ; dx--) {
for (var dy = this.thickness-1; dy >= 0; dy--) {
if (!dx && !dy) continue;
super.goto( x + dx * this.offset, y + dy * this.offset);
super.goto(ox + dx * this.offset, oy + dy * this.offset);
}
}
}
super.goto(x, y);
}
}
return new Slowbro(x, y);
}
////////////////////////////////////////////////////////////////
// Bale utility code - Created by Jurgen Westerhof 2022
// https://turtletoy.net/turtle/7269af8a23
// Modified to be compatible with Slowpoke / Slowbro and set
// e.g. thinkness
// Abusing the opacity, usage:
// Canvas.setpenopacity(1/baleSize);
// const bales = Array.apply(null,{length: baleSize}).map(b => new Bale(baleSize--);
// Then use bales[x] wherever you would use a turtle object to 'draw'
// in 'color' x (i.e Polygon hatching with a bale object and .15 interspacing)
////////////////////////////////////////////////////////////////
function Bale(n, turtleClass = null) {
class Bale {
constructor(n) { this.turtles = Array.apply(null,{length: n}).map(i => turtleClass == null? new Turtle(): new turtleClass()); }
back(e) { this.turtles.map(t => t.back(e)); return this; }
backward(e) { this.turtles.map(t => t.backward(e)); return this; }
bk(e) { this.turtles.map(t => t.bk(e)); return this; }
fd(e) { this.turtles.map(t => t.fd(e)); return this; }
forward(e) { this.turtles.map(t => t.forward(e)); return this; }
left(e) { this.turtles.map(t => t.left(e)); return this; }
lt(e) { this.turtles.map(t => t.lt(e)); return this; }
right(e) { this.turtles.map(t => t.right(e)); return this; }
rt(e) { this.turtles.map(t => t.rt(e)); return this; }
seth(e) { this.turtles.map(t => t.seth(e)); return this; }
setheading(e) { this.turtles.map(t => t.setheading(e)); return this; }
setx(e) { this.turtles.map(t => t.setx(e)); return this; }
sety(e) { this.turtles.map(t => t.sety(e)); return this; }
setpos(x, y) { this.turtles.map(t => t.setpos(x, y)); return this; }
setposition(x, y) { this.turtles.map(t => t.setposition(x, y)); return this; }
toradians(e) { this.turtles.map(t => t.toradians(e)); return this; }
degrees(e) { this.turtles.map(t => t.degrees(e)); return this; }
goto(x, y) { this.turtles.map(t => t.goto(x, y)); return this; }
jmp(x, y) { this.turtles.map(t => t.jmp(x, y)); return this; }
jump(x, y) { this.turtles.map(t => t.jump(x, y)); return this; }
circle(radius, extent, steps) { this.turtles.map(t => t.circle(radius, extent, steps)); return this; }
clone() { let b = new Bale(this.turtle.length); this.turtles.map((t, k) => b.turtles[k] = t.clone()); return b; }
h() { return this.turtles[0].h(); }
heading() { return this.turtles[0].heading(); }
home() { this.turtles.map(t => t.home()); return this; }
isdown() { return this.turtles[0].isdown(); }
pos() { return this.turtles[0].pos(); }
position() { return this.turtles[0].position(); }
pd() { this.turtles.map(t => t.pd()); return this; }
pendown() { this.turtles.map(t => t.pendown()); return this; }
penup() { this.turtles.map(t => t.penup()); return this; }
pu() { this.turtles.map(t => t.pu()); return this; }
down() { this.turtles.map(t => t.down()); return this; }
up() { this.turtles.map(t => t.up()); return this; }
radians() { this.turtles.map(t => t.radians()); return this; }
x() { return this.turtles[0].x(); }
xcor() { return this.turtles[0].xcor(); }
y() { return this.turtles[0].y(); }
ycor() { return this.turtles[0].ycor(); }
set(a, x) { this.turtles.map(t => t[a] = x); }
get(a) { this.turtles[0][a]; }
}
return new Bale(n);
}