From 3f893c9fb719846f3e92241b0865987f99bb820c Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 20 Jul 2016 10:47:01 +0200 Subject: [PATCH] Change winding calculation for points on path Add a winding if the point is on the path and windings canceled each other. See discussion at #1109 --- src/path/PathItem.Boolean.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/path/PathItem.Boolean.js b/src/path/PathItem.Boolean.js index 0fd073fe..4d956dca 100644 --- a/src/path/PathItem.Boolean.js +++ b/src/path/PathItem.Boolean.js @@ -492,11 +492,15 @@ PathItem.inject(new function() { vClose = null; } if (!pathWindingL && !pathWindingR && isOnPath) { - // Use the on-path windings if no other intersections - // were found or if they canceled each other. - var add = path.isClockwise() ? 1 : -1; - // windingL += add; - // windingR -= add; + // If the point is on the path and the windings canceled + // each other, we treat the point as if it was inside the + // path. A point inside a path has a winding of [+1,-1] + // for clockwise and [-1,+1] for counter-clockwise paths. + // If the ray is cast in y direction (dir == 1), the + // windings always have opposite sign. + var add = path.isClockwise() ^ dir ? 1 : -1; + windingL += add; + windingR -= add; onPathWinding += add; } else { windingL += pathWindingL;