mapillary-js
Version:
WebGL JavaScript library for displaying street level imagery from mapillary.com
745 lines (532 loc) • 31.5 kB
text/typescript
import {IGPano} from "../../../src/API";
import {EdgeCalculator, IPotentialEdge} from "../../../src/Edge";
import {GeoCoords, ILatLonAlt, Spatial} from "../../../src/Geo";
import {Node} from "../../../src/Graph";
import {EdgeCalculatorHelper} from "../../helper/EdgeCalculatorHelper.spec";
describe("EdgeCalculator.getPotentialEdges", () => {
let precision: number = 7;
let edgeCalculator: EdgeCalculator;
let spatial: Spatial;
let geoCoords: GeoCoords;
let helper: EdgeCalculatorHelper;
let createRotationVector: (azimuth: number, norm?: number) => number[] =
(azimuth: number, norm: number = Math.PI / 2): number[] => {
let x: number = Math.cos(azimuth);
let y: number = Math.sin(azimuth);
let r: number[] = [norm * x, norm * y, 0];
return r;
};
beforeEach(() => {
edgeCalculator = new EdgeCalculator();
spatial = new Spatial();
geoCoords = new GeoCoords();
helper = new EdgeCalculatorHelper();
});
it("should throw when node is not full", () => {
let node: Node = helper.createCoreNode("", { alt: 0, lat: 0, lon: 0 }, "");
expect(() => { edgeCalculator.getPotentialEdges(node, null, []); }).toThrowError(Error);
});
it("should return empty when node is not merged", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, [0, -Math.PI / 2, 0], 2, null, 0, 0);
let enu: number[] = [10, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [0, -Math.PI / 2, 0]);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(0);
});
it("should return a potential edge", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, [0, -Math.PI / 2, 0]);
let enu: number[] = [10, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [0, -Math.PI / 2, 0]);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.distance).toBeCloseTo(10, precision);
expect(potentialEdge.motionChange).toBeCloseTo(0, precision);
expect(potentialEdge.verticalMotion).toBeCloseTo(0, precision);
expect(potentialEdge.rotation).toBeCloseTo(0, precision);
expect(potentialEdge.worldMotionAzimuth).toBeCloseTo(0, precision);
expect(potentialEdge.directionChange).toBeCloseTo(0, precision);
expect(potentialEdge.verticalDirectionChange).toBeCloseTo(0, precision);
expect(potentialEdge.sameSequence).toBe(true);
expect(potentialEdge.sameMergeCC).toBe(true);
});
it("should handle potential edge without sequence", () => {
let key: string = "key";
let sequenceKey: string = "skey";
let edgeKey: string = "edgeKey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, [0, -Math.PI / 2, 0]);
let enu: number[] = [10, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, null, [0, -Math.PI / 2, 0]);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
});
it("should have correct distance", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, [0, -Math.PI / 2, 0]);
let enu: number[] = [3, -4, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [0, -Math.PI / 2, 0]);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.distance).toBeCloseTo(5, precision);
});
it("should have correct positive motion change", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, [0, -Math.PI / 2, 0]);
let enu: number[] = [5, 5, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [0, -Math.PI / 2, 0]);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.motionChange).toBeCloseTo(Math.PI / 4, precision);
});
it("should have correct negative motion change", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, [Math.PI / 2, 0, 0]);
let enu: number[] = [5, 5, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [Math.PI / 2, 0, 0]);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.motionChange).toBeCloseTo(-Math.PI / 4, precision);
});
it("should have correct backward motion change", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, [Math.PI / 2, 0, 0]);
let enu: number[] = [0, -10, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [Math.PI / 2, 0, 0]);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(Math.abs(potentialEdge.motionChange)).toBeCloseTo(Math.PI, precision);
});
it("should have correct positive vertical motion", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, [Math.PI / 2, 0, 0]);
let enu: number[] = [3, 4, 5];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [Math.PI / 2, 0, 0]);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.verticalMotion).toBeCloseTo(Math.PI / 4, precision);
});
it("should have correct negative vertical motion", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, [Math.PI / 2, 0, 0]);
let enu: number[] = [-3, 4, -5];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [Math.PI / 2, 0, 0]);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.verticalMotion).toBeCloseTo(-Math.PI / 4, precision);
});
it("should have correct viewing direction change", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0));
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(Math.PI / 2));
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.directionChange).toBeCloseTo(Math.PI / 2, precision);
});
it("should have correct viewing direction change", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0));
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(-Math.PI / 2));
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.directionChange).toBeCloseTo(-Math.PI / 2, precision);
});
it("should have correct viewing direction change", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(Math.PI / 4));
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(-3 * Math.PI / 4));
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(Math.abs(potentialEdge.directionChange)).toBeCloseTo(Math.PI, precision);
});
it("should have correct vertical viewing direction change", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(Math.PI / 4));
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(Math.PI / 4, Math.PI / 4));
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.verticalDirectionChange).toBeCloseTo(Math.PI / 4, precision);
});
it("should have correct vertical viewing direction change", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(Math.PI / 4, 5 * Math.PI / 12));
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(Math.PI / 4, 7 * Math.PI / 12));
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.verticalDirectionChange).toBeCloseTo(-Math.PI / 6, precision);
});
it("should have correct rotation", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(Math.PI / 2, Math.PI / 6));
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(Math.PI / 2, 2 * Math.PI / 3));
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.rotation).toBeCloseTo(Math.PI / 2, precision);
});
it("should have correct rotation", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let r1: number[] = [1 / 3, 2 / 3, -1 / 3];
let r2: number[] = [-2 / 3, -1 / 4, 1 / 6];
let theta: number = spatial.relativeRotationAngle(r1, r2);
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, r1);
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, r2);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.rotation).toBeCloseTo(theta, precision);
});
it("should have 0 world motion azimuth", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let r1: number[] = [0, 0, 0];
let r2: number[] = [0, 0, 0];
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, r1);
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, r2);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.worldMotionAzimuth).toBeCloseTo(0, precision);
});
it("should have 90 degrees world motion azimuth", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let r1: number[] = [0, 0, 0];
let r2: number[] = [0, 0, 0];
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, r1);
let enu: number[] = [0, 1, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, r2);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.worldMotionAzimuth).toBeCloseTo(Math.PI / 2, precision);
});
it("should have 180 degrees world motion azimuth", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let r1: number[] = [0, 0, 0];
let r2: number[] = [0, 0, 0];
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, r1);
let enu: number[] = [-1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, r2);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(Math.abs(potentialEdge.worldMotionAzimuth)).toBeCloseTo(Math.PI, precision);
});
it("should have minus 90 degrees world motion azimuth", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let r1: number[] = [0, 0, 0];
let r2: number[] = [0, 0, 0];
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, r1);
let enu: number[] = [0, -1, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, r2);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.worldMotionAzimuth).toBeCloseTo(-Math.PI / 2, precision);
});
it("should have 45 degress world motion azimuth", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let r1: number[] = [0, 0, 0];
let r2: number[] = [0, 0, 0];
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, r1);
let enu: number[] = [1, 1, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, r2);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.worldMotionAzimuth).toBeCloseTo(Math.PI / 4, precision);
});
it("should be same sequence", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0));
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(0));
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.sameSequence).toBe(true);
});
it("should not be same sequence", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let edgeSequenceKey: string = "edgeSkey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0));
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, edgeSequenceKey, createRotationVector(0));
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.sameSequence).toBe(false);
});
it("should be same merge cc", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let mergeCC: number = 45;
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0), mergeCC);
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(0), mergeCC);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.sameMergeCC).toBe(true);
});
it("should not be same merge cc", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let mergeCC1: number = 45;
let mergeCC2: number = 22;
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0), mergeCC1);
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(0), mergeCC2);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.sameMergeCC).toBe(false);
});
it("should be same merge cc when nonexistent", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0), null);
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(0), null);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.sameMergeCC).toBe(true);
});
it("should not be same merge cc when one is nonexistent", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0), 467);
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(0), null);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.sameMergeCC).toBe(false);
});
it("should be full pano when gpano existing and correct", () => {
let key: string = "key";
let edgeKey: string = "edgeKey";
let sequenceKey: string = "skey";
let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 };
let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0), 467);
let gpano: IGPano = {
CroppedAreaImageHeightPixels: 1,
CroppedAreaImageWidthPixels: 1,
CroppedAreaLeftPixels: 0,
CroppedAreaTopPixels: 0,
FullPanoHeightPixels: 1,
FullPanoWidthPixels: 1,
};
let enu: number[] = [1, 0, 0];
let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt);
let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] };
let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(0), 435, gpano);
let potentialEdges: IPotentialEdge[] =
edgeCalculator.getPotentialEdges(node, [edgeNode], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: IPotentialEdge = potentialEdges[0];
expect(potentialEdge.key).toBe(edgeKey);
expect(potentialEdge.fullPano).toBe(true);
});
});