mirror of
https://github.com/BelfrySCAD/BOSL2.git
synced 2025-01-01 09:49:45 +00:00
small cleanup/optimization
This commit is contained in:
parent
9a66bc6132
commit
d3510c02c9
2 changed files with 25 additions and 25 deletions
49
regions.scad
49
regions.scad
|
@ -983,11 +983,15 @@ function offset(
|
||||||
/// "S" - the subpath is on the region's border and the polygon and region are on the same side of the subpath
|
/// "S" - the subpath is on the region's border and the polygon and region are on the same side of the subpath
|
||||||
/// "U" - the subpath is on the region's border and the polygon and region meet at the subpath (from opposite sides)
|
/// "U" - the subpath is on the region's border and the polygon and region meet at the subpath (from opposite sides)
|
||||||
/// The return has the form of a list with entries [TAG, SUBPATH]
|
/// The return has the form of a list with entries [TAG, SUBPATH]
|
||||||
function _tag_subpaths(region1, region2, eps=EPSILON, SUtags=true) =
|
function _tag_subpaths(region1, region2, keep, eps=EPSILON) =
|
||||||
// We have to compute common vertices between paths in the region because
|
// We have to compute common vertices between paths in the region because
|
||||||
// they can be places where the path must be cut, even though they aren't
|
// they can be places where the path must be cut, even though they aren't
|
||||||
// found my the split_path function.
|
// found my the split_path function.
|
||||||
let(
|
let(
|
||||||
|
keepS = search("S",keep)!=[],
|
||||||
|
keepU = search("U",keep)!=[],
|
||||||
|
keepoutside = search("O",keep) !=[],
|
||||||
|
keepinside = search("I",keep) !=[],
|
||||||
points = flatten(region1),
|
points = flatten(region1),
|
||||||
tree = len(points)>0 ? vector_search_tree(points): undef
|
tree = len(points)>0 ? vector_search_tree(points): undef
|
||||||
)
|
)
|
||||||
|
@ -1000,31 +1004,26 @@ function _tag_subpaths(region1, region2, eps=EPSILON, SUtags=true) =
|
||||||
for (subpath = subpaths)
|
for (subpath = subpaths)
|
||||||
let(
|
let(
|
||||||
midpt = mean([subpath[0], subpath[1]]),
|
midpt = mean([subpath[0], subpath[1]]),
|
||||||
rel = point_in_region(midpt,region2,eps=eps)
|
rel = point_in_region(midpt,region2,eps=eps),
|
||||||
|
keepthis = rel<0 ? keepoutside
|
||||||
|
: rel>0 ? keepinside
|
||||||
|
: !(keepS || keepU) ? false
|
||||||
|
: let(
|
||||||
|
sidept = midpt + 0.01*line_normal(subpath[0],subpath[1]),
|
||||||
|
rel1 = point_in_region(sidept,region1,eps=eps)>0,
|
||||||
|
rel2 = point_in_region(sidept,region2,eps=eps)>0
|
||||||
|
)
|
||||||
|
rel1==rel2 ? keepS : keepU
|
||||||
)
|
)
|
||||||
if(rel<0) ["O", subpath]
|
if (keepthis) subpath
|
||||||
else if (rel>0) ["I", subpath]
|
|
||||||
else if (SUtags)
|
|
||||||
let(
|
|
||||||
sidept = midpt + 0.01*line_normal(subpath[0],subpath[1]),
|
|
||||||
rel1 = point_in_region(sidept,region1,eps=eps)>0,
|
|
||||||
rel2 = point_in_region(sidept,region2,eps=eps)>0
|
|
||||||
)
|
|
||||||
rel1==rel2? ["S", subpath] : ["U", subpath]
|
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
function _tagged_region(region1,region2,keep1,keep2,SUtags1=true, eps=EPSILON) =
|
|
||||||
let(
|
|
||||||
tagged1 = _tag_subpaths(region1, region2, eps=eps, SUtags=SUtags1),
|
|
||||||
tagged2 = _tag_subpaths(region2, region1, eps=eps, SUtags=false),
|
|
||||||
tagged = [
|
|
||||||
for (tagpath = tagged1) if (in_list(tagpath[0], keep1)) tagpath[1],
|
|
||||||
for (tagpath = tagged2) if (in_list(tagpath[0], keep2)) tagpath[1]
|
|
||||||
]
|
|
||||||
)
|
|
||||||
_assemble_path_fragments(tagged, eps=eps);
|
|
||||||
|
|
||||||
|
function _tagged_region(region1,region2,keep1,keep2,eps=EPSILON) =
|
||||||
|
_assemble_path_fragments(concat(_tag_subpaths(region1, region2, keep1, eps=eps),
|
||||||
|
_tag_subpaths(region2, region1, keep2, eps=eps)),
|
||||||
|
eps=eps);
|
||||||
|
|
||||||
|
|
||||||
// Function&Module: union()
|
// Function&Module: union()
|
||||||
|
@ -1050,7 +1049,7 @@ function union(regions=[],b=undef,c=undef,eps=EPSILON) =
|
||||||
len(regions)==1? regions[0] :
|
len(regions)==1? regions[0] :
|
||||||
let(regions=[for (r=regions) quant(is_path(r)? [r] : r, 1/65536)])
|
let(regions=[for (r=regions) quant(is_path(r)? [r] : r, 1/65536)])
|
||||||
union([
|
union([
|
||||||
_tagged_region(regions[0],regions[1],["O","S"],["O"], eps=eps),
|
_tagged_region(regions[0],regions[1],"OS", "O", eps=eps),
|
||||||
for (i=[2:1:len(regions)-1]) regions[i]
|
for (i=[2:1:len(regions)-1]) regions[i]
|
||||||
],
|
],
|
||||||
eps=eps
|
eps=eps
|
||||||
|
@ -1082,7 +1081,7 @@ function difference(regions=[],b=undef,c=undef,eps=EPSILON) =
|
||||||
regions[0]==[] ? [] :
|
regions[0]==[] ? [] :
|
||||||
let(regions=[for (r=regions) quant(is_path(r)? [r] : r, 1/65536)])
|
let(regions=[for (r=regions) quant(is_path(r)? [r] : r, 1/65536)])
|
||||||
difference([
|
difference([
|
||||||
_tagged_region(regions[0],regions[1],["O","U"],["I"], eps=eps),
|
_tagged_region(regions[0],regions[1],"OU", "I", eps=eps),
|
||||||
for (i=[2:1:len(regions)-1]) regions[i]
|
for (i=[2:1:len(regions)-1]) regions[i]
|
||||||
],
|
],
|
||||||
eps=eps
|
eps=eps
|
||||||
|
@ -1113,7 +1112,7 @@ function intersection(regions=[],b=undef,c=undef,eps=EPSILON) =
|
||||||
: regions[0]==[] || regions[1]==[] ? []
|
: regions[0]==[] || regions[1]==[] ? []
|
||||||
: let(regions=[for (r=regions) quant(is_path(r)? [r] : r, 1/65536)])
|
: let(regions=[for (r=regions) quant(is_path(r)? [r] : r, 1/65536)])
|
||||||
intersection([
|
intersection([
|
||||||
_tagged_region(regions[0],regions[1],["I","S"],["I"],eps=eps),
|
_tagged_region(regions[0],regions[1],"IS","I",eps=eps),
|
||||||
for (i=[2:1:len(regions)-1]) regions[i]
|
for (i=[2:1:len(regions)-1]) regions[i]
|
||||||
],
|
],
|
||||||
eps=eps
|
eps=eps
|
||||||
|
@ -1151,7 +1150,7 @@ function exclusive_or(regions=[],b=undef,c=undef,eps=EPSILON) =
|
||||||
len(regions)==1? regions[0] :
|
len(regions)==1? regions[0] :
|
||||||
let(regions=[for (r=regions) is_path(r)? [r] : r])
|
let(regions=[for (r=regions) is_path(r)? [r] : r])
|
||||||
exclusive_or([
|
exclusive_or([
|
||||||
_tagged_region(regions[0],regions[1],["I","O"],["I","O"],eps=eps,SUtags1=false),
|
_tagged_region(regions[0],regions[1],"IO","IO",eps=eps),
|
||||||
for (i=[2:1:len(regions)-1]) regions[i]
|
for (i=[2:1:len(regions)-1]) regions[i]
|
||||||
],
|
],
|
||||||
eps=eps
|
eps=eps
|
||||||
|
|
|
@ -17,6 +17,7 @@ module test_union() {
|
||||||
R1 = [square(10,center=true), square(9,center=true)];
|
R1 = [square(10,center=true), square(9,center=true)];
|
||||||
R2 = [square(9,center=true)];
|
R2 = [square(9,center=true)];
|
||||||
assert(are_regions_equal(union(R1,R2), [square(10,center=true)]));
|
assert(are_regions_equal(union(R1,R2), [square(10,center=true)]));
|
||||||
|
assert(are_regions_equal(union(R2,R1), [square(10,center=true)]));
|
||||||
}
|
}
|
||||||
test_union();
|
test_union();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue