$radius = 50; $branching = 5; seed = rands(0, 123789, 1)[0]; module twig(length, branching) { translate([length/2, 0, 0]) cube([length, level/branching, 1], true); if(branching > 1){ dist = 0.9 * length/branching; for(d = [0.1*length:dist:0.9*length]) { translate([d, 0, 0]) { p = rands(0, 1, 1, seed*d)[0]; next_branching = rands(1, branching-1, 1, seed*d)[0]; if(p > 0.8){ hexagon(length/12); } else { s = (length - 0.5*d) / length; rotate([0, 0, 60]) twig(s * length/4, next_branching); rotate([0, 0, -60]) twig(s * length/4, next_branching); } } } } } module hexagon(size, height=1) { linear_extrude(height=height, center=true) { circle($fn=6, r=size); } } module keyhole(size=2) { difference() { cylinder(h=1, r=size, $fn=120, center=true); cylinder(h=1, r=0.8*size, $fn=120, center=true); } } module snowflake() { for(i = [1:6]){ rotate([0,0,60*i]) twig($radius, $branching); } keyhole_size = max(min($radius, 1), 2); translate([$radius + 1.5, 0, 0]) keyhole(keyhole_size); } snowflake();