mirror of
https://github.com/BelfrySCAD/BOSL2.git
synced 2025-03-09 02:39:47 +00:00
hull 2d tweak
This commit is contained in:
parent
f736ef98f7
commit
6a1b141d5c
2 changed files with 13 additions and 13 deletions
18
hull.scad
18
hull.scad
|
@ -80,7 +80,7 @@ function _backtracking(i,points,h,t,m) =
|
||||||
_backtracking(i,points,h,t,m-1) ;
|
_backtracking(i,points,h,t,m-1) ;
|
||||||
|
|
||||||
// clockwise check (2d)
|
// clockwise check (2d)
|
||||||
function _is_cw(a,b,c) = cross(a-c,b-c)<=0;
|
function _is_cw(a,b,c) = cross(a-c,b-c)<-EPSILON*norm(a-c)*norm(b-c);
|
||||||
|
|
||||||
|
|
||||||
// Function: hull2d_path()
|
// Function: hull2d_path()
|
||||||
|
@ -100,13 +100,7 @@ function _is_cw(a,b,c) = cross(a-c,b-c)<=0;
|
||||||
//
|
//
|
||||||
function hull2d_path(points) =
|
function hull2d_path(points) =
|
||||||
assert(is_path(points,2),"Invalid input to hull2d_path")
|
assert(is_path(points,2),"Invalid input to hull2d_path")
|
||||||
len(points) < 2 ? []
|
len(points) < 2 ? [] :
|
||||||
: len(points) == 2 ? [0,1]
|
|
||||||
: let(tri=noncollinear_triple(points, error=false))
|
|
||||||
tri == [] ? _hull_collinear(points)
|
|
||||||
:
|
|
||||||
assert(is_path(points,2))
|
|
||||||
assert(len(points)>=3, "Point list must contain at least 3 points.")
|
|
||||||
let( n = len(points),
|
let( n = len(points),
|
||||||
ip = sortidx(points) )
|
ip = sortidx(points) )
|
||||||
// lower hull points
|
// lower hull points
|
||||||
|
@ -134,13 +128,19 @@ function hull2d_path(points) =
|
||||||
function _hull_collinear(points) =
|
function _hull_collinear(points) =
|
||||||
let(
|
let(
|
||||||
a = points[0],
|
a = points[0],
|
||||||
n = points[1] - a,
|
i = max_index([for(pt=points) norm(pt-a)]),
|
||||||
|
n = points[i] - a
|
||||||
|
)
|
||||||
|
norm(n)==0 ? [0]
|
||||||
|
:
|
||||||
|
let(
|
||||||
points1d = [ for(p = points) (p-a)*n ],
|
points1d = [ for(p = points) (p-a)*n ],
|
||||||
min_i = min_index(points1d),
|
min_i = min_index(points1d),
|
||||||
max_i = max_index(points1d)
|
max_i = max_index(points1d)
|
||||||
) [min_i, max_i];
|
) [min_i, max_i];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Function: hull3d_faces()
|
// Function: hull3d_faces()
|
||||||
// Usage:
|
// Usage:
|
||||||
// hull3d_faces(points)
|
// hull3d_faces(points)
|
||||||
|
|
|
@ -6,9 +6,9 @@ module test_hull() {
|
||||||
assert_equal(hull([[3,4,1],[5,5,3]]), [0,1]);
|
assert_equal(hull([[3,4,1],[5,5,3]]), [0,1]);
|
||||||
|
|
||||||
test_collinear_2d = let(u = unit([5,3])) [ for(i = [9,2,3,4,5,7,12,15,13]) i * u ];
|
test_collinear_2d = let(u = unit([5,3])) [ for(i = [9,2,3,4,5,7,12,15,13]) i * u ];
|
||||||
assert_equal(hull(test_collinear_2d), [7,1]);
|
assert_equal(sort(hull(test_collinear_2d)), [1,7]);
|
||||||
test_collinear_3d = let(u = unit([5,3,2])) [ for(i = [9,2,3,4,5,7,12,15,13]) i * u ];
|
test_collinear_3d = let(u = unit([5,3,2])) [ for(i = [9,2,3,4,5,7,12,15,13]) i * u ];
|
||||||
assert_equal(hull(test_collinear_3d), [7,1]);
|
assert_equal(sort(hull(test_collinear_3d)), [1,7]);
|
||||||
|
|
||||||
/* // produces some extra points along edges
|
/* // produces some extra points along edges
|
||||||
test_square_2d = [for(x=[1:5], y=[2:6]) [x,y]];
|
test_square_2d = [for(x=[1:5], y=[2:6]) [x,y]];
|
||||||
|
@ -105,9 +105,9 @@ module test_hull2d_path() {
|
||||||
assert_equal(hull([[3,4,1],[5,5,3]]), [0,1]);
|
assert_equal(hull([[3,4,1],[5,5,3]]), [0,1]);
|
||||||
|
|
||||||
test_collinear_2d = let(u = unit([5,3])) [ for(i = [9,2,3,4,5,7,12,15,13]) i * u ];
|
test_collinear_2d = let(u = unit([5,3])) [ for(i = [9,2,3,4,5,7,12,15,13]) i * u ];
|
||||||
assert_equal(hull(test_collinear_2d), [7,1]);
|
assert_equal(sort(hull(test_collinear_2d)), [1,7]);
|
||||||
test_collinear_3d = let(u = unit([5,3,2])) [ for(i = [9,2,3,4,5,7,12,15,13]) i * u ];
|
test_collinear_3d = let(u = unit([5,3,2])) [ for(i = [9,2,3,4,5,7,12,15,13]) i * u ];
|
||||||
assert_equal(hull(test_collinear_3d), [7,1]);
|
assert_equal(sort(hull(test_collinear_3d)), [1,7]);
|
||||||
|
|
||||||
rand10_2d = [[1.55356, -1.98965], [4.23157, -0.947788], [-4.06193, -1.55463],
|
rand10_2d = [[1.55356, -1.98965], [4.23157, -0.947788], [-4.06193, -1.55463],
|
||||||
[1.23889, -3.73133], [-1.02637, -4.0155], [4.26806, -4.61909],
|
[1.23889, -3.73133], [-1.02637, -4.0155], [4.26806, -4.61909],
|
||||||
|
|
Loading…
Reference in a new issue