diff --git a/beziers.scad b/beziers.scad index f9f31f0..4217f39 100644 --- a/beziers.scad +++ b/beziers.scad @@ -161,17 +161,26 @@ function bezier_segment_closest_point(curve, pt, max_err=0.01, u=0, end_u=1) = // echo(bezier_segment_length(bez)); function bezier_segment_length(curve, start_u=0, end_u=1, max_deflect=0.01) = let( - mid_u=lerp(start_u, end_u, 0.5), - sp = bez_point(curve,start_u), - bez_mp = bez_point(curve,mid_u), - ep = bez_point(curve,end_u), - lin_mp = lerp(sp,ep,0.5), - defl = norm(bez_mp-lin_mp) + segs = len(curve) * 2, + path = [ + for (i=[0:1:segs]) + let(u=lerp(start_u, end_u, i/segs)) + bez_point(curve,u) + ], + defl = max([ + for (i=idx(path,end=-3)) let( + mp = (path[i] + path[i+2]) / 2 + ) norm(path[i+1] - mp) + ]), + mid_u = lerp(start_u, end_u, 0.5) ) - ((end_u-start_u) >= 0.125 || defl > max_deflect)? ( - bezier_segment_length(curve, start_u, mid_u, max_deflect) + - bezier_segment_length(curve, mid_u, end_u, max_deflect) - ) : norm(ep-sp); + defl <= max_deflect? path_length(path) : + sum([ + for (i=[0:1:segs-1]) let( + su = lerp(start_u, end_u, i/segs), + eu = lerp(start_u, end_u, (i+1)/segs) + ) bezier_segment_length(curve, su, eu, max_deflect) + ]); diff --git a/version.scad b/version.scad index d877a4d..da39fbd 100644 --- a/version.scad +++ b/version.scad @@ -8,7 +8,7 @@ ////////////////////////////////////////////////////////////////////// -BOSL_VERSION = [2,0,163]; +BOSL_VERSION = [2,0,164]; // Section: BOSL Library Version Functions