From 90ae086b5da64211c6d247bbc49bcf77965989c0 Mon Sep 17 00:00:00 2001 From: Chris Bitsakis Date: Tue, 19 Apr 2022 19:39:56 -0400 Subject: [PATCH] 1.1.1 fix regression in paperClipperSimplify --- package.json | 2 +- src/paperClipperSimplify.ts | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9158169..2f5cdcf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "paper-clipper", - "version": "1.1.0", + "version": "1.1.1", "description": "Use Clipper's boolean and offsetting operations in paper.js", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/paperClipperSimplify.ts b/src/paperClipperSimplify.ts index 1ebfcd9..978eed8 100644 --- a/src/paperClipperSimplify.ts +++ b/src/paperClipperSimplify.ts @@ -111,8 +111,29 @@ const recursiveSimplify = (tolerance: number) => (targetPathPart: paper.Path) => return hasMoreSegments ? targetPathPart : pathPart } +const removeDuplicateAdjacentSegments = (path: paper.Path): paper.Path => { + const { segments } = path + const segmentsBefore = segments.length + + segments.forEach(segment => { + const { next } = segment + + if (!next) return + + const duplicateSegment = segment.point.isClose(next.point, geomEpsilon) + + if (duplicateSegment) { + next.handleIn = segment.handleIn.clone() + + segment.remove() + } + }) + + return segmentsBefore > segments.length ? removeDuplicateAdjacentSegments(path) : path +} + const paperClipperSimplify = (tolerance: number = paperClipperSimplifyTolerance) => (targetPath: paper.Path): paper.Path => { - const path = targetPath + const path = removeDuplicateAdjacentSegments(targetPath) const { closed } = path if (path.length === 0) return targetPath @@ -127,6 +148,7 @@ const paperClipperSimplify = (tolerance: number = paperClipperSimplifyTolerance) ) const pathParts = splitAtOffsets(path)(angledSegmentOffsets) + .map(removeDuplicateAdjacentSegments) .map(recursiveSimplify(tolerance)) const joinedPath = joinPaths(pathParts)