in src/graph/edge/EdgeCalculator.ts [425:509]
public computeTurnEdges(node: Image, potentialEdges: PotentialEdge[]): NavigationEdge[] {
if (!node.complete) {
throw new ArgumentMapillaryError("Image has to be full.");
}
let edges: NavigationEdge[] = [];
if (isSpherical(node.cameraType)) {
return edges;
}
for (let k in this._directions.turns) {
if (!this._directions.turns.hasOwnProperty(k)) {
continue;
}
let turn: TurnDirection = this._directions.turns[k];
let lowestScore: number = Number.MAX_VALUE;
let edge: PotentialEdge = null;
for (let potential of potentialEdges) {
if (potential.spherical) {
continue;
}
if (potential.distance > this._settings.turnMaxDistance) {
continue;
}
let rig: boolean =
turn.direction !== NavigationDirection.TurnU &&
potential.distance < this._settings.turnMaxRigDistance &&
Math.abs(potential.directionChange) > this._settings.turnMinRigDirectionChange;
let directionDifference: number = this._spatial.angleDifference(
turn.directionChange, potential.directionChange);
let score: number;
if (
rig &&
potential.directionChange * turn.directionChange > 0 &&
Math.abs(potential.directionChange) < Math.abs(turn.directionChange)) {
score = -Math.PI / 2 + Math.abs(potential.directionChange);
} else {
if (Math.abs(directionDifference) > this._settings.turnMaxDirectionChange) {
continue;
}
let motionDifference: number = turn.motionChange ?
this._spatial.angleDifference(turn.motionChange, potential.motionChange) : 0;
motionDifference = Math.sqrt(
motionDifference * motionDifference +
potential.verticalMotion * potential.verticalMotion);
score =
this._coefficients.turnDistance * potential.distance /
this._settings.turnMaxDistance +
this._coefficients.turnMotion * motionDifference / Math.PI +
this._coefficients.turnSequencePenalty * (potential.sameSequence ? 0 : 1) +
this._coefficients.turnMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
}
if (score < lowestScore) {
lowestScore = score;
edge = potential;
}
}
if (edge != null) {
edges.push({
data: {
direction: turn.direction,
worldMotionAzimuth: edge.worldMotionAzimuth,
},
source: node.id,
target: edge.id,
});
}
}
return edges;
}