function koch(p0, p1, limit) {
const dx = p1[0] - p0[0];
const dy = p1[1] - p0[1];
const dist = Math.sqrt(dx * dx + dy * dy);
const unit = dist / 3;
const angle = Math.atan2(dy, dx);
const pA = [p0[0] + dx / 3, p0[1] + dy / 3];
const pC = [p1[0] - dx / 3, p1[1] - dy / 3];
const pB = [
pA[0] + Math.cos(angle - Math.PI / 3) * unit,
pA[1] + Math.sin(angle - Math.PI / 3) * unit
];
if (limit > 0) {
return [
koch(p0, pA, limit - 1),
koch(pA, pB, limit - 1),
koch(pB, pC, limit - 1),
koch(pC, p1, limit - 1)
].flat();
}
return [p0, pA, pB, pC, p1];
}