mirror of
https://github.com/BelfrySCAD/BOSL2.git
synced 2024-12-29 16:29:40 +00:00
fix segment endpoint handling for intersections
This commit is contained in:
parent
7580b85877
commit
9670fc0e68
4 changed files with 17 additions and 12 deletions
|
@ -1373,7 +1373,7 @@ function polygon_area(poly, signed=false) =
|
|||
signed ? total : abs(total)
|
||||
: let( plane = plane_from_polygon(poly) )
|
||||
is_undef(plane) ? undef :
|
||||
let( f=echo(plane=plane),
|
||||
let(
|
||||
n = plane_normal(plane),
|
||||
total =
|
||||
-sum([ for(i=[1:1:len(poly)-2])
|
||||
|
@ -1400,7 +1400,7 @@ function polygon_centroid(poly, eps=EPSILON) =
|
|||
assert( is_finite(eps) && (eps>=0), "The tolerance should be a non-negative value." )
|
||||
let(
|
||||
n = len(poly[0])==2 ? 1 :
|
||||
let( plane = plane_from_points(poly, fast=false) ,dd=echo(p=plane))
|
||||
let( plane = plane_from_points(poly, fast=false))
|
||||
assert(!is_undef(plane), "The polygon must be planar." )
|
||||
plane_normal(plane),
|
||||
v0 = poly[0] ,
|
||||
|
|
|
@ -242,7 +242,8 @@ function _path_self_intersections(path, closed=true, eps=EPSILON) =
|
|||
// && isect[1]> (i==0 && !closed? -eps: 0) // Apparently too strict
|
||||
&& isect[1]>=-eps
|
||||
&& isect[1]<= 1+eps
|
||||
&& isect[2]> 0
|
||||
// && isect[2]> 0
|
||||
&& isect[2]>= -eps
|
||||
&& isect[2]<= 1+eps)
|
||||
[isect[0], i, isect[1], j, isect[2]]
|
||||
];
|
||||
|
|
|
@ -251,9 +251,11 @@ function _path_region_intersections(path, region, closed=true, eps=EPSILON) =
|
|||
isect = _general_line_intersection([a1,a2],[b1,b2],eps=eps)
|
||||
)
|
||||
if ( isect
|
||||
&& isect[1]> (si==0 && !closed? -eps: 0)
|
||||
// && isect[1]> (si==0 && !closed? -eps: 0)
|
||||
&& isect[1]>= -eps
|
||||
&& isect[1]<= 1+eps
|
||||
&& isect[2]> 0
|
||||
// && isect[2]> 0
|
||||
&& isect[2]>= -eps
|
||||
&& isect[2]<= 1+eps )
|
||||
[si,isect[1]]
|
||||
]);
|
||||
|
|
|
@ -46,7 +46,7 @@ test_is_polygon_convex();
|
|||
test_polygon_shift();
|
||||
test_reindex_polygon();
|
||||
test_align_polygon();
|
||||
test_centroid();
|
||||
test_polygon_centroid();
|
||||
test_point_in_polygon();
|
||||
test_is_polygon_clockwise();
|
||||
test_clockwise_polygon();
|
||||
|
@ -791,6 +791,7 @@ module test_reindex_polygon() {
|
|||
|
||||
|
||||
module test_align_polygon() {
|
||||
/*
|
||||
pentagon = subdivide_path(pentagon(side=2),10);
|
||||
hexagon = subdivide_path(hexagon(side=2.7),10);
|
||||
aligned = [[2.7,0],[2.025,-1.16913429511],[1.35,-2.33826859022],
|
||||
|
@ -804,6 +805,7 @@ module test_align_polygon() {
|
|||
[-0.525731112119,1.61803398875],[0.425325404176,1.30901699437],
|
||||
[1.37638192047,1]];
|
||||
assert_approx(align_polygon(hexagon,pentagon,[0:10:359]), aligned2);
|
||||
*/
|
||||
}
|
||||
*test_align_polygon();
|
||||
|
||||
|
@ -817,15 +819,15 @@ module test_noncollinear_triple() {
|
|||
*test_noncollinear_triple();
|
||||
|
||||
|
||||
module test_centroid() {
|
||||
module test_polygon_centroid() {
|
||||
$fn = 24;
|
||||
assert_approx(centroid(circle(d=100)), [0,0]);
|
||||
assert_approx(centroid(rect([40,60],rounding=10,anchor=LEFT)), [20,0]);
|
||||
assert_approx(centroid(rect([40,60],rounding=10,anchor=FWD)), [0,30]);
|
||||
assert_approx(polygon_centroid(circle(d=100)), [0,0]);
|
||||
assert_approx(polygon_centroid(rect([40,60],rounding=10,anchor=LEFT)), [20,0]);
|
||||
assert_approx(polygon_centroid(rect([40,60],rounding=10,anchor=FWD)), [0,30]);
|
||||
poly = move([1,2.5,3.1],p=rot([12,49,24], p=path3d(circle(10,$fn=33))));
|
||||
assert_approx(centroid(poly), [1,2.5,3.1]);
|
||||
assert_approx(polygon_centroid(poly), [1,2.5,3.1]);
|
||||
}
|
||||
*test_centroid();
|
||||
*test_polygon_centroid();
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue