mirror of
https://github.com/mapillary/mapillary-js.git
synced 2026-01-18 13:56:53 +00:00
1341 lines
37 KiB
TypeScript
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);
|
|
});
|
|
});
|