mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-01-03 19:45:44 -05:00
191 lines
No EOL
6.7 KiB
JavaScript
191 lines
No EOL
6.7 KiB
JavaScript
/*
|
|
* Paper.js - The Swiss Army Knife of Vector Graphics Scripting.
|
|
* http://paperjs.org/
|
|
*
|
|
* Copyright (c) 2011 - 2013, Juerg Lehni & Jonathan Puckey
|
|
* http://lehni.org/ & http://jonathanpuckey.com/
|
|
*
|
|
* Distributed under the MIT license. See LICENSE file for details.
|
|
*
|
|
* All rights reserved.
|
|
*/
|
|
|
|
module('Item Contains');
|
|
|
|
function testPoint(item, point, inside) {
|
|
equals(item.contains(point), inside, 'The point ' + point
|
|
+ ' should be ' + (inside ? 'inside' : 'outside') + '.');
|
|
}
|
|
|
|
test('Path#contains() (Regular Polygon)', function() {
|
|
var path = new Path.RegularPolygon([0, 0], 6, 20);
|
|
|
|
testPoint(path, new Point(0, -20), true);
|
|
testPoint(path, new Point(0, -10), true);
|
|
testPoint(path, new Point(0, 0), true);
|
|
testPoint(path, new Point(0, 10), true);
|
|
testPoint(path, new Point(0, 20), true);
|
|
|
|
testPoint(path, new Point(-10, -20), false);
|
|
testPoint(path, new Point(-10, -10), true);
|
|
testPoint(path, new Point(-10, 0), true);
|
|
testPoint(path, new Point(-10, 10), true);
|
|
testPoint(path, new Point(-10, 20), false);
|
|
|
|
testPoint(path, new Point(10, -20), false);
|
|
testPoint(path, new Point(10, -10), true);
|
|
testPoint(path, new Point(10, 0), true);
|
|
testPoint(path, new Point(10, 10), true);
|
|
testPoint(path, new Point(10, 20), false);
|
|
});
|
|
|
|
test('Path#contains() (Circle Contours)', function() {
|
|
var path = new Path.Circle({
|
|
center: [100, 100],
|
|
radius: 50,
|
|
fillColor: 'blue',
|
|
});
|
|
|
|
testPoint(path, path.bounds.topCenter, true);
|
|
testPoint(path, path.bounds.leftCenter, true);
|
|
testPoint(path, path.bounds.rightCenter, true);
|
|
testPoint(path, path.bounds.bottomCenter, true);
|
|
testPoint(path, path.bounds.topLeft, false);
|
|
testPoint(path, path.bounds.topRight, false);
|
|
testPoint(path, path.bounds.bottomLeft, false);
|
|
testPoint(path, path.bounds.bottomRight, false);
|
|
});
|
|
|
|
test('Path#contains() (Transformed Circle Contours)', function() {
|
|
var path = new Path.Circle({
|
|
center: [200, 200],
|
|
radius: 50,
|
|
fillColor: 'blue',
|
|
});
|
|
path.translate(100, 100);
|
|
|
|
testPoint(path, path.bounds.topCenter, true);
|
|
testPoint(path, path.bounds.leftCenter, true);
|
|
testPoint(path, path.bounds.rightCenter, true);
|
|
testPoint(path, path.bounds.bottomCenter, true);
|
|
testPoint(path, path.bounds.topLeft, false);
|
|
testPoint(path, path.bounds.topRight, false);
|
|
testPoint(path, path.bounds.bottomLeft, false);
|
|
testPoint(path, path.bounds.bottomRight, false);
|
|
});
|
|
|
|
test('Path#contains() (Round Rectangle)', function() {
|
|
var rectangle = new Rectangle({
|
|
point: new Point(0, 0),
|
|
size: new Size(200, 40)
|
|
});
|
|
var path = new Path.Rectangle(rectangle, new Size(20, 20));
|
|
testPoint(path, new Point(100, 20), true);
|
|
});
|
|
|
|
test('Path#contains() (Open Circle)', function() {
|
|
var path = new Path.Circle([100, 100], 100);
|
|
path.closed = false;
|
|
path.fillColor = '#ff0000';
|
|
testPoint(path, new Point(40, 160), false);
|
|
});
|
|
|
|
test('CompoundPath#contains() (Donut)', function() {
|
|
var path = new CompoundPath([
|
|
new Path.Circle([0, 0], 50),
|
|
new Path.Circle([0, 0], 25)
|
|
]);
|
|
|
|
equals(path.contains(new Point(0, 0)), false,
|
|
'The center point should be outside the donut.');
|
|
equals(path.contains(new Point(-35, 0)), true,
|
|
'A vertically centered point on the left side should be inside the donut.');
|
|
equals(path.contains(new Point(35, 0)), true,
|
|
'A vertically centered point on the right side should be inside the donut.');
|
|
equals(path.contains(new Point(0, 49)), true,
|
|
'The near bottom center point of the outer circle should be inside the donut.');
|
|
equals(path.contains(new Point(0, 50)), true,
|
|
'The bottom center point of the outer circle should be inside the donut.');
|
|
equals(path.contains(new Point(0, 51)), false,
|
|
'The near bottom center point of the outer circle should be outside the donut.');
|
|
equals(path.contains(new Point({ length: 50, angle: 30 })), true,
|
|
'A random point on the periphery of the outer circle should be inside the donut.');
|
|
equals(path.contains(new Point(0, 25)), false,
|
|
'The bottom center point of the inner circle should be outside the donut.');
|
|
equals(path.contains(new Point({ length: 25, angle: 30 })), false,
|
|
'A random point on the periphery of the inner circle should be outside the donut.');
|
|
equals(path.contains(new Point(-50, -50)), false,
|
|
'The top left point of bounding box should be outside the donut.');
|
|
equals(path.contains(new Point(-50, 50)), false,
|
|
'The bottom left point of bounding box should be outside the donut.');
|
|
equals(path.contains(new Point(-45, 45)), false,
|
|
'The near bottom left point of bounding box should be outside the donut.');
|
|
});
|
|
|
|
test('Shape#contains()', function() {
|
|
var shape = new Shape.Circle([0, 0], 100);
|
|
|
|
testPoint(shape, new Point(0, 0), true);
|
|
testPoint(shape, new Point(0, -100), true);
|
|
testPoint(shape, new Point({ length: 99, angle: 45 }), true);
|
|
testPoint(shape, new Point({ length: 100, angle: 45 }), true);
|
|
testPoint(shape, new Point({ length: 101, angle: 45 }), false);
|
|
|
|
var size = new Size(100, 200),
|
|
half = size.divide(2),
|
|
shape = new Shape.Ellipse(half.negate(), size);
|
|
testPoint(shape, new Point(0, 0), true);
|
|
testPoint(shape, new Point(0, -1).multiply(half), true);
|
|
testPoint(shape, new Point({ length: 0.9, angle: 45 }).multiply(half), true);
|
|
testPoint(shape, new Point({ length: 1, angle: 45 }).multiply(half), true);
|
|
testPoint(shape, new Point({ length: 1.1, angle: 45 }).multiply(half), false);
|
|
|
|
|
|
var size = new Size(100, 200),
|
|
half = size.divide(2),
|
|
shape = new Shape.Rectangle(half.negate(), size);
|
|
testPoint(shape, new Point(0, 0), true);
|
|
testPoint(shape, new Point(0, 0.9).multiply(half), true);
|
|
testPoint(shape, new Point(0, 1).multiply(half), true);
|
|
testPoint(shape, new Point(0, 1.1).multiply(half), false);
|
|
testPoint(shape, new Point(0.9, 0).multiply(half), true);
|
|
testPoint(shape, new Point(1, 0).multiply(half), true);
|
|
testPoint(shape, new Point(1.1, 0).multiply(half), false);
|
|
});
|
|
|
|
test('Path#contains() (Rectangle Contours)', function() {
|
|
var path = new Path.Rectangle(new Point(100, 100), [200, 200]),
|
|
curves = path.getCurves();
|
|
|
|
for (var i = 0; i < curves.length; i++) {
|
|
testPoint(path, curves[i].getPoint(0), true);
|
|
testPoint(path, curves[i].getPoint(0.5), true);
|
|
}
|
|
});
|
|
|
|
|
|
test('Path#contains() (Rotated Rectangle Contours)', function() {
|
|
var path = new Path.Rectangle(new Point(100, 100), [200, 200]),
|
|
curves = path.getCurves();
|
|
|
|
path.rotate(45);
|
|
|
|
for (var i = 0; i < curves.length; i++) {
|
|
testPoint(path, curves[i].getPoint(0), true);
|
|
testPoint(path, curves[i].getPoint(0.5), true);
|
|
}
|
|
});
|
|
|
|
test('Path#contains() (touching stationary point with changing orientation)', function() {
|
|
var path = new Path({
|
|
segments: [
|
|
new Segment([100, 100]),
|
|
new Segment([200, 200], [-50, 0], [50, 0]),
|
|
new Segment([300, 300]),
|
|
new Segment([300, 100])
|
|
],
|
|
closed: true
|
|
});
|
|
|
|
testPoint(path, new Point(200, 200), true);
|
|
}) |