createCanvas(windowWidth, windowHeight);
translate(width/2, height/2);
let v1 = p5.Vector.fromAngle(5*PI/6, s);
let v2 = p5.Vector.fromAngle(PI/6, s);
let v3 = p5.Vector.fromAngle(-PI/2, s);
divide(v1.x, v1.y, v2.x, v2.y, v3.x, v3.y, n+1);
kochCurve(v1.x, v1.y, v3.x, v3.y, n);
kochCurve(v3.x, v3.y, v2.x, v2.y, n);
kochCurve(v2.x, v2.y, v1.x, v1.y, n);
function prop(x1, y1, x2, y2, k) {
let x3 = (1-k)*x1 + k*x2;
let y3 = (1-k)*y1 + k*y2;
function thirdPoint(x1, y1, x2, y2) {
let x3 = (x2-x1)/2 + sqrt(3)*(y2-y1)/2 + x1;
let y3 = -sqrt(3)*(x2-x1)/2 + (y2-y1)/2 + y1;
function kochCurve(x1, y1, x2, y2, n) {
let [xA, yA] = prop(x1, y1, x2, y2, 1/3);
let [xB, yB] = prop(x1, y1, x2, y2, 2/3);
let [xC, yC] = thirdPoint(xA, yA, xB, yB);
kochCurve(x1, y1, xA, yA, n-1);
kochCurve(xA, yA, xC, yC, n-1);
kochCurve(xC, yC, xB, yB, n-1);
kochCurve(xB, yB, x2, y2, n-1);
divide(xA, yA, xB, yB, xC, yC, n);
function divide(x1, y1, x2, y2, x3, y3, n) {
let [xA, yA] = prop(x1, y1, x2, y2, 1/3);
let [xB, yB] = prop(x1, y1, x2, y2, 2/3);
let [xC, yC] = prop(x2, y2, x3, y3, 1/3);
let [xD, yD] = prop(x2, y2, x3, y3, 2/3);
let [xE, yE] = prop(x3, y3, x1, y1, 1/3);
let [xF, yF] = prop(x3, y3, x1, y1, 2/3);
let [xG, yG] = prop(xF, yF, xC, yC, 1/2);
divide(x1, y1, xA, yA, xF, yF, n-1);
divide(xA, yA, xB, yB, xG, yG, n-1);
divide(xB, yB, x2, y2, xC, yC, n-1);
divide(xG, yG, xF, yF, xA, yA, n-1);
divide(xC, yC, xG, yG, xB, yB, n-1);
divide(xF, yF, xG, yG, xE, yE, n-1);
divide(xG, yG, xC, yC, xD, yD, n-1);
divide(xD, yD, xE, yE, xG, yG, n-1);
divide(xE, yE, xD, yD, x3, y3, n-1);
drawTriangle(x1, y1, x2, y2, x3, y3);
function drawTriangle(x1, y1, x2, y2, x3, y3) {
let d = dist(x1, y1, x2, y2);
arc(x1, y1, 2*d/3, 2*d/3, atan2(y3-y1, x3-x1), atan2(y2-y1, x2-x1));
arc(x2, y2, 2*d/3, 2*d/3, atan2(y1-y2, x1-x2), atan2(y3-y2, x3-x2));
arc(x3, y3, 2*d/3, 2*d/3, atan2(y2-y3, x2-x3), atan2(y1-y3, x1-x3));
arc(x1, y1, 4*d/3, 4*d/3, atan2(y3-y1, x3-x1), atan2(y2-y1, x2-x1));
arc(x2, y2, 4*d/3, 4*d/3, atan2(y1-y2, x1-x2), atan2(y3-y2, x3-x2));
arc(x3, y3, 4*d/3, 4*d/3, atan2(y2-y3, x2-x3), atan2(y1-y3, x1-x3));
arc(x12, y12, d/3, d/3, atan2(y1-y12, x1-x12), atan2(y2-y12, x2-x12));
arc(x23, y23, d/3, d/3, atan2(y2-y23, x2-x23), atan2(y3-y23, x3-x23));
arc(x31, y31, d/3, d/3, atan2(y3-y31, x3-x31), atan2(y1-y31, x1-x31));