Deployable kirigami
Draw closed-loop cutting pattern that deploys into a 3D shape when a load is applied perpendicularly to the surface.
Log in to post a comment.
// Forked from "Deployable kirigami" by JooWoho
// https://turtletoy.net/turtle/6a37b2a9f7
Canvas.setpenopacity(1);
const turtle = new Turtle();
let scale = 1; // adjust to fit canvas
// ----------------------
// PARAMETERS
// ----------------------
const part = 8; // number of sections
const circle_number = 30; // total circles
let r0 = 15; // starting radius
let w = 2; // base width
// Initial epsilon for first circle
let epsilon0 = 5;
// ----------------------
// Examples slope functions
//constant slope
//function epsilon_slope(n) { return epsilon0}
// linear increase
//function epsilon_slope(n) { return epsilon0 + n*0.2; }
// linear decrease
//function epsilon_slope(n) { return epsilon0 - n*0.1; }
// sinusoidal variation
function epsilon_slope(n) { return epsilon0 * (1 + 0.3 * Math.sin(n/5)); }
// ----------------------
// DRAW ARC FUNCTION
// ----------------------
function draw_arc(radius, start, end, epsilon) {
const steps = 20;
const step = (end - start) / steps;
for (let k = 0; k <= steps; k++) {
let angle = start + k * step;
let x = scale * radius * Math.cos(angle);
let y = scale * radius * Math.sin(angle);
if (k === 0) {
turtle.penup();
turtle.goto(x, y);
turtle.pendown();
} else {
turtle.goto(x, y);
}
}
}
// ----------------------
// WALK FUNCTION
// ----------------------
function walk(i) {
if (i > 0) return false; // draw only once
let r = r0;
for (let n = 0; n < circle_number; n++) {
// Compute epsilon for this circle
let epsilon = epsilon_slope(n);
// Compute radius increment from slope equation
if (n === 0) delta_r = 0; // first circle doesn't grow
let start = 0;
let end = start + 2 * Math.PI / part;
let start2 = end;
let end2 = start2 + 2 * Math.PI / part;
for (let j = 1; j <= part; j++) {
if (n % 2 === 0) {
draw_arc(r, start - epsilon / r, end + epsilon / r, epsilon);
} else {
draw_arc(r, start2 - epsilon / r, end2 + epsilon / r, epsilon);
}
start = end + 2 * Math.PI / part;
end = start + 2 * Math.PI / part;
start2 = end2 + 2 * Math.PI / part;
end2 = start2 + 2 * Math.PI / part;
}
// Update radius according to slope equation
r += w;
}
return false;
}