diff --git a/regions.scad b/regions.scad index 4255731..380ef11 100644 --- a/regions.scad +++ b/regions.scad @@ -715,9 +715,7 @@ function _point_dist(path,pathseg_unit,pathseg_len,pt) = function _offset_region(region, r, delta, chamfer, check_valid, quality,closed,return_faces,firstface_index,flip_faces) = let( -//dg= echo(region=region), reglist = [for(R=region_parts(region)) is_path(R) ? [R] : R], -//fdsa= echo(reglist), ofsregs = [for(R=reglist) [for(i=idx(R)) offset(R[i], r=u_mul(i>0?-1:1,r), delta=u_mul(i>0?-1:1,delta), chamfer=chamfer, check_valid=check_valid, quality=quality,closed=true)]] @@ -993,8 +991,9 @@ function _tag_subpaths(region1, region2, eps=EPSILON, SUtags=true) = points = flatten(region1), tree = len(points)>0 ? vector_search_tree(points): undef ) - [for(path=region1) + [for(p=region1) let( + path = deduplicate(p), self_int = is_undef(tree)?[]:[for(i=idx(path)) if (len(vector_search(path[i], eps, tree))>1) [i,0]], subpaths = split_path_at_region_crossings(path, region2, eps=eps, extra=self_int) ) @@ -1108,7 +1107,6 @@ function difference(regions=[],b=undef,c=undef,eps=EPSILON) = // for (shape = [shape1,shape2]) color("red") stroke(shape, width=0.5, closed=true); // color("green") region(intersection(shape1,shape2)); function intersection(regions=[],b=undef,c=undef,eps=EPSILON) = -// echo(regions=regions) b!=undef? intersection(concat([regions],[b],c==undef?[]:[c]),eps=eps) : len(regions)==0 ? [] : len(regions)==1? regions[0] diff --git a/tests/test_regions.scad b/tests/test_regions.scad index 61e2eeb..731cf3b 100644 --- a/tests/test_regions.scad +++ b/tests/test_regions.scad @@ -35,6 +35,21 @@ module test_difference() { R4 = [square(9,center=true), square(3,center=true)]; assert(are_regions_equal(difference(R5,R4), [square(10,center=true), square(9, center=true), square(3,center=true)])); + + pathA = [ + [-9,12], [-6,2], [-3,12], [0,2], [3,10], [5,10], [19,-4], [-8,-4], [-12,0] + ]; + + pathB = [ + [-12,8], [7,8], [9,6], [7,5], [-3,5], [-5,-6], [-2,-6], [0,-4], + [6,-4], [2,-8], [-7,-8], [-15,0] + ]; + + + right=[[[-10, 8], [-9, 12], [-7.8, 8]], [[0, -4], [-4.63636363636, -4], [-3, 5], [-0.9, 5], [0, 2], [1.125, 5], [7, 5], [9, 6], [19, -4], [6, -4]], [[-4.2, 8], [-1.8, 8], [-3, 12]], [[2.25, 8], [3, 10], [5, 10], [7, 8]]]; + assert(are_regions_equal(difference(pathA,pathB),right)); + + } test_difference();