WebWorldWind/test/geom/Matrix.test.js
2020-08-12 17:28:51 -05:00

1302 lines
57 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright 2003-2006, 2009, 2017, 2020 United States Government, as represented
* by the Administrator of the National Aeronautics and Space Administration.
* All rights reserved.
*
* The NASAWorldWind/WebWorldWind platform is licensed under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License
* at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* NASAWorldWind/WebWorldWind also contains the following 3rd party Open Source
* software:
*
* ES6-Promise under MIT License
* libtess.js SGI Free Software License B
* Proj4 under MIT License
* JSZip under MIT License
*
* A complete listing of 3rd Party software notices and licenses included in
* WebWorldWind can be found in the WebWorldWind 3rd-party notices and licenses
* PDF found in code directory.
*/
define([
'src/geom/Matrix',
'src/geom/Angle',
'src/globe/Globe',
'src/globe/EarthElevationModel',
'src/globe/ElevationModel',
'src/geom/Plane',
'src/geom/Rectangle',
'src/geom/Vec3'
], function (Matrix, Angle, Globe, EarthElevationModel, ElevationModel, Plane, Rectangle, Vec3) {
"use strict";
describe("Matrix Tests", function () {
it("Should construct a matrix correctly", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
for (var i = 0; i < 16; i++) {
expect(matrix[i]).toEqual(i);
}
});
it("Should create an identity Matrix", function () {
var identity = Matrix.fromIdentity();
for (var i = 0; i < 16; i++) {
if (i % 5 == 0)
expect(identity[i]).toEqual(1);
else
expect(identity[i]).toEqual(0);
}
});
describe("Computes the principal axes of a point collection expressed in a typed array", function () {
var axis1 = new Vec3(1, 0, 0), axis2 = new Vec3(0, 1, 0), axis3 = new Vec3(0, 0, 1);
var points = new Float32Array(48);
it("Computes axes correctly", function () {
for (var i = 4; i < 48; i++) {
points[i] = i * 1000 * Math.PI;
}
Matrix.principalAxesFromPoints(points, axis1, axis2, axis3);
expect(axis1[0]).toBeCloseTo(0.580, 2);
expect(axis1[1]).toBeCloseTo(0.573, 2);
expect(axis1[2]).toBeCloseTo(0.577, 2);
expect(axis2[0]).toBeCloseTo(-0.805, 2);
expect(axis2[1]).toBeCloseTo(0.303, 2);
expect(axis2[2]).toBeCloseTo(0.508, 2);
expect(axis3[0]).toBeCloseTo(0.116, 2);
expect(axis3[1]).toBeCloseTo(-0.760, 2);
expect(axis3[2]).toBeCloseTo(0.638, 2);
});
it("Should throw an exception on missing points", function () {
expect(function () {
Matrix.principalAxesFromPoints(null, axis1, axis2, axis3);
}).toThrow();
});
it("Should throw an exception on missing axis 1", function () {
expect(function () {
Matrix.principalAxesFromPoints(points, null, axis2, axis3);
}).toThrow();
});
it("Should throw an exception on missing axis 2", function () {
expect(function () {
Matrix.principalAxesFromPoints(points, axis1, null, axis3);
}).toThrow();
});
it("Should throw an exception on missing axis 3", function () {
expect(function () {
Matrix.principalAxesFromPoints(points, axis1, axis2, null);
}).toThrow();
});
});
it("Sets the components of a matrix to specified values", function () {
var matrix = new Matrix.fromIdentity();
matrix.set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
for (var i = 0; i < 16; i++) {
expect(matrix[i]).toEqual(i);
}
});
it("Sets a matrix to the identity one", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
matrix.setToIdentity();
for (var i = 0; i < 16; i++) {
if (i % 5 == 0)
expect(matrix[i]).toEqual(1);
else
expect(matrix[i]).toEqual(0);
}
});
describe("Copies the components of a specified matrix to this matrix", function () {
it("Copies successfully", function () {
var matrixA = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var matrixB = new Matrix(15, 14, 13, 12, 11, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
matrixB.copy(matrixA);
expect(matrixB).toEqual(matrixA);
});
it("Should throw an exception on missing target matrix", function () {
expect(function () {
var matrix = Matrix.fromIdentity();
matrix.copy(null);
}).toThrow();
});
});
describe("Indicates whether the components of two matrices are equal", function () {
it("Equal matrices", function () {
var matrixA = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var matrixB = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
expect(matrixA.equals(matrixB)).toBe(true);
});
it("Not equal matrices", function () {
var matrixA = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var matrixB = new Matrix(15, 14, 13, 12, 11, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
expect(matrixA.equals(matrixB)).toBe(false);
});
});
describe("Stores this matrix's components in column-major order in a specified array", function () {
it("Equal matrices", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var result = new Array(16);
matrix.columnMajorComponents(result);
expect(result).toEqual([0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15]);
});
it("Should throw an exception on missing result", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
matrix.columnMajorComponents(null);
}).toThrow();
});
});
it("Sets a matrix to a translation matrix with specified components", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
matrix.setToTranslation(2, 4, 6);
expect(matrix[0]).toEqual(1);
expect(matrix[1]).toEqual(0);
expect(matrix[2]).toEqual(0);
expect(matrix[3]).toEqual(2);
expect(matrix[4]).toEqual(0);
expect(matrix[5]).toEqual(1);
expect(matrix[6]).toEqual(0);
expect(matrix[7]).toEqual(4);
expect(matrix[8]).toEqual(0);
expect(matrix[9]).toEqual(0);
expect(matrix[10]).toEqual(1);
expect(matrix[11]).toEqual(6);
expect(matrix[12]).toEqual(0);
expect(matrix[13]).toEqual(0);
expect(matrix[14]).toEqual(0);
expect(matrix[15]).toEqual(1);
});
it("Sets the translation components of a matrix to specified values", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
matrix.setTranslation(2, 4, 6);
expect(matrix[3]).toEqual(2);
expect(matrix[7]).toEqual(4);
expect(matrix[11]).toEqual(6);
});
it("Sets this matrix to a scale matrix with specified scale components", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
matrix.setToScale(2, 4, 6);
expect(matrix[0]).toEqual(2);
expect(matrix[5]).toEqual(4);
expect(matrix[10]).toEqual(6);
expect(matrix[1]).toEqual(0);
expect(matrix[2]).toEqual(0);
expect(matrix[3]).toEqual(0);
expect(matrix[4]).toEqual(0);
expect(matrix[6]).toEqual(0);
expect(matrix[7]).toEqual(0);
expect(matrix[8]).toEqual(0);
expect(matrix[9]).toEqual(0);
expect(matrix[11]).toEqual(0);
expect(matrix[12]).toEqual(0);
expect(matrix[13]).toEqual(0);
expect(matrix[14]).toEqual(0);
expect(matrix[15]).toEqual(1);
});
it("Sets the scale components of a matrix to specified values", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
matrix.setScale(2, 4, 6);
expect(matrix[0]).toEqual(2);
expect(matrix[5]).toEqual(4);
expect(matrix[10]).toEqual(6);
});
describe("Sets this matrix to the transpose of a specified matrix", function () {
it("Set matrix to the transpose of the matrix", function () {
var matrixA = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var matrixB = new Matrix(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
matrixA.setToTransposeOfMatrix(matrixB);
expect(matrixA[0]).toEqual(matrixB[0]);
expect(matrixA[1]).toEqual(matrixB[4]);
expect(matrixA[2]).toEqual(matrixB[8]);
expect(matrixA[3]).toEqual(matrixB[12]);
expect(matrixA[4]).toEqual(matrixB[1]);
expect(matrixA[5]).toEqual(matrixB[5]);
expect(matrixA[6]).toEqual(matrixB[9]);
expect(matrixA[7]).toEqual(matrixB[13]);
expect(matrixA[8]).toEqual(matrixB[2]);
expect(matrixA[9]).toEqual(matrixB[6]);
expect(matrixA[10]).toEqual(matrixB[10]);
expect(matrixA[11]).toEqual(matrixB[14]);
expect(matrixA[12]).toEqual(matrixB[3]);
expect(matrixA[13]).toEqual(matrixB[7]);
expect(matrixA[14]).toEqual(matrixB[11]);
expect(matrixA[15]).toEqual(matrixB[15]);
});
it("Should throw an exception on missing target", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
matrix.setToTransposeOfMatrix(null);
}).toThrow();
});
});
describe("Sets this matrix to the matrix product of two specified matrices", function () {
it("Sets the matrix correctly", function () {
var targetMatrix = new Matrix();
var matrixA = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var matrixB = new Matrix(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
targetMatrix.setToMultiply(matrixA, matrixB);
expect(targetMatrix[0]).toEqual(34);
expect(targetMatrix[1]).toEqual(28);
expect(targetMatrix[2]).toEqual(22);
expect(targetMatrix[3]).toEqual(16);
expect(targetMatrix[4]).toEqual(178);
expect(targetMatrix[5]).toEqual(156);
expect(targetMatrix[6]).toEqual(134);
expect(targetMatrix[7]).toEqual(112);
expect(targetMatrix[8]).toEqual(322);
expect(targetMatrix[9]).toEqual(284);
expect(targetMatrix[10]).toEqual(246);
expect(targetMatrix[11]).toEqual(208);
expect(targetMatrix[12]).toEqual(466);
expect(targetMatrix[13]).toEqual(412);
expect(targetMatrix[14]).toEqual(358);
expect(targetMatrix[15]).toEqual(304);
});
describe("Exceptions", function () {
it("Missing matrix A", function () {
expect(function () {
var targetMatrix = new Matrix();
var matrixB = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
targetMatrix.setToMultiply(null, matrixB);
}).toThrow();
});
it("Missing matrix B", function () {
expect(function () {
var targetMatrix = new Matrix();
var matrixA = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
targetMatrix.setToMultiply(matrixA, null);
}).toThrow();
});
});
});
describe("Sets this matrix to the symmetric covariance Matrix computed from a point array", function () {
it("Sets the matrix correctly", function () {
var targetMatrix = new Matrix();
targetMatrix.setToCovarianceOfPoints([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]);
expect(targetMatrix[0]).toEqual(26.25);
expect(targetMatrix[1]).toEqual(26.25);
expect(targetMatrix[2]).toEqual(26.25);
expect(targetMatrix[3]).toEqual(0);
expect(targetMatrix[4]).toEqual(26.25);
expect(targetMatrix[5]).toEqual(26.25);
expect(targetMatrix[6]).toEqual(26.25);
expect(targetMatrix[7]).toEqual(0);
expect(targetMatrix[8]).toEqual(26.25);
expect(targetMatrix[9]).toEqual(26.25);
expect(targetMatrix[10]).toEqual(26.25);
expect(targetMatrix[11]).toEqual(0);
expect(targetMatrix[12]).toEqual(0);
expect(targetMatrix[13]).toEqual(0);
expect(targetMatrix[14]).toEqual(0);
expect(targetMatrix[15]).toEqual(0);
});
it("Should throw an exception on missing points", function () {
expect(function () {
var targetMatrix = new Matrix();
targetMatrix.setToCovarianceOfPoints(null);
}).toThrow();
});
});
it("Multiplies this matrix by a translation matrix with specified translation values", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
matrix.multiplyByTranslation(2, 4, 6);
expect(matrix[0]).toEqual(0);
expect(matrix[1]).toEqual(1);
expect(matrix[2]).toEqual(2);
expect(matrix[3]).toEqual(19);
expect(matrix[4]).toEqual(4);
expect(matrix[5]).toEqual(5);
expect(matrix[6]).toEqual(6);
expect(matrix[7]).toEqual(71);
expect(matrix[8]).toEqual(8);
expect(matrix[9]).toEqual(9);
expect(matrix[10]).toEqual(10);
expect(matrix[11]).toEqual(123);
expect(matrix[12]).toEqual(12);
expect(matrix[13]).toEqual(13);
expect(matrix[14]).toEqual(14);
expect(matrix[15]).toEqual(175);
});
it("Multiplies this matrix by a rotation matrix about a specified axis and angle", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
matrix.multiplyByRotation(2, 4, 6, 90);
expect(matrix[0]).toBeCloseTo(30);
expect(matrix[1]).toBeCloseTo(68);
expect(matrix[2]).toBeCloseTo(94);
expect(matrix[3]).toBeCloseTo(3);
expect(matrix[4]).toBeCloseTo(134);
expect(matrix[5]).toBeCloseTo(244);
expect(matrix[6]).toBeCloseTo(390);
expect(matrix[7]).toBeCloseTo(7);
expect(matrix[8]).toBeCloseTo(238);
expect(matrix[9]).toBeCloseTo(420);
expect(matrix[10]).toBeCloseTo(686);
expect(matrix[11]).toBeCloseTo(11);
expect(matrix[12]).toBeCloseTo(342);
expect(matrix[13]).toBeCloseTo(596);
expect(matrix[14]).toBeCloseTo(982);
expect(matrix[15]).toBeCloseTo(15);
});
it("Multiplies this matrix by a scale matrix with specified values", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
matrix.multiplyByScale(2, 4, 6);
expect(matrix[0]).toEqual(0);
expect(matrix[1]).toEqual(4);
expect(matrix[2]).toEqual(12);
expect(matrix[3]).toEqual(3);
expect(matrix[4]).toEqual(8);
expect(matrix[5]).toEqual(20);
expect(matrix[6]).toEqual(36);
expect(matrix[7]).toEqual(7);
expect(matrix[8]).toEqual(16);
expect(matrix[9]).toEqual(36);
expect(matrix[10]).toEqual(60);
expect(matrix[11]).toEqual(11);
expect(matrix[12]).toEqual(24);
expect(matrix[13]).toEqual(52);
expect(matrix[14]).toEqual(84);
expect(matrix[15]).toEqual(15);
});
it("Sets this matrix to one that flips and shifts the y-axis", function () {
var matrix = new Matrix();
matrix.setToUnitYFlip();
expect(matrix[0]).toEqual(1);
expect(matrix[1]).toEqual(0);
expect(matrix[2]).toEqual(0);
expect(matrix[3]).toEqual(0);
expect(matrix[4]).toEqual(0);
expect(matrix[5]).toEqual(-1);
expect(matrix[6]).toEqual(0);
expect(matrix[7]).toEqual(1);
expect(matrix[8]).toEqual(0);
expect(matrix[9]).toEqual(0);
expect(matrix[10]).toEqual(1);
expect(matrix[11]).toEqual(0);
expect(matrix[12]).toEqual(0);
expect(matrix[13]).toEqual(0);
expect(matrix[14]).toEqual(0);
expect(matrix[15]).toEqual(1);
});
describe("Multiplies this matrix by a local coordinate system transform", function () {
it("Multiplies the matrix correctly", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var origin = new Vec3(37, 15, 10e2);
var globe = new Globe(new EarthElevationModel());
matrix.multiplyByLocalCoordinateTransform(origin, globe);
expect(matrix[0]).toBeCloseTo(-0.073);
expect(matrix[1]).toBeCloseTo(0.969);
expect(matrix[2]).toBeCloseTo(2.013);
expect(matrix[3]).toBeCloseTo(2018);
expect(matrix[4]).toBeCloseTo(3.775);
expect(matrix[5]).toBeCloseTo(4.906);
expect(matrix[6]).toBeCloseTo(6.218);
expect(matrix[7]).toBeCloseTo(6230);
expect(matrix[8]).toBeCloseTo(7.624);
expect(matrix[9]).toBeCloseTo(8.843);
expect(matrix[10]).toBeCloseTo(10.423);
expect(matrix[11]).toBeCloseTo(10442);
expect(matrix[12]).toBeCloseTo(11.474);
expect(matrix[13]).toBeCloseTo(12.780);
expect(matrix[14]).toBeCloseTo(14.628);
expect(matrix[15]).toBeCloseTo(14654);
});
describe("Exceptions", function () {
it("Missing origin", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var globe = new Globe(new EarthElevationModel());
matrix.multiplyByLocalCoordinateTransform(null, globe);
}).toThrow();
});
it("Missing globe", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var origin = new Vec3(37, 15, 10e2);
matrix.multiplyByLocalCoordinateTransform(origin, null);
}).toThrow();
});
});
});
describe("Multiplies this matrix by a texture transform for the specified texture", function () {
it("Multiplies the matrix correctly", function () {
var targetMatrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var texture = {
originalImageWidth: 500,
imageWidth: 100,
originalImageHeight: 550,
imageHeight: 50
};
targetMatrix.multiplyByTextureTransform(texture);
expect(targetMatrix[0]).toEqual(0);
expect(targetMatrix[1]).toEqual(-11);
expect(targetMatrix[2]).toEqual(2);
expect(targetMatrix[3]).toEqual(14);
expect(targetMatrix[4]).toEqual(20);
expect(targetMatrix[5]).toEqual(-55);
expect(targetMatrix[6]).toEqual(6);
expect(targetMatrix[7]).toEqual(62);
expect(targetMatrix[8]).toEqual(40);
expect(targetMatrix[9]).toEqual(-99);
expect(targetMatrix[10]).toEqual(10);
expect(targetMatrix[11]).toEqual(110);
expect(targetMatrix[12]).toEqual(60);
expect(targetMatrix[13]).toEqual(-143);
expect(targetMatrix[14]).toEqual(14);
expect(targetMatrix[15]).toEqual(158);
});
it("Should throw an exception on missing texture", function () {
expect(function () {
var targetMatrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
targetMatrix.multiplyByTextureTransform(null);
}).toThrow();
});
});
describe("Returns the rotation angles of this matrix", function () {
it("Multiplies the matrix correctly", function () {
var targetMatrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var result = new Vec3();
targetMatrix.extractRotationAngles(result);
expect(result[0]).toBeCloseTo(30.963);
expect(result[1]).toBeCloseTo(-63.434);
expect(result[2]).toBeCloseTo(116.565);
});
it("Should throw an exception on missing result", function () {
expect(function () {
var targetMatrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
targetMatrix.extractRotationAngles(null);
}).toThrow();
});
});
describe("Multiplies this matrix by a first person viewing matrix for the specified globe", function () {
// it("Multiplies the matrix correctly", function () {
// var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
// var position = {latitude: 37, longitude: 15, altitude: 3e10};
// var heading = 20;
// var tilt = 40;
// var roll = 60;
// var globe = new Globe(new EarthElevationModel());
// matrix.multiplyByFirstPersonModelview(position, heading, tilt, roll, globe);
//
// expect(matrix[0]).toBeCloseTo(-0.615);
// expect(matrix[1]).toBeCloseTo(0.680);
// expect(matrix[2]).toBeCloseTo(2.039);
// expect(matrix[3]).toBeCloseTo(-55669512258.133);
// expect(matrix[4]).toBeCloseTo(-0.370);
// expect(matrix[5]).toBeCloseTo(6.262);
// expect(matrix[6]).toBeCloseTo(6.134);
// expect(matrix[7]).toBeCloseTo(-252807751836.434);
// expect(matrix[8]).toBeCloseTo(-0.126);
// expect(matrix[9]).toBeCloseTo(11.845);
// expect(matrix[10]).toBeCloseTo(10.230);
// expect(matrix[11]).toBeCloseTo(-449945991414.735);
// expect(matrix[12]).toBeCloseTo(0.118);
// expect(matrix[13]).toBeCloseTo(17.427);
// expect(matrix[14]).toBeCloseTo(14.326);
// expect(matrix[15]).toBeCloseTo(-647084230993.036);
// });
describe("Exceptions", function () {
it("Missing eye position", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var globe = new Globe(new EarthElevationModel());
var heading = 20;
var tilt = 40;
var roll = 60;
matrix.multiplyByFirstPersonModelview(null, heading, tilt, roll, globe);
}).toThrow();
});
it("Missing globe", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var position = {latitude: 37, longitude: 15, altitude: 3e10};
var heading = 20;
var tilt = 40;
var roll = 60;
matrix.multiplyByFirstPersonModelview(position, heading, tilt, roll, null);
}).toThrow();
});
});
describe("Multiplies this matrix by a look at viewing matrix for the specified globe", function () {
// it("Multiplies the matrix correctly", function () {
// var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
// var position = {latitude: 37, longitude: 15, altitude: 3e10};
// var range = 100;
// var heading = 20;
// var tilt = 40;
// var roll = 60;
// var globe = new Globe(new EarthElevationModel());
// matrix.multiplyByLookAtModelview(position, range, heading, tilt, roll, globe);
//
// expect(matrix[0]).toBeCloseTo(-0.615);
// expect(matrix[1]).toBeCloseTo(0.680);
// expect(matrix[2]).toBeCloseTo(2.039);
// expect(matrix[3]).toBeCloseTo(-55669512458.133);
// expect(matrix[4]).toBeCloseTo(-0.370);
// expect(matrix[5]).toBeCloseTo(6.262);
// expect(matrix[6]).toBeCloseTo(6.134);
// expect(matrix[7]).toBeCloseTo(-252807752436.434);
// expect(matrix[8]).toBeCloseTo(-0.126);
// expect(matrix[9]).toBeCloseTo(11.845);
// expect(matrix[10]).toBeCloseTo(10.230);
// expect(matrix[11]).toBeCloseTo(-449945992414.735);
// expect(matrix[12]).toBeCloseTo(0.118);
// expect(matrix[13]).toBeCloseTo(17.427);
// expect(matrix[14]).toBeCloseTo(14.326);
// expect(matrix[15]).toBeCloseTo(-647084232393.036);
// });
describe("Exceptions", function () {
it("Missing look-at-position", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var globe = new Globe(new EarthElevationModel());
var range = 100;
var heading = 20;
var tilt = 40;
var roll = 60;
matrix.multiplyByLookAtModelview(null, range, heading, tilt, roll, globe);
}).toThrow();
});
it("Range less than 0", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var position = {latitude: 37, longitude: 15, altitude: 3e10};
var range = -20;
var globe = new Globe(new EarthElevationModel());
var heading = 20;
var tilt = 40;
var roll = 60;
matrix.multiplyByLookAtModelview(position, range, heading, tilt, roll, globe);
}).toThrow();
});
it("Missing globe", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var position = {latitude: 37, longitude: 15, altitude: 3e10};
var range = 100;
var heading = 20;
var tilt = 40;
var roll = 60;
matrix.multiplyByLookAtModelview(position, range, heading, tilt, roll, null);
}).toThrow();
});
});
});
});
describe("Multiplies this matrix by a look at viewing matrix for the specified globe", function () {
// it("Multiplies the matrix correctly", function () {
// var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
// var position = {latitude: 37, longitude: 15, altitude: 3e10};
// var range = 100;
// var heading = 20;
// var tilt = 40;
// var roll = 60;
// var globe = new Globe(new EarthElevationModel());
// matrix.multiplyByLookAtModelview(position, range, heading, tilt, roll, globe);
//
// expect(matrix[0]).toBeCloseTo(-0.615);
// expect(matrix[1]).toBeCloseTo(0.680);
// expect(matrix[2]).toBeCloseTo(2.039);
// expect(matrix[3]).toBeCloseTo(-55669512458.133);
// expect(matrix[4]).toBeCloseTo(-0.370);
// expect(matrix[5]).toBeCloseTo(6.262);
// expect(matrix[6]).toBeCloseTo(6.134);
// expect(matrix[7]).toBeCloseTo(-252807752436.434);
// expect(matrix[8]).toBeCloseTo(-0.126);
// expect(matrix[9]).toBeCloseTo(11.845);
// expect(matrix[10]).toBeCloseTo(10.230);
// expect(matrix[11]).toBeCloseTo(-449945992414.735);
// expect(matrix[12]).toBeCloseTo(0.118);
// expect(matrix[13]).toBeCloseTo(17.427);
// expect(matrix[14]).toBeCloseTo(14.326);
// expect(matrix[15]).toBeCloseTo(-647084232393.036);
// });
describe("Exceptions", function () {
it("Missing look-at-position", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var globe = new Globe(new EarthElevationModel());
var range = 100;
var heading = 20;
var tilt = 40;
var roll = 60;
matrix.multiplyByLookAtModelview(null, range, heading, tilt, roll, globe);
}).toThrow();
});
it("Range less than 0", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var position = {latitude: 37, longitude: 15, altitude: 3e10};
var range = -20;
var globe = new Globe(new EarthElevationModel());
var heading = 20;
var tilt = 40;
var roll = 60;
matrix.multiplyByLookAtModelview(position, range, heading, tilt, roll, globe);
}).toThrow();
});
it("Missing globe", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var position = {latitude: 37, longitude: 15, altitude: 3e10};
var range = 100;
var heading = 20;
var tilt = 40;
var roll = 60;
matrix.multiplyByLookAtModelview(position, range, heading, tilt, roll, null);
}).toThrow();
});
});
});
describe("Sets this matrix to a perspective projection matrix", function () {
it("Sets the matrix correctly", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var viewportWidth = 500;
var viewportHeight = 400;
var nearDistance = 120;
var farDistance = 600;
matrix.setToPerspectiveProjection(viewportWidth, viewportHeight, nearDistance, farDistance);
expect(matrix[0]).toEqual(2);
expect(matrix[1]).toEqual(0);
expect(matrix[2]).toEqual(0);
expect(matrix[3]).toEqual(0);
expect(matrix[4]).toEqual(0);
expect(matrix[5]).toEqual(2.5);
expect(matrix[6]).toEqual(0);
expect(matrix[7]).toEqual(0);
expect(matrix[8]).toEqual(0);
expect(matrix[9]).toEqual(0);
expect(matrix[10]).toEqual(-1.5);
expect(matrix[11]).toEqual(-300);
expect(matrix[12]).toEqual(0);
expect(matrix[13]).toEqual(0);
expect(matrix[14]).toEqual(-1);
expect(matrix[15]).toEqual(0);
});
describe("Exceptions", function () {
it("Negative viewport width", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var viewportWidth = -500;
var viewportHeight = 400;
var nearDistance = 120;
var farDistance = 600;
matrix.setToPerspectiveProjection(viewportWidth, viewportHeight, nearDistance, farDistance);
}).toThrow();
});
it("Negative viewport height", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var viewportWidth = 500;
var viewportHeight = -400;
var nearDistance = 120;
var farDistance = 600;
matrix.setToPerspectiveProjection(viewportWidth, viewportHeight, nearDistance, farDistance);
}).toThrow();
});
it("Near distance equal to far distance", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var viewportWidth = 500;
var viewportHeight = 400;
var nearDistance = 120;
var farDistance = nearDistance;
matrix.setToPerspectiveProjection(viewportWidth, viewportHeight, nearDistance, farDistance);
}).toThrow();
});
it("Near distance negative", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var viewportWidth = 500;
var viewportHeight = 400;
var nearDistance = -120;
var farDistance = 600;
matrix.setToPerspectiveProjection(viewportWidth, viewportHeight, nearDistance, farDistance);
}).toThrow();
});
it("Far distance negative", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var viewportWidth = 500;
var viewportHeight = 400;
var nearDistance = 120;
var farDistance = -600;
matrix.setToPerspectiveProjection(viewportWidth, viewportHeight, nearDistance, farDistance);
}).toThrow();
});
});
});
describe("Sets this matrix to a screen projection matrix", function () {
it("Sets the matrix correctly", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var viewportWidth = 500;
var viewportHeight = 400;
matrix.setToScreenProjection(viewportWidth, viewportHeight);
expect(matrix[0]).toEqual(0.004);
expect(matrix[1]).toEqual(0);
expect(matrix[2]).toEqual(0);
expect(matrix[3]).toEqual(-1);
expect(matrix[4]).toEqual(0);
expect(matrix[5]).toEqual(0.005);
expect(matrix[6]).toEqual(0);
expect(matrix[7]).toEqual(-1);
expect(matrix[8]).toEqual(0);
expect(matrix[9]).toEqual(0);
expect(matrix[10]).toEqual(2);
expect(matrix[11]).toEqual(-1);
expect(matrix[12]).toEqual(0);
expect(matrix[13]).toEqual(0);
expect(matrix[14]).toEqual(0);
expect(matrix[15]).toEqual(1);
});
describe("Exceptions", function () {
it("Negative viewport width", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var viewportWidth = -500;
var viewportHeight = 400;
matrix.setToScreenProjection(viewportWidth, viewportHeight);
}).toThrow();
});
it("Negative viewport height", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var viewportWidth = 500;
var viewportHeight = -400;
matrix.setToScreenProjection(viewportWidth, viewportHeight);
}).toThrow();
});
});
});
describe("Returns this viewing matrix's eye point", function () {
it("Returns the eye point correctly", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var result = new Vec3();
matrix.extractEyePoint(result);
expect(result).toEqual(new Vec3(-116, -137, -158));
});
it("Missing result", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var result = null;
matrix.extractEyePoint(result);
}).toThrow();
});
});
describe("Returns this viewing matrix's forward vector", function () {
it("Returns the vector correctly", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var result = new Vec3();
matrix.extractForwardVector(result);
expect(result).toEqual(new Vec3(-8, -9, -10));
});
it("Missing result", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var result = null;
matrix.extractForwardVector(result);
}).toThrow();
});
});
describe("Extracts this viewing matrix's parameters given a viewing origin and a globe", function () {
it("Extracts the parameters correctly", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var origin = new Vec3(2, 4, 6);
var roll = 60;
var globe = new Globe(new EarthElevationModel());
var result = {};
matrix.extractViewingParameters(origin, roll, globe, result);
expect(result.origin.latitude).toBeCloseTo(89.991);
expect(result.origin.longitude).toBeCloseTo(18.434);
expect(result.origin.altitude).toBeCloseTo(-6356748.313);
expect(result.range).toEqual(-123);
expect(result.heading).toBeCloseTo(165.563);
expect(result.tilt).toBeCloseTo(30.496);
expect(result.roll).toEqual(60);
});
describe("Exceptions", function () {
it("Missing origin", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var origin = null;
var roll = 60;
var globe = new Globe(new EarthElevationModel());
var result = {};
matrix.extractViewingParameters(origin, roll, globe, result);
}).toThrow();
});
it("Missing globe", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var origin = new Vec3(2, 4, 6);
var roll = 60;
var globe = null;
var result = {};
matrix.extractViewingParameters(origin, roll, globe, result);
}).toThrow();
});
it("Missing result", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var origin = new Vec3(2, 4, 6);
var roll = 60;
var globe = new Globe(new EarthElevationModel());
var result = null;
matrix.extractViewingParameters(origin, roll, globe, result);
}).toThrow();
});
});
});
it("Applies a specified depth offset to this projection matrix", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var depthOffset = 15;
matrix.offsetProjectionDepth(depthOffset);
expect(matrix[0]).toEqual(0);
expect(matrix[1]).toEqual(1);
expect(matrix[2]).toEqual(2);
expect(matrix[3]).toEqual(3);
expect(matrix[4]).toEqual(4);
expect(matrix[5]).toEqual(5);
expect(matrix[6]).toEqual(6);
expect(matrix[7]).toEqual(7);
expect(matrix[8]).toEqual(8);
expect(matrix[9]).toEqual(9);
expect(matrix[10]).toEqual(160);
expect(matrix[11]).toEqual(11);
expect(matrix[12]).toEqual(12);
expect(matrix[13]).toEqual(13);
expect(matrix[14]).toEqual(14);
expect(matrix[15]).toEqual(15);
});
describe("Multiplies this matrix by a specified matrix", function () {
it("Multiplies the matrix", function () {
var matrixA = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var matrixB = new Matrix(16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31);
matrixA.multiplyMatrix(matrixB);
expect(matrixA[0]).toEqual(152);
expect(matrixA[1]).toEqual(158);
expect(matrixA[2]).toEqual(164);
expect(matrixA[3]).toEqual(170);
expect(matrixA[4]).toEqual(504);
expect(matrixA[5]).toEqual(526);
expect(matrixA[6]).toEqual(548);
expect(matrixA[7]).toEqual(570);
expect(matrixA[8]).toEqual(856);
expect(matrixA[9]).toEqual(894);
expect(matrixA[10]).toEqual(932);
expect(matrixA[11]).toEqual(970);
expect(matrixA[12]).toEqual(1208);
expect(matrixA[13]).toEqual(1262);
expect(matrixA[14]).toEqual(1316);
expect(matrixA[15]).toEqual(1370);
});
it("Missing multiplier matrix", function () {
expect(function () {
var matrixA = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var matrixB = null;
matrixA.multiplyMatrix(matrixB);
}).toThrow();
});
});
it("Multiplies this matrix by a matrix specified by individual components", function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
matrix.multiply(16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31);
expect(matrix[0]).toEqual(152);
expect(matrix[1]).toEqual(158);
expect(matrix[2]).toEqual(164);
expect(matrix[3]).toEqual(170);
expect(matrix[4]).toEqual(504);
expect(matrix[5]).toEqual(526);
expect(matrix[6]).toEqual(548);
expect(matrix[7]).toEqual(570);
expect(matrix[8]).toEqual(856);
expect(matrix[9]).toEqual(894);
expect(matrix[10]).toEqual(932);
expect(matrix[11]).toEqual(970);
expect(matrix[12]).toEqual(1208);
expect(matrix[13]).toEqual(1262);
expect(matrix[14]).toEqual(1316);
expect(matrix[15]).toEqual(1370);
});
describe("Inverts the specified matrix and stores the result in this matrix", function () {
it("Multiplies the matrix", function () {
var matrixA = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var matrixB = new Matrix(16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31);
matrixA.invertMatrix(matrixB);
expect(matrixA[0]).toEqual(0);
expect(matrixA[1]).toEqual(1);
expect(matrixA[2]).toEqual(2);
expect(matrixA[3]).toEqual(3);
expect(matrixA[4]).toEqual(4);
expect(matrixA[5]).toEqual(5);
expect(matrixA[6]).toEqual(6);
expect(matrixA[7]).toEqual(7);
expect(matrixA[8]).toEqual(8);
expect(matrixA[9]).toEqual(9);
expect(matrixA[10]).toEqual(10);
expect(matrixA[11]).toEqual(11);
expect(matrixA[12]).toEqual(12);
expect(matrixA[13]).toEqual(13);
expect(matrixA[14]).toEqual(14);
expect(matrixA[15]).toEqual(15);
});
it("Should return null on singular matrix", function () {
var matrixA = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var matrixB = new Matrix(16, 2, 3, 13, 5, 11, 10, 8, 9, 7, 6, 12, 4, 14, 15, 1);
var result = matrixA.invertMatrix(matrixB);
expect(result).toEqual(null);
});
it("Missing multiplier matrix", function () {
expect(function () {
var matrixA = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var matrixB = null;
matrixA.invertMatrix(matrixB);
}).toThrow();
});
});
describe("Inverts an orthonormal matrix and stores the result in this matrix", function () {
it("Multiplies the matrix", function () {
var matrixA = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var matrixB = new Matrix(16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31);
matrixA.invertOrthonormalMatrix(matrixB);
expect(matrixA[0]).toEqual(16);
expect(matrixA[1]).toEqual(20);
expect(matrixA[2]).toEqual(24);
expect(matrixA[3]).toEqual(-1412);
expect(matrixA[4]).toEqual(17);
expect(matrixA[5]).toEqual(21);
expect(matrixA[6]).toEqual(25);
expect(matrixA[7]).toEqual(-1481);
expect(matrixA[8]).toEqual(18);
expect(matrixA[9]).toEqual(22);
expect(matrixA[10]).toEqual(26);
expect(matrixA[11]).toEqual(-1550);
expect(matrixA[12]).toEqual(0);
expect(matrixA[13]).toEqual(0);
expect(matrixA[14]).toEqual(0);
expect(matrixA[15]).toEqual(1);
});
it("Missing multiplier matrix", function () {
expect(function () {
var matrixA = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var matrixB = null;
matrixA.invertOrthonormalMatrix(matrixB);
}).toThrow();
});
});
describe("Computes the eigenvectors of this matrix", function () {
it("Extracts the parameters correctly", function () {
var matrix = new Matrix(1, 2, 3, 4, 2, 5, 6, 7, 3, 6, 8, 9, 4, 7, 9, 10);
var result1 = new Vec3(0, 0, 0);
var result2 = new Vec3(0, 0, 0);
var result3 = new Vec3(0, 0, 0);
matrix.eigensystemFromSymmetricMatrix(result1, result2, result3);
expect(result1[0]).toBeCloseTo(3.733);
expect(result1[1]).toBeCloseTo(8.054);
expect(result1[2]).toBeCloseTo(10.438);
expect(result2[0]).toBeCloseTo(-0.210);
expect(result2[1]).toBeCloseTo(0.354);
expect(result2[2]).toBeCloseTo(-0.197);
expect(result3[0]).toBeCloseTo(-0.134);
expect(result3[1]).toBeCloseTo(-0.037);
expect(result3[2]).toBeCloseTo(0.076);
});
describe("Exceptions", function () {
it("Matrix not symmetric", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var result1 = new Vec3(0, 0, 0);
var result2 = new Vec3(0, 0, 0);
var result3 = new Vec3(0, 0, 0);
matrix.eigensystemFromSymmetricMatrix(result1, result2, result3);
}).toThrow();
});
it("Missing result1", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var result1 = null;
var result2 = new Vec3(0, 0, 0);
var result3 = new Vec3(0, 0, 0);
matrix.eigensystemFromSymmetricMatrix(result1, result2, result3);
}).toThrow();
});
it("Missing result2", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var result1 = new Vec3(0, 0, 0);
var result2 = null;
var result3 = new Vec3(0, 0, 0);
matrix.eigensystemFromSymmetricMatrix(result1, result2, result3);
}).toThrow();
});
it("Missing result3", function () {
expect(function () {
var matrix = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var result1 = new Vec3(0, 0, 0);
var result2 = new Vec3(0, 0, 0);
var result3 = null;
matrix.eigensystemFromSymmetricMatrix(result1, result2, result3);
}).toThrow();
});
});
});
it("Extracts and returns a new upper-3x3 matrix", function () {
var matrix = new Matrix(1, 2, 3, 4, 2, 5, 6, 7, 3, 6, 8, 9, 4, 7, 9, 10);
matrix.upper3By3();
expect(matrix[0]).toEqual(1);
expect(matrix[1]).toEqual(2);
expect(matrix[2]).toEqual(3);
expect(matrix[3]).toEqual(4);
expect(matrix[4]).toEqual(2);
expect(matrix[5]).toEqual(5);
expect(matrix[6]).toEqual(6);
expect(matrix[7]).toEqual(7);
expect(matrix[8]).toEqual(3);
expect(matrix[9]).toEqual(6);
expect(matrix[10]).toEqual(8);
expect(matrix[11]).toEqual(9);
expect(matrix[12]).toEqual(4);
expect(matrix[13]).toEqual(7);
expect(matrix[14]).toEqual(9);
expect(matrix[15]).toEqual(10);
});
describe("unProject rejects null parameters", function () {
it("Should throw an exception on missing input parameter", function () {
expect(function () {
var m = Matrix.fromIdentity();
var dummyParam = "dummy";
m.unProject(null, dummyParam, dummyParam);
}).toThrow();
});
it("Should throw an exception on missing input parameter", function () {
expect(function () {
var m = Matrix.fromIdentity();
var dummyParam = "dummy";
m.unProject(dummyParam, null, dummyParam);
}).toThrow();
});
it("Should throw an exception on missing output variable", function () {
expect(function () {
var m = Matrix.fromIdentity();
var dummyParam = "dummy";
m.unProject(dummyParam, dummyParam, null);
}).toThrow();
});
});
describe("Correctly converts screen coordinates to model coordinates", function () {
it("unProjects correctly", function () {
var modelView = new Matrix(
-0.342, 0, 0.939, 2.328e-10,
0.469, 0.866, 0.171, 18504.137,
-0.813, 0.500, -0.296, -16372797.555,
0, 0, 0, 1
);
var projection = new Matrix(
2, 0, 0, 0,
0, 2, 0, 0,
0, 0, -1.196, -3254427.538,
0, 0, -1, 0
);
var modelviewProjection = Matrix.fromIdentity();
modelviewProjection.setToMultiply(projection, modelView);
var modelviewProjectionInv = Matrix.fromIdentity();
modelviewProjectionInv.invertMatrix(modelviewProjection);
var viewport = new Rectangle(0, 0, 848, 848);
var screenPoint = new Vec3(637.5, 839, 0);
var result = new Vec3(0, 0, 0);
var expectedResult = new Vec3(-11925849.053, 8054028.030, -3946244.954);
modelviewProjectionInv.unProject(screenPoint, viewport, result);
for (var i = 0; i < 3; i++) {
expect(result[i]).toBeCloseTo(expectedResult[i], 3);
}
});
});
describe("Matrix cloning", function () {
it("Correctly clones matrices", function () {
var matrixA = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
var matrixB = matrixA.clone();
expect(matrixA.equals(matrixB)).toBe(true);
});
});
});
});