Find a more general implementation for Item#intersects(item).

This commit is contained in:
Jürg Lehni 2014-10-20 18:00:07 +02:00
parent 5ddbc5b07f
commit 782bde238c
2 changed files with 22 additions and 21 deletions

View file

@ -1635,6 +1635,19 @@ var Item = Base.extend(Emitter, /** @lends Item# */{
return Rectangle.read(arguments).contains(this.getBounds()); return Rectangle.read(arguments).contains(this.getBounds());
}, },
// Internal helper function, used at the moment for intersects check only.
// TODO: Move #getIntersections() to Item, make it handle all type of items
// through _asPathItem(), and support Group items as well, taking nested
// matrices into account properly!
_asPathItem: function() {
// Creates a temporary rectangular path item with this item's bounds.
return new Path.Rectangle({
rectangle: this.getInternalBounds(),
matrix: this._matrix,
insert: false,
});
},
// DOCS: // DOCS:
// TEST: // TEST:
/** /**
@ -1644,14 +1657,13 @@ var Item = Base.extend(Emitter, /** @lends Item# */{
intersects: function(item, _matrix) { intersects: function(item, _matrix) {
if (!(item instanceof Item)) if (!(item instanceof Item))
return false; return false;
// Create a temporary rectangular path item with this item's bounds, and // TODO: Optimize getIntersections(): We don't need all intersections
// delegate the call to it. // when we're just curious about whether they intersect or not. Pass on
return new Path.Rectangle({ // an argument that let's it bail out after the first intersection.
rectangle: this.getInternalBounds(), return this._asPathItem().getIntersections(item._asPathItem(),
matrix: this._matrix, _matrix || item._matrix).length > 0;
insert: false,
}).intersects(item, _matrix);
}, },
/** /**
* Perform a hit test on the item (and its children, if it is a * Perform a hit test on the item (and its children, if it is a
* {@link Group} or {@link Layer}) at the location of the specified point. * {@link Group} or {@link Layer}) at the location of the specified point.

View file

@ -181,20 +181,9 @@ var PathItem = Item.extend(/** @lends PathItem# */{
return locations; return locations;
}, },
intersects: function(item, _matrix) { _asPathItem: function() {
if (!(item instanceof Item)) // See Item#_asPathItem()
return false; return this;
var other = item instanceof PathItem
? item
// Create a temporary rectangular path item to check against.
: new Path.Rectangle({
rectangle: item.getInternalBounds(),
insert: false
});
// TODO: Optimize getIntersections(): We don't need all intersections
// when we're just curious about whether they intersect or not. Pass on
// an argument that let's it bail out after the first intersection.
return this.getIntersections(other, _matrix || item._matrix).length > 0;
}, },
/** /**