diff --git a/src/experimental/tri_circle_packing.scad b/src/experimental/tri_circle_packing.scad index d4b74b75..560b4d57 100644 --- a/src/experimental/tri_circle_packing.scad +++ b/src/experimental/tri_circle_packing.scad @@ -14,7 +14,7 @@ function c3_a(r1, r2, r3) = acos((b ^ 2 + c ^ 2 - a ^ 2) / (2 * b * c)); -function pack_one(min_r, center, sinv, leng_cv, unit_cv, pre_leng, pre_r) = +function pack_one(min_r, center, v, sinv, leng_cv, unit_cv, pre_leng, pre_r) = let( r2 = r2(sinv, leng_cv, pre_leng), leng = pre_leng + r2, @@ -23,13 +23,13 @@ function pack_one(min_r, center, sinv, leng_cv, unit_cv, pre_leng, pre_r) = 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) + r3_ct1 = r2_ct + ptf_rotate(vta, a, v), + r3_ct2 = r2_ct + ptf_rotate(vta, -a, v) ) r2 > min_r ? concat( [[r2_ct, r2], if(r3 > min_r) each [[r3_ct1, r3], [r3_ct2, r3]]], - pack_one(min_r, center, sinv, leng_cv, unit_cv, r2 + leng, r2) + pack_one(min_r, center, v, sinv, leng_cv, unit_cv, r2 + leng, r2) ) : []; @@ -39,7 +39,9 @@ function tri_circle_packing(shape_pts, min_r) = s1 = shape_pts[1] - shape_pts[0], s2 = shape_pts[2] - shape_pts[1], s3 = shape_pts[0] - shape_pts[2], - R = abs(cross(s1, s2)) / (norm(s1) + norm(s2) + norm(s3)), + cross_value = cross(s1, s2), + nv = is_num(cross_value) ? [0, 0, cross_value] : cross_value, + R = abs(norm(nv)) / (norm(s1) + norm(s2) + norm(s3)), ca = center - shape_pts[0], leng_ca = norm(ca), @@ -58,8 +60,8 @@ function tri_circle_packing(shape_pts, min_r) = ) [ [center, R], - each pack_one(min_r, center, sina, leng_ca, unit_ca, R, R), - each pack_one(min_r, center, sinb, leng_cb, unit_cb, R, R), - each pack_one(min_r, center, sinc, leng_cc, unit_cc, R, R), + each pack_one(min_r, center, nv, sina, leng_ca, unit_ca, R, R), + each pack_one(min_r, center, nv, sinb, leng_cb, unit_cb, R, R), + each pack_one(min_r, center, nv, sinc, leng_cc, unit_cc, R, R), ]; \ No newline at end of file