1
0
Fork 0

Merge pull request #2044 from freesewing/joost-pathsplitonstartend

fix(core): Handle path split on start/end of path segments
This commit is contained in:
Joost De Cock 2022-03-30 18:21:33 +02:00 committed by GitHub
commit 027ce3d290
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -747,12 +747,26 @@ Path.prototype.split = function (point) {
if (point instanceof Point !== true) if (point instanceof Point !== true)
this.raise.error('Called `Path.split(point)` but `point` is not a `Point` object') this.raise.error('Called `Path.split(point)` but `point` is not a `Point` object')
let divided = this.divide() let divided = this.divide()
let firstHalf = false let firstHalf = []
let secondHalf = false let secondHalf = []
for (let pi = 0; pi < divided.length; pi++) { for (let pi = 0; pi < divided.length; pi++) {
let path = divided[pi] let path = divided[pi]
if (path.ops[1].type === 'line') { if (path.ops[1].type === 'line') {
if (pointOnLine(path.ops[0].to, path.ops[1].to, point)) { if (path.ops[0].to.sitsRoughlyOn(point)) {
secondHalf.push(new Path(this.debug)
.withRaise(this.raise)
.move(path.ops[0].to)
.line(path.ops[1].to)
)
}
else if (path.ops[1].to.sitsRoughlyOn(point)) {
firstHalf.push(new Path(this.debug)
.withRaise(this.raise)
.move(path.ops[0].to)
.line(path.ops[1].to)
)
}
else if (pointOnLine(path.ops[0].to, path.ops[1].to, point)) {
firstHalf = divided.slice(0, pi) firstHalf = divided.slice(0, pi)
firstHalf.push(new Path(this.debug).withRaise(this.raise).move(path.ops[0].to).line(point)) firstHalf.push(new Path(this.debug).withRaise(this.raise).move(path.ops[0].to).line(point))
pi++ pi++
@ -762,43 +776,59 @@ Path.prototype.split = function (point) {
) )
} }
} else if (path.ops[1].type === 'curve') { } else if (path.ops[1].type === 'curve') {
let t = pointOnCurve(path.ops[0].to, path.ops[1].cp1, path.ops[1].cp2, path.ops[1].to, point) if (path.ops[0].to.sitsRoughlyOn(point)) {
if (t !== false) { secondHalf.push(new Path(this.debug)
let curve = new Bezier( .withRaise(this.raise)
{ x: path.ops[0].to.x, y: path.ops[0].to.y }, .move(path.ops[0].to)
{ x: path.ops[1].cp1.x, y: path.ops[1].cp1.y }, .curve(path.ops[1].cp1, path.ops[1].cp2, path.ops[1].to)
{ x: path.ops[1].cp2.x, y: path.ops[1].cp2.y },
{ x: path.ops[1].to.x, y: path.ops[1].to.y }
) )
let split = curve.split(t) }
firstHalf = divided.slice(0, pi) else if (path.ops[1].to.sitsRoughlyOn(point)) {
firstHalf.push( firstHalf.push(new Path(this.debug)
new Path(this.debug) .withRaise(this.raise)
.withRaise(this.raise) .move(path.ops[0].to)
.move(new Point(split.left.points[0].x, split.left.points[0].y)) .curve(path.ops[1].cp1, path.ops[1].cp2, path.ops[1].to)
.curve(
new Point(split.left.points[1].x, split.left.points[1].y),
new Point(split.left.points[2].x, split.left.points[2].y),
new Point(split.left.points[3].x, split.left.points[3].y)
)
)
pi++
secondHalf = divided.slice(pi)
secondHalf.unshift(
new Path(this.debug)
.withRaise(this.raise)
.move(new Point(split.right.points[0].x, split.right.points[0].y))
.curve(
new Point(split.right.points[1].x, split.right.points[1].y),
new Point(split.right.points[2].x, split.right.points[2].y),
new Point(split.right.points[3].x, split.right.points[3].y)
)
) )
} }
else {
let t = pointOnCurve(path.ops[0].to, path.ops[1].cp1, path.ops[1].cp2, path.ops[1].to, point)
if (t !== false) {
let curve = new Bezier(
{ x: path.ops[0].to.x, y: path.ops[0].to.y },
{ x: path.ops[1].cp1.x, y: path.ops[1].cp1.y },
{ x: path.ops[1].cp2.x, y: path.ops[1].cp2.y },
{ x: path.ops[1].to.x, y: path.ops[1].to.y }
)
let split = curve.split(t)
firstHalf = divided.slice(0, pi)
firstHalf.push(
new Path(this.debug)
.withRaise(this.raise)
.move(new Point(split.left.points[0].x, split.left.points[0].y))
.curve(
new Point(split.left.points[1].x, split.left.points[1].y),
new Point(split.left.points[2].x, split.left.points[2].y),
new Point(split.left.points[3].x, split.left.points[3].y)
)
)
pi++
secondHalf = divided.slice(pi)
secondHalf.unshift(
new Path(this.debug)
.withRaise(this.raise)
.move(new Point(split.right.points[0].x, split.right.points[0].y))
.curve(
new Point(split.right.points[1].x, split.right.points[1].y),
new Point(split.right.points[2].x, split.right.points[2].y),
new Point(split.right.points[3].x, split.right.points[3].y)
)
)
}
}
} }
} }
if (firstHalf) firstHalf = joinPaths(firstHalf, false, this.raise) if (firstHalf.length > 0) firstHalf = joinPaths(firstHalf, false, this.raise)
if (secondHalf) secondHalf = joinPaths(secondHalf, false, this.raise) if (secondHalf.length > 0) secondHalf = joinPaths(secondHalf, false, this.raise)
return [firstHalf, secondHalf] return [firstHalf, secondHalf]
} }