From 78f03c2a1270d42d9fe1d986ad59513bf00b06b2 Mon Sep 17 00:00:00 2001 From: Skyler Lehmkuhl Date: Wed, 20 Nov 2024 10:33:17 -0500 Subject: [PATCH] Handle curve selections properly for overlapping shapes --- src/main.js | 101 +++++++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 49 deletions(-) diff --git a/src/main.js b/src/main.js index e3ad3e6..01a73ff 100644 --- a/src/main.js +++ b/src/main.js @@ -303,26 +303,28 @@ function setProperty(context, path, value) { function selectCurve(context, mouse) { let mouseTolerance = 15; + let closestDist = mouseTolerance; + let closestCurve = undefined + let closestShape = undefined for (let shape of context.activeObject.currentFrame.shapes) { if (mouse.x > shape.boundingBox.x.min - mouseTolerance && mouse.x < shape.boundingBox.x.max + mouseTolerance && mouse.y > shape.boundingBox.y.min - mouseTolerance && mouse.y < shape.boundingBox.y.max + mouseTolerance) { - let closestDist = mouseTolerance; - let closest = undefined for (let curve of shape.curves) { let dist = vectorDist(mouse, curve.project(mouse)) if (dist <= closestDist ) { closestDist = dist - closest = curve + closestCurve = curve + closestShape = shape } } - if (closest) { - return {curve:closest, shape:shape} - } else { - return undefined } } + if (closestCurve) { + return {curve:closestCurve, shape:closestShape} + } else { + return undefined } } @@ -645,50 +647,50 @@ class Shape { } } let epsilon = 0.01 - let newCurves = [] - let intersectMap = {} - for (let i=0; i=0; i--) { - if (i in intersectMap) { - intersectMap[i].sort().reverse() - let remainingFraction = 1 - let remainingCurve = this.curves[i] - for (let t of intersectMap[i]) { - let split = remainingCurve.split(t / remainingFraction) - remainingFraction = t - newCurves.push(split.right) - remainingCurve = split.left - } - newCurves.push(remainingCurve) + } + } + } + for (let lst in intersectMap) { + for (let i=1; i=0; i--) { + if (i in intersectMap) { + intersectMap[i].sort().reverse() + let remainingFraction = 1 + let remainingCurve = this.curves[i] + for (let t of intersectMap[i]) { + let split = remainingCurve.split(t / remainingFraction) + remainingFraction = t + newCurves.push(split.right) + remainingCurve = split.left + } + newCurves.push(remainingCurve) - } else { - newCurves.push(this.curves[i]) - } - } - newCurves.reverse() - this.curves = newCurves + } else { + newCurves.push(this.curves[i]) + } + } + newCurves.reverse() + this.curves = newCurves this.recalculateBoundingBox() } draw(context) { @@ -1108,6 +1110,7 @@ function stage() { } } else { let selection = selectCurve(context, mouse) + console.log(selection) if (selection) { context.activeCurve = { current: selection.curve,