mirror of
https://github.com/BelfrySCAD/BOSL2.git
synced 2025-01-30 08:19:36 +00:00
Correction in is_convex_polygon
This commit is contained in:
parent
dab6407b0f
commit
41616872fe
2 changed files with 7 additions and 5 deletions
|
@ -1304,7 +1304,7 @@ function _pointlist_greatest_distance(points,plane) =
|
||||||
normal = point3d(plane),
|
normal = point3d(plane),
|
||||||
pt_nrm = points*normal
|
pt_nrm = points*normal
|
||||||
)
|
)
|
||||||
abs(max( max(pt_nrm) - plane[3], -min(pt_nrm)+plane[3])) / norm(normal);
|
abs(max( max(pt_nrm) - plane[3], -min(pt_nrm) + plane[3])) / norm(normal);
|
||||||
|
|
||||||
|
|
||||||
// Function: points_on_plane()
|
// Function: points_on_plane()
|
||||||
|
@ -1786,7 +1786,7 @@ function polygon_area(poly, signed=false) =
|
||||||
: let( plane = plane_from_polygon(poly) )
|
: let( plane = plane_from_polygon(poly) )
|
||||||
plane==[]? [] :
|
plane==[]? [] :
|
||||||
let(
|
let(
|
||||||
n = plane_normal(plane),
|
n = plane_normal(plane),
|
||||||
total = sum([
|
total = sum([
|
||||||
for(i=[1:1:len(poly)-2])
|
for(i=[1:1:len(poly)-2])
|
||||||
let(
|
let(
|
||||||
|
@ -1808,25 +1808,26 @@ function polygon_area(poly, signed=false) =
|
||||||
// If the points are collinear an error is generated.
|
// If the points are collinear an error is generated.
|
||||||
// Arguments:
|
// Arguments:
|
||||||
// poly = Polygon to check.
|
// poly = Polygon to check.
|
||||||
|
// eps = Tolerance for the collinearity test. Default: EPSILON.
|
||||||
// Example:
|
// Example:
|
||||||
// is_convex_polygon(circle(d=50)); // Returns: true
|
// is_convex_polygon(circle(d=50)); // Returns: true
|
||||||
// is_convex_polygon(rot([50,120,30], p=path3d(circle(1,$fn=50)))); // Returns: true
|
// is_convex_polygon(rot([50,120,30], p=path3d(circle(1,$fn=50)))); // Returns: true
|
||||||
// Example:
|
// Example:
|
||||||
// spiral = [for (i=[0:36]) let(a=-i*10) (10+i)*[cos(a),sin(a)]];
|
// spiral = [for (i=[0:36]) let(a=-i*10) (10+i)*[cos(a),sin(a)]];
|
||||||
// is_convex_polygon(spiral); // Returns: false
|
// is_convex_polygon(spiral); // Returns: false
|
||||||
function is_convex_polygon(poly) =
|
function is_convex_polygon(poly,eps=EPSILON) =
|
||||||
assert(is_path(poly), "The input should be a 2D or 3D polygon." )
|
assert(is_path(poly), "The input should be a 2D or 3D polygon." )
|
||||||
let( lp = len(poly),
|
let( lp = len(poly),
|
||||||
p0 = poly[0] )
|
p0 = poly[0] )
|
||||||
assert( lp>=3 , "A polygon must have at least 3 points" )
|
assert( lp>=3 , "A polygon must have at least 3 points" )
|
||||||
let( crosses = [for(i=[0:1:lp-1]) cross(poly[(i+1)%lp]-poly[i], poly[(i+2)%lp]-poly[(i+1)%lp]) ] )
|
let( crosses = [for(i=[0:1:lp-1]) cross(poly[(i+1)%lp]-poly[i], poly[(i+2)%lp]-poly[(i+1)%lp]) ] )
|
||||||
len(p0)==2
|
len(p0)==2
|
||||||
? assert( !approx(max(crosses)) && !approx(min(crosses)), "The points are collinear" )
|
? assert( !approx(sqrt(max(max(crosses),-min(crosses))),eps), "The points are collinear" )
|
||||||
min(crosses) >=0 || max(crosses)<=0
|
min(crosses) >=0 || max(crosses)<=0
|
||||||
: let( prod = crosses*sum(crosses),
|
: let( prod = crosses*sum(crosses),
|
||||||
minc = min(prod),
|
minc = min(prod),
|
||||||
maxc = max(prod) )
|
maxc = max(prod) )
|
||||||
assert( !approx(maxc-minc), "The points are collinear" )
|
assert( !approx(sqrt(max(maxc,-minc)),eps), "The points are collinear" )
|
||||||
minc>=0 || maxc<=0;
|
minc>=0 || maxc<=0;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -847,6 +847,7 @@ module test_is_convex_polygon() {
|
||||||
assert(is_convex_polygon(circle(r=50,$fn=1000)));
|
assert(is_convex_polygon(circle(r=50,$fn=1000)));
|
||||||
assert(is_convex_polygon(rot([50,120,30], p=path3d(circle(1,$fn=50)))));
|
assert(is_convex_polygon(rot([50,120,30], p=path3d(circle(1,$fn=50)))));
|
||||||
assert(!is_convex_polygon([[1,1],[0,0],[-1,1],[-1,-1],[1,-1]]));
|
assert(!is_convex_polygon([[1,1],[0,0],[-1,1],[-1,-1],[1,-1]]));
|
||||||
|
assert(!is_convex_polygon([for (i=[0:36]) let(a=-i*10) (10+i)*[cos(a),sin(a)]])); // spiral
|
||||||
}
|
}
|
||||||
*test_is_convex_polygon();
|
*test_is_convex_polygon();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue