bumpy spiral!
My first published turtle :D Thanks for the amazing tool and the fun community, I really have been enjoying making these.
Log in to post a comment.
// 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();
const n_phases = 5 //min=1 max=6 step=1
const growth_step = 0 //min=0 max=10 step=0.1
const linewidth = 25 //min=0.1 max=50 step=0.1
const k = 10; //min=0 max=20 step=0.1
const radstart = 0 //min=0 max=100 step=1
const radmax = 38 //min=1 max=100 step=1
const radmult = 1 //min=1 max=6.28 step=0.01
const anglestep = 0.01
const str_lin = 1 //min=0 max=10 step=.1
const rep_str = 30 // min=-100 max=100 step = 1
const past_str = 69 // min=0 max=200 step = 1
const future_str = 69 //min=0 max=200 step=1
const rep_n = 100 //min=0 max=200 step=1
const rep_width = 5.4 //min=0 max=50 step=0.1
const time_decay = 10 //min=1 max=50 step=0.1
const center_x = 0 //min=-100 max=100 step=1
const center_y = 0 //min=-100 max=100 step=1
const total_scale_d = 2.5 //min=0 max=10.0 step=0.1
const total_scale_n = 1.0 //min=0 max=10.0 step=0.1
function fdiff_r(diffx, diffy) {
return Math.sqrt(diffx**2 + diffy**2)
}
function f_exp(value) {
return Math.E**(-1*value**2)
}
function walk(i) {
one_spiral(i*growth_step,i*(360/n_phases))
i += 1
return i<n_phases
}
// The walk function will be called until it returns false.
function one_spiral(growth, phasing) {
turtle.penup()
let last_x=0
let last_y=0
let anglemax = (radmax*360)+anglestep
let randlocs = new Array(rep_n)
for (let rep_i=0; rep_i<rep_n; rep_i+=1) {
randlocs[rep_i] = Math.random()*(anglemax-radstart*360) + radstart*360
}
for (let angle=radstart*360; angle<=anglemax; angle+=anglestep) {
let radius = (1 + growth/100)*((linewidth*((angle+phasing)/360))**radmult)/k
let theta = (2*angle)*(Math.PI/360)
let pen_x = radius * Math.sin(theta) + center_x ;
let pen_y = radius * Math.cos(theta) + center_y;
let forces_x = 0
let forces_y = 0
for (let rep_i=0; rep_i<rep_n; rep_i+=1) {
let angle_diff = Math.abs(angle - randlocs[rep_i])
let force = 0
let magshift = angle_diff/rep_width
force = f_exp(magshift) * rep_str
let nshift = (((angle_diff-180)%360) - 180)/rep_width
let time_force = f_exp(nshift) * f_exp(angle_diff*time_decay/anglemax)
if (angle < randlocs[rep_i]) {
force += time_force * future_str
}
else {
force -= time_force * past_str
}
force *= (angle/anglemax)*str_lin
pen_x -= force * Math.sin(theta)
pen_y -= force * Math.cos(theta)
}
//total scale
pen_x *= (total_scale_n/total_scale_d)
pen_y *= (total_scale_n/total_scale_d)
//check for small moves
if (fdiff_r(pen_x-last_x, pen_y-last_y) > 0.2) {
if ((Math.abs(pen_x)-100 < 0) & (Math.abs(pen_y)-100 < 0)) {
turtle.goto(pen_x, pen_y); }
turtle.pendown()
last_x=pen_x
last_y=pen_y
}
}
}