### Imperfect poly packing

Based on Circle packing #1 but an imperfect imperfect-poly-draw-function is used to draw the 'circles'. The result is very imperfect.

#packing #handdrawing

```// Imperfect poly packing. Created by Reinder Nijhoff 2018
// @reindernijhoff
//
// https://turtletoy.net/turtle/b0ac9de176
//

const min_number_of_sides = 3; // try 30
const canvas_size = 95;
const max_tries = 7500;

const circles = [];

const turtle = new Turtle();

let coord_found = false;
let tries = 0;

while (!coord_found && tries < max_tries) {
tries ++;
const x = Math.random() * (canvas_size-r)*2 -canvas_size + r;
const y = Math.random() * (canvas_size-r)*2 -canvas_size + r;
const possible = circles.every(c => {
const dx = c[0] - x;
const dy = c[1] - y;
const dr = c[2] + r;

return dx**2 + dy**2 > dr**2;
});
if (possible) {
coord_found = true;
draw_circle(x,y,t, r);
circles.push([x,y,r]);
return true;
}
}
return false;
}

function draw_circle(x,y,t, r) {
draw_imperfect_poly(x,y,t,min_number_of_sides+Math.floor(Math.random()*4),r);
}

function draw_imperfect_poly(x,y,t, c, r) {
const side = 2*Math.sin(Math.PI/c) * r - 3/c;
const side_div = 10;
const rand_angle = Math.max(0.03,0.1/c);

t.penup();
t.goto(x,y-r);
t.circle(r,Math.random()*Math.PI);
t.pendown();

t.right(Math.PI/c);
for (let i=0; i<c; i++) {
for(let j=0; j<Math.ceil(side*side_div);j++) {
t.forward(side/Math.ceil(side*side_div));
t.right((Math.random()-.5)*rand_angle);
}
t.circle(3/c,Math.PI*2/c);
}
t.forward(Math.random());
}

function walk(i) {