@rawify/vector2
Version:
The RAW JavaScript 2D Vector library
409 lines (399 loc) • 10.9 kB
JavaScript
describe("create", {
'create vector': function() {
var a = v2(3,4);
this.expect(a.x===3 && a.y === 4, true);
},
'create null vector': function() {
var a = v2();
this.expect(a.x===0 && a.y === 0, true);
},
});
describe("analyse", {
'zero vector': function() {
var z = v2.zero;
z.x = 1; // does not work ... components are read only.
this.expect(z.x===0 && z.y === 0, true);
},
'is zero vector': function() {
var a = {x:0,y:0};
this.expect(v2.isZero(a), true);
},
'is equal': function() {
var a = {x:2,y:3}, b = {x:3,y:4}, c = {x:3,y:4};
this.expect(v2.isEq(a,b), false);
this.expect(v2.isEq(b,c), true);
},
'is nearly equal or nearly zero': function() {
var a = {x:3,y:4+1e-17}, b = {x:3,y:4}, c = {x:1e-17,y:1e-18};
this.expect(v2.isEps(a,b), true);
this.expect(v2.isEps(c), true);
},
'sqr': function() {
var a = {x:3,y:4};
this.expect(v2.sqr(a), 25);
},
'len': function() {
var a = {x:3,y:4};
this.expect(v2.len(a), 5);
},
'angle to x-axis': function() {
var a = {x:3,y:4};
this.expect(v2.angle(a), Math.atan2(4,3));
},
'angle from a to b': function() {
var a = {x:3,y:4}, b = v2.tilde(a);
this.expect(v2.angle(a,b), Math.PI/2);
}
});
describe("operator", {
'copy': function() {
var a = v2(3,4), b;
b = v2.copy(a,b);
this.expect(b.x===3 && b.y === 4, true);
},
'unit': function() {
var a = v2.unit(v2(3,4));
this.expect(Math.abs(a.x*a.x + a.y*a.y)-1 < v2.EPS, true);
},
'toPolar': function() {
var a = v2.toPolar(v2(3,4));
this.expect(a.r, 5);
this.expect(a.w, Math.atan2(4,3));
},
'fromPolar': function() {
var a = v2.fromPolar({r:5,w:Math.PI/6});
this.expect(a.x, 5*Math.cos(Math.PI/6));
this.expect(a.y, 5*Math.sin(Math.PI/6));
},
});
var v = require('./');
var Vec2d = v.Vec2d;
var assert = require('assert');
var EPSILON = 0.000000000001;
var describe = global.describe;
var it = global.it;
describe("v()", function() {
it("no args", function() {
var v1 = v();
assert.strictEqual(v1.x, 0);
assert.strictEqual(v1.y, 0);
});
it("x, y", function() {
var v1 = v(-1, 5);
assert.strictEqual(v1.x, -1);
assert.strictEqual(v1.y, 5);
});
it("array", function() {
var v1 = v([4, 5]);
assert.strictEqual(v1.x, 4);
assert.strictEqual(v1.y, 5);
});
it("object", function() {
var v1 = v({x: 9, y: 8});
assert.strictEqual(v1.x, 9);
assert.strictEqual(v1.y, 8);
});
it("string coords", function() {
var v1 = v("1", "-1.5");
assert.strictEqual(v1.x, 1);
assert.strictEqual(v1.y, -1.5);
});
it("deserialize", function() {
var v1 = v(v(1, -3.5).toString());
assert.strictEqual(v1.x, 1);
assert.strictEqual(v1.y, -3.5);
var v2 = v(v(-111, 9876543210.123456789).toString());
assert.strictEqual(v2.x, -111);
assert.strictEqual(v2.y, 9876543210.123456789);
});
it("invalid deserialize", function() {
assert.throws(function() {
return v("lol hax");
}, /cannot parse/);
});
it("unit", function() {
var v1 = v.unit(Math.PI / 2);
assertCloseEnough(0, v1.x);
assertCloseEnough(1, v1.y);
});
});
describe("Vec2d", function() {
it("unit", function() {
var v1 = Vec2d.unit(Math.PI);
assertCloseEnough(-1, v1.x);
assertCloseEnough(0, v1.y);
});
it("offset", function() {
var v1 = new Vec2d(1, 2);
var v2 = v1.offset(10, -10);
v1.x = -100;
assert.strictEqual(v2.x, 11);
assert.strictEqual(v2.y, -8);
});
it("add", function() {
var v1 = new Vec2d(1, 2);
var v2 = new Vec2d(-1, -2);
var v3 = v1.add(v2);
assert.strictEqual(v3, v1);
assert.strictEqual(v1.x, 0);
assert.strictEqual(v1.y, 0);
});
it("sub", function() {
var v1 = new Vec2d(1, 2);
var v2 = new Vec2d(-1, -2);
var v3 = v1.sub(v2);
assert.strictEqual(v3, v1);
assert.strictEqual(v1.x, 2);
assert.strictEqual(v1.y, 4);
});
it("plus", function() {
var v1 = new Vec2d(1, 2);
var v2 = new Vec2d(-1, 0);
var v3 = v1.plus(v2);
assert.strictEqual(v1.x, 1);
assert.strictEqual(v1.y, 2);
assert.strictEqual(v2.x, -1);
assert.strictEqual(v2.y, 0);
assert.strictEqual(v3.x, 0);
assert.strictEqual(v3.y, 2);
});
it("minus", function() {
var v1 = new Vec2d(1, 2);
var v2 = new Vec2d(-1, 0);
var v3 = v1.minus(v2);
assert.strictEqual(v1.x, 1);
assert.strictEqual(v1.y, 2);
assert.strictEqual(v2.x, -1);
assert.strictEqual(v2.y, 0);
assert.strictEqual(v3.x, 2);
assert.strictEqual(v3.y, 2);
});
it("neg", function() {
var v1 = new Vec2d(1, -2);
var v2 = v1.neg();
assert.strictEqual(v1, v2);
assert.strictEqual(v1.x, -1);
assert.strictEqual(v1.y, 2);
});
it("mult", function() {
var v1 = new Vec2d(-1, 1);
var v2 = new Vec2d(2, -3);
var v3 = v1.mult(v2);
assert.strictEqual(v1, v3);
assert.strictEqual(v3.x, -2);
assert.strictEqual(v3.y, -3);
});
it("times", function() {
var v1 = new Vec2d(-1, 1);
var v2 = new Vec2d(2, -3);
var v3 = v1.times(v2);
assert.notStrictEqual(v1, v3);
assert.strictEqual(v3.x, -2);
assert.strictEqual(v3.y, -3);
});
it("div", function() {
var v1 = new Vec2d(6, 4);
var v2 = new Vec2d(3, 2);
var v3 = v1.div(v2);
assert.strictEqual(v3, v1);
assert.strictEqual(v1.x, 2);
assert.strictEqual(v1.y, 2);
assert.strictEqual(v2.x, 3);
assert.strictEqual(v2.y, 2);
});
it("divBy", function() {
var v1 = new Vec2d(6, 4);
var v2 = new Vec2d(3, 2);
var v3 = v1.divBy(v2);
assert.strictEqual(v1.x, 6);
assert.strictEqual(v1.y, 4);
assert.strictEqual(v3.x, 2);
assert.strictEqual(v3.y, 2);
assert.strictEqual(v2.x, 3);
assert.strictEqual(v2.y, 2);
});
it("scale", function() {
var v1 = new Vec2d(3, 4);
var v2 = v1.scale(2);
assert.strictEqual(v1, v2);
assert.strictEqual(v1.x, 6);
assert.strictEqual(v1.y, 8);
});
it("scaled", function() {
var v1 = new Vec2d(-3, 4);
var v2 = v1.scaled(-2);
assert.strictEqual(v1.x, -3);
assert.strictEqual(v1.y, 4);
assert.strictEqual(v2.x, 6);
assert.strictEqual(v2.y, -8);
});
it("clone", function() {
var v1 = new Vec2d(-1, 1);
var v2 = v1.clone();
v2.x += 1;
v2.y += 1;
assert.strictEqual(v1.x, -1);
assert.strictEqual(v1.y, 1);
assert.strictEqual(v2.x, 0);
assert.strictEqual(v2.y, 2);
});
it("apply", function() {
var v1 = new Vec2d(1.1, 2.2);
var v2 = v1.apply(Math.ceil);
assert.strictEqual(v1, v2);
assert.strictEqual(v2.x, 2);
assert.strictEqual(v2.y, 3);
});
it("applied", function() {
var v1 = new Vec2d(1.1, 2.2);
var v2 = v1.applied(Math.ceil);
assert.strictEqual(v1.x, 1.1);
assert.strictEqual(v1.y, 2.2);
assert.strictEqual(v2.x, 2);
assert.strictEqual(v2.y, 3);
});
it("equals", function() {
var v1 = new Vec2d(-0.3, 100);
var v2 = new Vec2d(-0.3, 100);
assert.strictEqual(v1.equals(v2), true);
});
it("toString", function() {
var v1 = new Vec2d(99, -1);
assert.strictEqual(v1.toString(), "(99, -1)");
});
it("length", function() {
var v1 = new Vec2d(3, 4);
assert.strictEqual(v1.length(), 5);
});
it("lengthSqrd", function() {
var v1 = new Vec2d(3, 4);
assert.strictEqual(v1.lengthSqrd(), 25);
});
it("angle", function() {
var v1 = new Vec2d(0, 1);
assert.strictEqual(v1.angle(), Math.PI / 2);
});
it("normalize", function() {
var v1 = new Vec2d(2, 2);
var v2 = v1.normalize();
assert.strictEqual(v1, v2);
assertCloseEnough(v2.x, 0.7071067811865475);
assertCloseEnough(v2.y, 0.7071067811865475);
});
it("normalized", function() {
var v1 = new Vec2d(10, 0);
var v2 = v1.normalized();
assert.strictEqual(v1.x, 10);
assert.strictEqual(v1.y, 0);
assert.strictEqual(v2.x, 1);
assert.strictEqual(v2.y, 0);
});
it("boundMin", function() {
var v1 = new Vec2d(13, 99);
var min = new Vec2d(20, 90);
var v2 = v1.boundMin(min);
assert.strictEqual(v1, v2);
assert.strictEqual(v2.x, 20);
assert.strictEqual(v2.y, 99);
});
it("boundMax", function() {
var v1 = new Vec2d(13, 99);
var max = new Vec2d(20, 90);
var v2 = v1.boundMax(max);
assert.strictEqual(v1, v2);
assert.strictEqual(v2.x, 13);
assert.strictEqual(v2.y, 90);
});
it("floor", function() {
var v1 = new Vec2d(-3.3, 9.9);
var v2 = v1.floor();
assert.strictEqual(v1, v2);
assert.strictEqual(v2.x, -4);
assert.strictEqual(v2.y, 9);
});
it("floored", function() {
var v1 = new Vec2d(-3.3, 9.9);
var v2 = v1.floored();
assert.strictEqual(v1.x, -3.3);
assert.strictEqual(v1.y, 9.9);
assert.strictEqual(v2.x, -4);
assert.strictEqual(v2.y, 9);
});
it("ceil", function() {
var v1 = new Vec2d(-3.3, 9.9);
var v2 = v1.ceil();
assert.strictEqual(v1, v2);
assert.strictEqual(v2.x, -3);
assert.strictEqual(v2.y, 10);
});
it("ceiled", function() {
var v1 = new Vec2d(-3.3, 9.9);
var v2 = v1.ceiled();
assert.strictEqual(v1.x, -3.3);
assert.strictEqual(v1.y, 9.9);
assert.strictEqual(v2.x, -3);
assert.strictEqual(v2.y, 10);
});
it("project");
it("dot", function() {
var v1 = v(0, 1);
var v2 = v(1, 0);
var v3 = v(0, -1);
assert.strictEqual(v1.dot(v2), 0);
assert.strictEqual(v1.dot(v3), -1);
});
it("rotate", function() {
var v1 = v(0, 1);
var v2 = v(1, 1);
var v3 = v2.rotate(v1);
assert.strictEqual(v3, v2);
assert.strictEqual(v2.x, -1);
assert.strictEqual(v2.y, 1);
});
it("rotated", function() {
var v1 = v(0, 1);
var v2 = v(1, 1);
var v3 = v2.rotated(v1);
assert.strictEqual(v1.x, 0);
assert.strictEqual(v1.y, 1);
assert.strictEqual(v2.x, 1);
assert.strictEqual(v2.y, 1);
assert.strictEqual(v3.x, -1);
assert.strictEqual(v3.y, 1);
});
it("distance", function() {
var v1 = v(-1, -1);
var v2 = v(2, 3);
assert.strictEqual(v1.distance(v2), 5);
});
it("distanceSqrd", function() {
var v1 = v(-1, -1);
var v2 = v(2, 3);
assert.strictEqual(v1.distanceSqrd(v2), 25);
});
it("reflect", function() {
var v1 = v(1, 0);
var axis = v(0, 1);
var v2 = v1.reflect(axis);
assert.strictEqual(v1.x, -1);
assert.strictEqual(v1.y, 0);
});
it("reflectAboutLine", function() {
var v1 = v(1, -1);
var linePt1 = v(1, 1);
var linePt2 = v(-1, -1);
var v2 = v1.reflectAboutLine(linePt1, linePt2);
assert.strictEqual(v2, v1);
assertCloseEnough(v1.x, -1);
assertCloseEnough(v1.y, 1);
});
it("set", function() {
var v1 = v(1, 2);
v1.set(3, 4);
assert.strictEqual(v1.x, 3);
assert.strictEqual(v1.y, 4);
});
});
function assertCloseEnough(a, b) {
assert.ok(Math.abs(a - b) < EPSILON);
}