Boolean: No need to actually check for fill

This commit is contained in:
Jürg Lehni 2019-06-23 04:47:34 +02:00
parent 192437dbe2
commit 2ef8175cb8
2 changed files with 10 additions and 12 deletions

View file

@ -61,12 +61,12 @@ PathItem.inject(new function() {
.clone(false) .clone(false)
.reduce({ simplify: true }) .reduce({ simplify: true })
.transform(null, true, true); .transform(null, true, true);
// For correct results, close open filled paths with straight lines: if (resolve) {
if (resolve && res.hasFill()) { // For correct results, close open paths with straight lines:
var paths = getPaths(res); var paths = getPaths(res);
for (var i = 0, l = paths.length; i < l; i++) { for (var i = 0, l = paths.length; i < l; i++) {
var path = paths[i]; var path = paths[i];
if (!path._closed) { if (!path._closed && !path.isEmpty()) {
// Close with epsilon tolerance, to avoid tiny straight // Close with epsilon tolerance, to avoid tiny straight
// that would cause issues with intersection detection. // that would cause issues with intersection detection.
path.closePath(/*#=*/Numerical.EPSILON); path.closePath(/*#=*/Numerical.EPSILON);
@ -74,12 +74,11 @@ PathItem.inject(new function() {
path.getLastSegment().setHandleOut(0, 0); path.getLastSegment().setHandleOut(0, 0);
} }
} }
} res = res
return resolve
? res
.resolveCrossings() .resolveCrossings()
.reorient(res.getFillRule() === 'nonzero', true) .reorient(res.getFillRule() === 'nonzero', true);
: res; }
return res;
} }
function createResult(paths, simplify, path1, path2, options) { function createResult(paths, simplify, path1, path2, options) {

View file

@ -888,7 +888,7 @@ test('#1221', function() {
compareBoolean(function() { return blob.subtract(rect2, { trace: false }); }, compareBoolean(function() { return blob.subtract(rect2, { trace: false }); },
'M534,273c-29.65069,-13.2581 -57.61955,-25.39031 -84,-36.46967M150,138.13156c-71.67127,-11.53613 -105.25987,0.10217 -120,19.86844c-40.5,54.3 31.5,210.2 111,222c3.08303,0.45637 6.07967,0.68158 9,0.69867M409.85616,400c18.87105,20.95032 39.82014,38.41763 69.14384,42c33.8,4.1 83.1,-9.7 150,-90'); 'M534,273c-29.65069,-13.2581 -57.61955,-25.39031 -84,-36.46967M150,138.13156c-71.67127,-11.53613 -105.25987,0.10217 -120,19.86844c-40.5,54.3 31.5,210.2 111,222c3.08303,0.45637 6.07967,0.68158 9,0.69867M409.85616,400c18.87105,20.95032 39.82014,38.41763 69.14384,42c33.8,4.1 83.1,-9.7 150,-90');
compareBoolean(function() { return blob.subtract(rect2, { trace: true }); }, compareBoolean(function() { return blob.subtract(rect2, { trace: true }); },
'M629,352c-66.9,80.3 -116.2,94.1 -150,90c-29.3237,-3.58237 -50.27279,-21.04968 -69.14384,-42h40.14384v-163.46967c26.38045,11.07937 54.34931,23.21157 84,36.46967M141,380c-79.5,-11.8 -151.5,-167.7 -111,-222c14.74013,-19.76627 48.32873,-31.40457 120,-19.86844v242.56712c-2.92033,-0.01709 -5.91697,-0.24231 -9,-0.69867z'); 'M629,352c-66.9,80.3 -116.2,94.1 -150,90c-29.3237,-3.58237 -50.27279,-21.04968 -69.14384,-42h40.14384v-163.46967c26.38045,11.07937 54.34931,23.21157 84,36.46967zM141,380c-79.5,-11.8 -151.5,-167.7 -111,-222c14.74013,-19.76627 48.32873,-31.40457 120,-19.86844v242.56712c-2.92033,-0.01709 -5.91697,-0.24231 -9,-0.69867z');
var rect3 = new Path.Rectangle({ var rect3 = new Path.Rectangle({
point: [150, 100], point: [150, 100],
@ -898,8 +898,7 @@ test('#1221', function() {
compareBoolean(function() { return blob.subtract(rect3, { trace: false }); }, compareBoolean(function() { return blob.subtract(rect3, { trace: false }); },
'M534,273c-29.65069,-13.2581 -57.61955,-25.39031 -84,-36.46967M150,138.13156c-71.67127,-11.53613 -105.25987,0.10217 -120,19.86844c-40.5,54.3 31.5,210.2 111,222c60.8,9 88,-71.9 159,-66c81.6,6.8 99.6,118.3 179,128c33.8,4.1 83.1,-9.7 150,-90'); 'M534,273c-29.65069,-13.2581 -57.61955,-25.39031 -84,-36.46967M150,138.13156c-71.67127,-11.53613 -105.25987,0.10217 -120,19.86844c-40.5,54.3 31.5,210.2 111,222c60.8,9 88,-71.9 159,-66c81.6,6.8 99.6,118.3 179,128c33.8,4.1 83.1,-9.7 150,-90');
compareBoolean(function() { return blob.subtract(rect3, { trace: true }); }, compareBoolean(function() { return blob.subtract(rect3, { trace: true }); },
'M629,352c-66.9,80.3 -116.2,94.1 -150,90c-79.4,-9.7 -97.4,-121.2 -179,-128c-71,-5.9 -98.2,75 -159,66c-79.5,-11.8 -151.5,-167.7 -111,-222c14.74013,-19.76627 48.32873,-31.40457 120,-19.86844v111.86844h300v-13.46967c26.38045,11.07937 54.34931,23.21157 84,36.46967'); 'M629,352c-66.9,80.3 -116.2,94.1 -150,90c-79.4,-9.7 -97.4,-121.2 -179,-128c-71,-5.9 -98.2,75 -159,66c-79.5,-11.8 -151.5,-167.7 -111,-222c14.74013,-19.76627 48.32873,-31.40457 120,-19.86844v111.86844h300v-13.46967c26.38045,11.07937 54.34931,23.21157 84,36.46967z');
var rect4 = new Path.Rectangle({ var rect4 = new Path.Rectangle({
point: [200, 200], point: [200, 200],
@ -1219,7 +1218,7 @@ test('#1419', function() {
test('#1351', function() { test('#1351', function() {
var path1 = new CompoundPath(new Path([10, 10], [100, 100]), new Path([150, 25])); var path1 = new CompoundPath(new Path([10, 10], [100, 100]), new Path([150, 25]));
var path2 = new Path([20, 80], [80, 20]); var path2 = new Path([20, 80], [80, 20]);
var result = 'M10,10l40,40l50,50'; var result = ''; // empty!
compareBoolean(path1.unite(path2), result); compareBoolean(path1.unite(path2), result);
}); });