p2s
Version:
A JavaScript 2D physics engine.
129 lines (110 loc) • 3.36 kB
JavaScript
var AABB = require(__dirname + '/../../src/collision/AABB');
var Ray = require(__dirname + '/../../src/collision/Ray');
var vec2 = require(__dirname + '/../../src/math/vec2');
exports.construct = function(test){
var aabb = new AABB({
lowerBound: [-1, -2],
upperBound: [1, 2]
});
test.equal(aabb.lowerBound[0], -1);
test.equal(aabb.lowerBound[1], -2);
test.equal(aabb.upperBound[0], 1);
test.equal(aabb.upperBound[1], 2);
test.done();
};
exports.copy = function(test){
var aabb = new AABB({
lowerBound: [-1, -2],
upperBound: [1, 2]
});
var aabb2 = new AABB();
aabb2.copy(aabb);
test.equal(aabb2.lowerBound[0], -1);
test.equal(aabb2.lowerBound[1], -2);
test.equal(aabb2.upperBound[0], 1);
test.equal(aabb2.upperBound[1], 2);
test.done();
};
exports.extend = function(test){
// STUB
test.done();
};
exports.overlaps = function(test){
var a = new AABB(),
b = new AABB();
// Same aabb
vec2.set(a.lowerBound, -1, -1);
vec2.set(a.upperBound, 1, 1);
vec2.set(b.lowerBound, -1, -1);
vec2.set(b.upperBound, 1, 1);
test.ok(a.overlaps(b),'should detect overlap of self');
// Corner overlaps
vec2.set(b.lowerBound, 1, 1);
vec2.set(b.upperBound, 2, 2);
test.ok(a.overlaps(b),'should detect corner overlap');
// Separate
vec2.set(b.lowerBound, 1.1, 1.1);
test.ok(!a.overlaps(b),'should detect separated');
// fully inside
vec2.set(b.lowerBound, -0.5, -0.5);
vec2.set(b.upperBound, 0.5, 0.5);
test.ok(a.overlaps(b),'should detect if aabb is fully inside other aabb');
vec2.set(b.lowerBound, -1.5, -1.5);
vec2.set(b.upperBound, 1.5, 1.5);
test.ok(a.overlaps(b),'should detect if aabb is fully inside other aabb');
// Translated
vec2.set(b.lowerBound, -3, -0.5);
vec2.set(b.upperBound, -2, 0.5);
test.ok(!a.overlaps(b),'should detect translated');
test.done();
};
exports.containsPoint = function(test){
var aabb = new AABB({
lowerBound: [-1, -1],
upperBound: [1, 1]
});
test.ok(aabb.containsPoint([0,0]));
test.ok(aabb.containsPoint([1,1]));
test.ok(aabb.containsPoint([-1,-1]));
test.ok(!aabb.containsPoint([2,2]));
test.done();
};
exports.overlapsRay = function(test){
var aabb = new AABB({
upperBound: [1, 1],
lowerBound: [-1, -1]
});
var ray = new Ray({
from: [-2, 0],
to: [0, 0]
});
var result = aabb.overlapsRay(ray);
test.equal(result, 0.5);
test.done();
};
exports.setFromPoints = function(test){
var a = new AABB();
var points = [
[-1,-1],
[1, 1],
[0, 0],
];
var position = [1,1];
var angle = 0;
a.setFromPoints(points, position, angle);
test.equal(a.lowerBound[0], 0);
test.equal(a.lowerBound[1], 0);
test.equal(a.upperBound[0], 2);
test.equal(a.upperBound[1], 2);
// One point
a.setFromPoints([[1,2]], [0,0], 0);
test.equal(a.lowerBound[0], 1);
test.equal(a.lowerBound[1], 2);
test.equal(a.upperBound[0], 1);
test.equal(a.upperBound[1], 2);
// Rotated 45 degrees
a.setFromPoints(points, [0,0], Math.PI/4);
test.ok(Math.abs(a.lowerBound[0]) < 0.01);
test.ok(Math.abs(a.upperBound[0]) < 0.01);
test.done();
};