diff --git a/examples/packing_circles.scad b/examples/packing_circles.scad index 5f816227..42bd8c27 100644 --- a/examples/packing_circles.scad +++ b/examples/packing_circles.scad @@ -2,7 +2,6 @@ use ; use ; size = [200, 100]; -density = 2; min_radius = 1; point_numbers = 100; @@ -11,7 +10,7 @@ points = [ [rand(0, size.x), rand(0, size.y)] ]; -circles = circle_packing(points, density, min_radius); +circles = circle_packing(points, min_radius); mr = max([for(c = circles) c[1]]); translate([0, 0, mr]) for(c = circles) { diff --git a/src/experimental/circle_packing.scad b/src/experimental/circle_packing.scad index 3155c12d..b764dac2 100644 --- a/src/experimental/circle_packing.scad +++ b/src/experimental/circle_packing.scad @@ -2,19 +2,23 @@ use ; use ; -function circle_packing(points, density = 1, min_r = 1) = +function circle_packing(points, min_r = 1) = [ for(t = tri_delaunay(points, ret = "TRI_SHAPES")) - each tri_circle_packing(t, density, min_r) + each tri_circle_packing(t, min_r) ]; $fn = 24; -density = 3; min_r = 1; points = [for(i = [0:100]) rands(-100, 100, 2)]; -for(c = circle_packing(points, density, min_r)) { +for(c = circle_packing(points, min_r)) { translate(c[0]) sphere(c[1]); } + +for(t = tri_delaunay(points, ret = "TRI_SHAPES")) { + offset(-.1) + polygon(t); +} \ No newline at end of file diff --git a/src/experimental/circle_packing3.scad b/src/experimental/circle_packing3.scad index 9f34a524..270cd591 100644 --- a/src/experimental/circle_packing3.scad +++ b/src/experimental/circle_packing3.scad @@ -13,7 +13,7 @@ function circle_packing3(points, density = 1, min_r = 1) = function circle_packing_triangle3(t, density, min_r) = [ for(st = tri_subdivide(t, density)) - each tri_circle_packing(st, density, min_r) + each tri_circle_packing(st, min_r) ]; $fn = 24; diff --git a/src/experimental/tri_circle_packing.scad b/src/experimental/tri_circle_packing.scad index 2720f20c..52313138 100644 --- a/src/experimental/tri_circle_packing.scad +++ b/src/experimental/tri_circle_packing.scad @@ -1,7 +1,7 @@ use ; use ; -function r(sin, leng_cv, pre_R) = sin * (leng_cv - pre_R) / (1 + sin); +function r2(sinv, leng_cv, pre_R) = sinv * (leng_cv - pre_R) / (1 + sinv); // the 3rd circle function c3_r(r1, r2) = (r1 * r2) / (r1 + r2 + 2 * sqrt(r1 * r2)); @@ -13,7 +13,7 @@ function c3_a(r1, r2, r3) = ) acos((b ^ 2 + c ^ 2 - a ^ 2) / (2 * b * c)); -function tri_circle_packing(t, density, min_r) = +function tri_circle_packing(t, min_r) = let( center = tri_incenter(t), s1 = t[1] - t[0], @@ -35,45 +35,29 @@ function tri_circle_packing(t, density, min_r) = leng_cc = norm(cc), unit_cc = cc / leng_cc, sinc = R / leng_cc, - _small_circles = function(density, pre_leng_a = R, pre_leng_b = R, pre_leng_c = R, pre_ra = R, pre_rb = R, pre_rc = R) - density <= 0 ? [] : + pack_a = function(sinv, leng_cv, unit_cv, pre_leng = R, pre_r = R) let( - ra = r(sina, leng_ca, pre_leng_a), - Ra = pre_leng_a + ra, - ct_a = center - unit_ca * Ra, + r2 = r2(sinv, leng_cv, pre_leng), + leng = pre_leng + r2, + r2_ct = center - unit_cv * leng, - rb = r(sinb, leng_cb, pre_leng_b), - Rb = pre_leng_b + rb, - ct_b = center - unit_cb * Rb, - - rc = r(sinc, leng_cc, pre_leng_c), - Rc = pre_leng_c + rc, - ct_c = center - unit_cc * Rc, - - r3a = c3_r(pre_ra, ra), - alpha3a = c3_a(pre_ra, ra, r3a), - vta = unit_ca * (r3a + ra), - ct1a = ct_a + ptf_rotate(vta, alpha3a), - ct2a = ct_a + ptf_rotate(vta, -alpha3a), - - r3b = c3_r(pre_rb, rb), - alpha3b = c3_a(pre_rb, rb, r3b), - vtb = unit_cb * (r3b + rb), - ct1b = ct_b + ptf_rotate(vtb, alpha3b), - ct2b = ct_b + ptf_rotate(vtb, -alpha3b), - - r3c = c3_r(pre_rc, rc), - alpha3c = c3_a(pre_rc, rc, r3c), - vtc = unit_cc * (r3c + rc), - ct1c = ct_c + ptf_rotate(vtc, alpha3c), - ct2c = ct_c + ptf_rotate(vtc, -alpha3c) + r3 = c3_r(pre_r, r2), + a = c3_a(pre_r, r2, r3), + vta = unit_cv * (r3 + r2), + r3_ct1 = r2_ct + ptf_rotate(vta, a), + r3_ct2 = r2_ct + ptf_rotate(vta, -a) ) - [ - if(ra > min_r) each [[ct_a, ra], if(r3a > min_r) each [[ct1a, r3a], [ct2a, r3a]]], - if(rb > min_r) each [[ct_b, rb], if(r3b > min_r) each [[ct1b, r3b], [ct2b, r3b]]], - if(rc > min_r) each [[ct_c, rc], if(r3c > min_r) each [[ct1c, r3c], [ct2c, r3c]]], - each _small_circles(density - 1, ra + Ra, rb + Rb, rc + Rc, ra, rb, rc) - ] + r2 > min_r ? + concat( + [[r2_ct, r2], if(r3 > min_r) each [[r3_ct1, r3], [r3_ct2, r3]]], + pack_a(sinv, leng_cv, unit_cv, r2 + leng, r2) + ) + : [] ) - [[center, R], each _small_circles(density - 1)]; + [ + [center, R], + each pack_a(sina, leng_ca, unit_ca), + each pack_a(sinb, leng_cb, unit_cb), + each pack_a(sinc, leng_cc, unit_cc), + ]; \ No newline at end of file