its a crown. Used @zoso95's interpolation (modified so it accepted [x,y]
imgur.com/xiw9k0v
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 num_circles = 8;
const amount_randomizer = 1/10;
const amount_oval = 1.25;
const x_randomness = 0;
const y_randomness = 1;
const circle_rad = 60;
const rand_array = [];
for (let i = 0; i<100; i+= 1){
rand_array.push(Math.random());
}
class circlething {
constructor (r,rand) {
this.array = [];
for (let i = 1; i < 65; i += 1) {
var x = amount_oval*(Math.cos(i*0.1)*r-rand_array[i]*(rand*r*x_randomness));
var y = Math.sin(i*0.1)*r-rand_array[i]*(rand*r*y_randomness);
this.array.push([x,y]);
}
//this.array.push(this.array[this.array.length-1]);
}
};
const circle_array = [];
for (let i = 0; i<num_circles; i+=1) {
circle_array.push(new circlething(circle_rad,i*amount_randomizer));
}
turtle.drawSpline = (pts, tension = 0.5, isClosed = true, numOfSegments = 5) => {
const res = []; // clone array
const _pts = pts.slice(0);
turtle.up();
// The algorithm require a previous and next point to the actual point array.
// Check if we will draw closed or open curve.
// If closed, copy end points to beginning and first points to end
// If open, duplicate first points to befinning, end points to end
if (isClosed) {
_pts.unshift(pts[pts.length - 1]);
_pts.unshift(pts[pts.length - 2]);
_pts.unshift(pts[pts.length - 1]);
_pts.unshift(pts[pts.length - 2]);
_pts.push(pts[0]);
_pts.push(pts[1]);
}
else {
_pts.unshift(pts[1]); //copy 1. point and insert at beginning
_pts.unshift(pts[0]);
_pts.push(pts[pts.length - 2]); //copy last point and append
_pts.push(pts[pts.length - 1]);
}
// ok, lets start..
// 1. loop goes through point array
// 2. loop goes through each segment between the 2 pts + 1e point before and after
for (let i = 2; i < (_pts.length - 4); i += 2) {
for (let t = 0; t <= numOfSegments; t++) {
// calc tension vectors
const t1x = (_pts[i+2][0] - _pts[i-2][0]) * tension;
const t2x = (_pts[i+4][0] - _pts[i][0]) * tension;
const t1y = (_pts[i+3][1] - _pts[i-1][1]) * tension;
const t2y = (_pts[i+5][1] - _pts[i+1][1]) * tension;
// calc step
const st = t / numOfSegments;
// calc cardinals
const c1 = 2 * Math.pow(st, 3) - 3 * Math.pow(st, 2) + 1;
const c2 = -(2 * Math.pow(st, 3)) + 3 * Math.pow(st, 2);
const c3 = Math.pow(st, 3) - 2 * Math.pow(st, 2) + st;
const c4 = Math.pow(st, 3) - Math.pow(st, 2);
// calc x and y cords with common control vectors
const x = c1 * _pts[i][0] + c2 * _pts[i+2][0] + c3 * t1x + c4 * t2x;
const y = c1 * _pts[i+1][1] + c2 * _pts[i+3][1] + c3 * t1y + c4 * t2y;
//store points in array
res.push(x);
res.push(y);
}
}
// draw
turtle.goto(res[0], res[1]);
turtle.position();
for(let i = 2; i < res.length - 1; i += 2) {
turtle.down();
turtle.goto(res[i], res[i+ 1]);
turtle.up();
}
return res;
}
// The walk function will be called until it returns false.
var j = 0;
function walk(i) {
turtle.drawSpline(circle_array[j].array);
j += 1;
return i < circle_array.length-1
}