mapillary-js/test/graph/edge/EdgeCalculator.test.ts
2021-04-23 22:12:39 +02:00

1341 lines
37 KiB
TypeScript

import * as GeoCoords from "../../../src/geo/GeoCoords";
import { LngLatAlt } from "../../../src/api/interfaces/LngLatAlt";
import { Spatial } from "../../../src/geo/Spatial";
import { EdgeCalculator } from "../../../src/graph/edge/EdgeCalculator";
import { PotentialEdge }
from "../../../src/graph/edge/interfaces/PotentialEdge";
import { Image } from "../../../src/graph/Image";
import { EdgeCalculatorHelper } from "../../helper/EdgeCalculatorHelper";
describe("EdgeCalculator.getPotentialEdges", () => {
let precision = 7;
let edgeCalculator: EdgeCalculator;
let spatial: Spatial;
let helper: EdgeCalculatorHelper;
let createRotationVector: (azimuth: number, norm?: number) => number[] =
(azimuth: number, norm: number = Math.PI / 2): number[] => {
let x = Math.cos(azimuth);
let y = Math.sin(azimuth);
let r = [norm * x, norm * y, 0];
return r;
};
beforeEach(() => {
edgeCalculator = new EdgeCalculator();
spatial = new Spatial();
helper = new EdgeCalculatorHelper();
});
it("should throw when image is not full", () => {
let image = helper.createCoreImage("", { alt: 0, lat: 0, lng: 0 }, "");
expect(() => { edgeCalculator.getPotentialEdges(image, null, []); }).toThrowError(Error);
});
it("should return empty when image is not merged", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
[0, -Math.PI / 2, 0],
null,
"perspective",
0);
let enu = [10, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
[0, -Math.PI / 2, 0]);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(0);
});
it("should return a potential edge", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
[0, -Math.PI / 2, 0]);
let enu = [10, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
[0, -Math.PI / 2, 0]);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).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 = "key";
let sequenceKey = "skey";
let edgeKey = "edgeKey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
[0, -Math.PI / 2, 0]);
let enu = [10, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
null,
[0, -Math.PI / 2, 0]);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
});
it("should have correct distance", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
[0, -Math.PI / 2, 0]);
let enu = [3, -4, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
[0, -Math.PI / 2, 0]);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.distance).toBeCloseTo(5, precision);
});
it("should have correct positive motion change", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
[0, -Math.PI / 2, 0]);
let enu = [5, 5, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
[0, -Math.PI / 2, 0]);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.motionChange).toBeCloseTo(Math.PI / 4, precision);
});
it("should have correct negative motion change", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
[Math.PI / 2, 0, 0]);
let enu = [5, 5, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
[Math.PI / 2, 0, 0]);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.motionChange).toBeCloseTo(-Math.PI / 4, precision);
});
it("should have correct backward motion change", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
[Math.PI / 2, 0, 0]);
let enu = [0, -10, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
[Math.PI / 2, 0, 0]);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(Math.abs(potentialEdge.motionChange))
.toBeCloseTo(Math.PI, precision);
});
it("should have correct positive vertical motion", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
[Math.PI / 2, 0, 0]);
let enu = [3, 4, 5];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
[Math.PI / 2, 0, 0]);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.verticalMotion).toBeCloseTo(Math.PI / 4, precision);
});
it("should have correct negative vertical motion", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
[Math.PI / 2, 0, 0]);
let enu = [-3, 4, -5];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey, edgeLla, sequenceKey, [Math.PI / 2, 0, 0]);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.verticalMotion).toBeCloseTo(-Math.PI / 4, precision);
});
it("should have correct viewing direction change", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key, lla, sequenceKey, createRotationVector(0));
let enu = [1, 0, 0];
let geodetic = GeoCoords.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
createRotationVector(Math.PI / 2));
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.directionChange)
.toBeCloseTo(Math.PI / 2, precision);
});
it("should have correct viewing direction change", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key, lla, sequenceKey, createRotationVector(0));
let enu = [1, 0, 0];
let geodetic = GeoCoords.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
createRotationVector(-Math.PI / 2));
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.directionChange)
.toBeCloseTo(-Math.PI / 2, precision);
});
it("should have correct viewing direction change", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key, lla, sequenceKey, createRotationVector(Math.PI / 4));
let enu = [1, 0, 0];
let geodetic = GeoCoords.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
createRotationVector(-3 * Math.PI / 4));
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(Math.abs(potentialEdge.directionChange))
.toBeCloseTo(Math.PI, precision);
});
it("should have correct vertical viewing direction change", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
createRotationVector(Math.PI / 4));
let enu = [1, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
createRotationVector(Math.PI / 4, Math.PI / 4));
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.verticalDirectionChange)
.toBeCloseTo(Math.PI / 4, precision);
});
it("should have correct vertical viewing direction change", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
createRotationVector(Math.PI / 4, 5 * Math.PI / 12));
let enu = [1, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage =
helper.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
createRotationVector(Math.PI / 4, 7 * Math.PI / 12));
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.verticalDirectionChange)
.toBeCloseTo(-Math.PI / 6, precision);
});
it("should have correct rotation", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
createRotationVector(Math.PI / 2, Math.PI / 6));
let enu = [1, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage =
helper.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
createRotationVector(Math.PI / 2, 2 * Math.PI / 3));
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.rotation)
.toBeCloseTo(Math.PI / 2, precision);
});
it("should have correct rotation", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let r1 = [1 / 3, 2 / 3, -1 / 3];
let r2 = [-2 / 3, -1 / 4, 1 / 6];
let theta = spatial.relativeRotationAngle(r1, r2);
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper.createCompleteImage(key, lla, sequenceKey, r1);
let enu = [1, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
r2);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.rotation).toBeCloseTo(theta, precision);
});
it("should have 0 world motion azimuth", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let r1 = [0, 0, 0];
let r2 = [0, 0, 0];
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
r1);
let enu = [1, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
r2);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.worldMotionAzimuth)
.toBeCloseTo(0, precision);
});
it("should have 90 degrees world motion azimuth", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let r1 = [0, 0, 0];
let r2 = [0, 0, 0];
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper.createCompleteImage(key, lla, sequenceKey, r1);
let enu = [0, 1, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(edgeKey, edgeLla, sequenceKey, r2);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.worldMotionAzimuth)
.toBeCloseTo(Math.PI / 2, precision);
});
it("should have 180 degrees world motion azimuth", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let r1 = [0, 0, 0];
let r2 = [0, 0, 0];
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper.createCompleteImage(key, lla, sequenceKey, r1);
let enu = [-1, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
r2);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(Math.abs(potentialEdge.worldMotionAzimuth))
.toBeCloseTo(Math.PI, precision);
});
it("should have minus 90 degrees world motion azimuth", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let r1 = [0, 0, 0];
let r2 = [0, 0, 0];
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper.createCompleteImage(key, lla, sequenceKey, r1);
let enu = [0, -1, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(edgeKey, edgeLla, sequenceKey, r2);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.worldMotionAzimuth)
.toBeCloseTo(-Math.PI / 2, precision);
});
it("should have 45 degress world motion azimuth", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let r1 = [0, 0, 0];
let r2 = [0, 0, 0];
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper.createCompleteImage(key, lla, sequenceKey, r1);
let enu = [1, 1, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(edgeKey, edgeLla, sequenceKey, r2);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.worldMotionAzimuth)
.toBeCloseTo(Math.PI / 4, precision);
});
it("should be same sequence", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
createRotationVector(0));
let enu = [1, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
createRotationVector(0));
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.sameSequence).toBe(true);
});
it("should not be same sequence", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let edgeSequenceKey = "edgeSkey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
createRotationVector(0));
let enu = [1, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
edgeSequenceKey,
createRotationVector(0));
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.sameSequence).toBe(false);
});
it("should be same merge cc", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let mergeCC = "45";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
createRotationVector(0),
mergeCC);
let enu = [1, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
createRotationVector(0),
mergeCC);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.sameMergeCC).toBe(true);
});
it("should not be same merge cc", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let mergeCC1 = "45";
let mergeCC2 = "22";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
createRotationVector(0),
mergeCC1);
let enu = [1, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
createRotationVector(0),
mergeCC2);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.sameMergeCC).toBe(false);
});
it("should be no potential if not merged", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
createRotationVector(0),
null);
let enu = [1, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
createRotationVector(0),
null);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(0);
});
it("should be no potential if potential not merged", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
createRotationVector(0),
"467");
let enu = [1, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
createRotationVector(0),
null);
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(0);
});
it("should be spherical when camera type spherical", () => {
let key = "key";
let edgeKey = "edgeKey";
let sequenceKey = "skey";
let lla: LngLatAlt = { alt: 0, lat: 0, lng: 0 };
let image = helper
.createCompleteImage(
key,
lla,
sequenceKey,
createRotationVector(0),
"467");
let enu = [1, 0, 0];
let geodetic = GeoCoords
.enuToGeodetic(
enu[0],
enu[1],
enu[2],
lla.lng,
lla.lat,
lla.alt);
let edgeLla: LngLatAlt = {
alt: geodetic[2],
lat: geodetic[1],
lng: geodetic[0],
};
let edgeImage = helper
.createCompleteImage(
edgeKey,
edgeLla,
sequenceKey,
createRotationVector(0),
"435",
"spherical");
let potentialEdges: PotentialEdge[] =
edgeCalculator.getPotentialEdges(image, [edgeImage], []);
expect(potentialEdges.length).toBe(1);
let potentialEdge: PotentialEdge = potentialEdges[0];
expect(potentialEdge.id).toBe(edgeKey);
expect(potentialEdge.spherical).toBe(true);
});
});