Always give intersection segment priority over current segment if valid.

Fixes example 22 in , doesn't seem to introduce new issues, unlike last time I tried this approach.
This commit is contained in:
Jürg Lehni 2015-10-05 05:34:22 +02:00
parent bd4874d73e
commit 05bc6afdbb
2 changed files with 5 additions and 7 deletions

View file

@ -483,10 +483,11 @@ var CurveLocation = Base.extend(/** @lends CurveLocation# */{
var loc2 = locations[i]; var loc2 = locations[i];
// See #equals() for details of why `>= 1` is used here. // See #equals() for details of why `>= 1` is used here.
if (abs(compare(loc, loc2)) >= 1) if (abs(compare(loc, loc2)) >= 1)
return null; break;
if (loc.equals(loc2)) if (loc.equals(loc2))
return loc2; return loc2;
} }
return null;
} }
while (l <= r) { while (l <= r) {

View file

@ -649,8 +649,8 @@ PathItem.inject(new function() {
+ ', other: ' + inter._segment._path._id + '.' + ', other: ' + inter._segment._path._id + '.'
+ inter._segment._index); + inter._segment._index);
} }
inter = getIntersection(true, inter) inter = inter && (getIntersection(true, inter)
|| getIntersection(false, inter) || inter; || getIntersection(false, inter)) || inter;
var other = inter && inter._segment; var other = inter && inter._segment;
// A switched intersection means we may have changed the segment // A switched intersection means we may have changed the segment
// Point to the other segment in the selected intersection. // Point to the other segment in the selected intersection.
@ -699,10 +699,6 @@ PathItem.inject(new function() {
// switch at each crossing. // switch at each crossing.
drawSegment(seg, other, 'exclude-cross', i, 'green'); drawSegment(seg, other, 'exclude-cross', i, 'green');
seg = other; seg = other;
} else if (!seg._visited && isValid(seg)) {
// Do not switch to the intersecting segment as this segment
// is part of the the boolean result.
drawSegment(seg, null, 'keep', i, 'black');
} else if (!other._visited && isValid(other)) { } else if (!other._visited && isValid(other)) {
// The other segment is part of the boolean result, and we // The other segment is part of the boolean result, and we
// are at crossing, switch over. // are at crossing, switch over.
@ -713,6 +709,7 @@ PathItem.inject(new function() {
drawSegment(seg, null, 'stay', i, 'blue'); drawSegment(seg, null, 'stay', i, 'blue');
} }
if (seg._visited) { if (seg._visited) {
// TODO: || !isValid(seg) ?
// We didn't manage to switch, so stop right here. // We didn't manage to switch, so stop right here.
console.error('Visited segment encountered, aborting #' console.error('Visited segment encountered, aborting #'
+ pathCount + '.' + pathCount + '.'