mirror of
https://github.com/BelfrySCAD/BOSL2.git
synced 2024-12-29 16:29:40 +00:00
change is_closed_path to are_ends_equal
sphere bugfix
This commit is contained in:
parent
0568e2ef46
commit
8bd08bd4c1
6 changed files with 38 additions and 28 deletions
|
@ -194,6 +194,19 @@ function all_equal(vec,eps=0) =
|
|||
|
||||
|
||||
|
||||
// Function: are_ends_equal()
|
||||
// Usage:
|
||||
// are_ends_equal(list, [eps]);
|
||||
// Description:
|
||||
// Returns true if the first and last points in the given list are equal to within epsilon.
|
||||
// Arguments:
|
||||
// list = list to check
|
||||
// eps = Tolerance for approximate equality. Default: `EPSILON` (1e-9)
|
||||
function are_ends_equal(list, eps=EPSILON) =
|
||||
assert(is_list(list) && len(list)>0, "Must give a nonempty list")
|
||||
approx(list[0], list[len(list)-1], eps=eps);
|
||||
|
||||
|
||||
// Function: is_increasing()
|
||||
// Usage:
|
||||
// bool = is_increasing(list, [strict]);
|
||||
|
|
16
paths.scad
16
paths.scad
|
@ -87,21 +87,13 @@ function force_path(path, name="path") =
|
|||
: path;
|
||||
|
||||
|
||||
// Function: is_closed_path()
|
||||
// Usage:
|
||||
// is_closed_path(path, [eps]);
|
||||
// Description:
|
||||
// Returns true if the first and last points in the given path are coincident.
|
||||
function is_closed_path(path, eps=EPSILON) = approx(path[0], path[len(path)-1], eps=eps);
|
||||
|
||||
|
||||
// Function: close_path()
|
||||
// Usage:
|
||||
// close_path(path);
|
||||
// Description:
|
||||
// If a path's last point does not coincide with its first point, closes the path so it does.
|
||||
function close_path(path, eps=EPSILON) =
|
||||
is_closed_path(path,eps=eps)? path : concat(path,[path[0]]);
|
||||
are_ends_equal(path,eps=eps)? path : concat(path,[path[0]]);
|
||||
|
||||
|
||||
// Function: cleanup_path()
|
||||
|
@ -110,7 +102,7 @@ function close_path(path, eps=EPSILON) =
|
|||
// Description:
|
||||
// If a path's last point coincides with its first point, deletes the last point in the path.
|
||||
function cleanup_path(path, eps=EPSILON) =
|
||||
is_closed_path(path,eps=eps)? [for (i=[0:1:len(path)-2]) path[i]] : path;
|
||||
are_ends_equal(path,eps=eps)? [for (i=[0:1:len(path)-2]) path[i]] : path;
|
||||
|
||||
|
||||
/// Internal Function: _path_select()
|
||||
|
@ -1096,7 +1088,7 @@ function _assemble_a_path_from_fragments(fragments, rightmost=true, startfrag=0,
|
|||
let(
|
||||
path = fragments[startfrag],
|
||||
newfrags = [for (i=idx(fragments)) if (i!=startfrag) fragments[i]]
|
||||
) is_closed_path(path, eps=eps)? (
|
||||
) are_ends_equal(path, eps=eps)? (
|
||||
// starting fragment is already closed
|
||||
[path, newfrags]
|
||||
) : let(
|
||||
|
@ -1109,7 +1101,7 @@ function _assemble_a_path_from_fragments(fragments, rightmost=true, startfrag=0,
|
|||
// No remaining fragments connect! INCOMPLETE PATH!
|
||||
// Treat it as complete.
|
||||
[path, remainder]
|
||||
) : is_closed_path(foundfrag, eps=eps)? (
|
||||
) : are_ends_equal(foundfrag, eps=eps)? (
|
||||
// Found fragment is already closed
|
||||
[foundfrag, concat([path], remainder)]
|
||||
) : let(
|
||||
|
|
|
@ -2020,7 +2020,7 @@ module sphere(r, d, anchor=CENTER, spin=0, orient=UP) {
|
|||
}
|
||||
|
||||
function sphere(r, d, anchor=CENTER, spin=0, orient=UP) =
|
||||
spheroid(r=r, d=d, anchor=anchor, spin=spin, orient=orient);
|
||||
spheroid(r=r, d=d, style="orig", anchor=anchor, spin=spin, orient=orient);
|
||||
|
||||
|
||||
// Function&Module: spheroid()
|
||||
|
|
|
@ -121,6 +121,18 @@ module test_is_decreasing() {
|
|||
test_is_decreasing();
|
||||
|
||||
|
||||
|
||||
module test_are_ends_equal() {
|
||||
assert(!are_ends_equal([[1,2,3],[4,5,6],[1,8,9]]));
|
||||
assert(are_ends_equal([[1,2,3],[4,5,6],[1,8,9],[1,2,3]]));
|
||||
assert(are_ends_equal([1,2,3,1.00004],eps=1e-2));
|
||||
assert(are_ends_equal([3]));
|
||||
}
|
||||
test_are_ends_equal();
|
||||
|
||||
|
||||
|
||||
|
||||
module test_find_approx() {
|
||||
assert(find_approx(1, [2,3,1.05,4,1,2,.99], eps=.1)==2);
|
||||
assert(find_approx(1, [2,3,1.05,4,1,2,.99], all=true, eps=.1)==[2,4,6]);
|
||||
|
|
|
@ -33,13 +33,6 @@ test_is_1region();
|
|||
|
||||
|
||||
|
||||
module test_is_closed_path() {
|
||||
assert(!is_closed_path([[1,2,3],[4,5,6],[1,8,9]]));
|
||||
assert(is_closed_path([[1,2,3],[4,5,6],[1,8,9],[1,2,3]]));
|
||||
}
|
||||
test_is_closed_path();
|
||||
|
||||
|
||||
module test_close_path() {
|
||||
assert(close_path([[1,2,3],[4,5,6],[1,8,9]]) == [[1,2,3],[4,5,6],[1,8,9],[1,2,3]]);
|
||||
assert(close_path([[1,2,3],[4,5,6],[1,8,9],[1,2,3]]) == [[1,2,3],[4,5,6],[1,8,9],[1,2,3]]);
|
||||
|
|
|
@ -94,28 +94,28 @@ module test_cyl() {
|
|||
$fn=12;
|
||||
shape_compare() {
|
||||
cyl(r=50,l=10,circum=true,anchor=BOTTOM);
|
||||
cylinder(r=50/cos(180/12),l=10);
|
||||
cylinder(r=50/cos(180/12),h=10);
|
||||
}
|
||||
shape_compare() {
|
||||
cyl(r=50,l=10,circum=false,anchor=BOTTOM);
|
||||
cylinder(r=50,l=10);
|
||||
cylinder(r=50,h=10);
|
||||
}
|
||||
shape_compare() {
|
||||
cyl(r=50,l=10,chamfer=1,circum=true,anchor=BOTTOM);
|
||||
union() {
|
||||
r=50/cos(180/12);
|
||||
cylinder(r1=r-1,r2=r,l=1);
|
||||
up(1) cylinder(r=r,l=8);
|
||||
up(9) cylinder(r1=r,r2=r-1,l=1);
|
||||
cylinder(r1=r-1,r2=r,h=1);
|
||||
up(1) cylinder(r=r,h=8);
|
||||
up(9) cylinder(r1=r,r2=r-1,h=1);
|
||||
}
|
||||
}
|
||||
shape_compare() {
|
||||
cyl(r=50,l=10,chamfer=1,circum=false,anchor=BOTTOM);
|
||||
union() {
|
||||
r=50;
|
||||
cylinder(r1=r-1,r2=r,l=1);
|
||||
up(1) cylinder(r=r,l=8);
|
||||
up(9) cylinder(r1=r,r2=r-1,l=1);
|
||||
cylinder(r1=r-1,r2=r,h=1);
|
||||
up(1) cylinder(r=r,h=8);
|
||||
up(9) cylinder(r1=r,r2=r-1,h=1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue