Boolean: Avoid winding edge cases

Stay clear from testing winding on actual segments.
Closes #1619
This commit is contained in:
Jürg Lehni 2019-06-23 04:19:20 +02:00
parent 14ce1dc011
commit 192437dbe2
2 changed files with 24 additions and 1 deletions

View file

@ -751,7 +751,8 @@ PathItem.inject(new function() {
// the best quality. // the best quality.
var offsets = [0.5, 0.25, 0.75], var offsets = [0.5, 0.25, 0.75],
winding = { winding: 0, quality: -1 }, winding = { winding: 0, quality: -1 },
tMin = /*#=*/Numerical.CURVETIME_EPSILON, // Don't go too close to segments, to avoid special winding cases:
tMin = 1e-3,
tMax = 1 - tMin; tMax = 1 - tMin;
for (var i = 0; i < offsets.length && winding.quality < 0.5; i++) { for (var i = 0; i < offsets.length && winding.quality < 0.5; i++) {
var length = totalLength * offsets[i]; var length = totalLength * offsets[i];

View file

@ -1230,3 +1230,25 @@ test('#1647', function() {
var result = 'M57.83,48.25l-6.78143,11.75l-2.88143,0l7.50286,-13c0.88236,-1.55771 2.53981,-2.51466 4.33,-2.5v2.5c-0.89493,-0.00177 -1.72254,0.47497 -2.17,1.25z'; var result = 'M57.83,48.25l-6.78143,11.75l-2.88143,0l7.50286,-13c0.88236,-1.55771 2.53981,-2.51466 4.33,-2.5v2.5c-0.89493,-0.00177 -1.72254,0.47497 -2.17,1.25z';
compareBoolean(path1.intersect(path2), result); compareBoolean(path1.intersect(path2), result);
}); });
test('#1619', function() {
var path1 = new Path.Rectangle({
from: [200, 600],
to: [400, 300]
});
var path2 = new CompoundPath({
children: [
new Path({
segments: [[420,320],[380,580],[220,580],[220,320]],
closed: true
}),
new Path({
segments: [[313.36486,413.71682],[243.351,483.70296],[313.33714,553.71682],[383.351,483.73068]],
closed: true
})
]
});
var result = 'M380,580h-160v-260l180,0v130zM313.36486,413.71682l-70.01386,69.98614l69.98614,70.01386l70.01386,-69.98614z';
compareBoolean(path1.intersect(path2), result);
});