53 lines
1.9 KiB
TypeScript
53 lines
1.9 KiB
TypeScript
import computeDestinationPoint from 'geolib/es/computeDestinationPoint';
|
|
import getGreatCircleBearing from 'geolib/es/getGreatCircleBearing';
|
|
import getPreciseDistance from 'geolib/es/getPreciseDistance';
|
|
import { generateOverflyArc } from '../pathGenerators/generateOverflyArc';
|
|
import { computeSpeed } from '../utils/computeSpeed';
|
|
|
|
// NOTE: No wind adjustments to be made, no clue how *that* would draw
|
|
// NOTE: Distance not adjusted for altitude in this demo
|
|
export const TerminatorsVD = (
|
|
leg: VDTerminalEntry,
|
|
previousFix: NavFix,
|
|
lastCourse: number
|
|
): [NavFix?, LineSegment[]?] => {
|
|
const navaid = {
|
|
latitude: leg.NavLat,
|
|
longitude: leg.NavLon,
|
|
};
|
|
const crsIntoEndpoint = leg.Course.toTrue(previousFix);
|
|
const speed = computeSpeed(leg, previousFix);
|
|
|
|
// Compute overfly
|
|
const [line, arcEnd, _lastCourse] = generateOverflyArc(crsIntoEndpoint, lastCourse, previousFix, speed, leg.TurnDir);
|
|
lastCourse = _lastCourse;
|
|
|
|
// Compute distance to fly from arc end
|
|
const crsToNavaid = getGreatCircleBearing(arcEnd, navaid);
|
|
const distToNavaid = getPreciseDistance(arcEnd, navaid);
|
|
let remainingDistance = leg.Distance.toMetre();
|
|
// Navaid behind us
|
|
if (Math.abs(crsToNavaid - lastCourse) > 90) {
|
|
remainingDistance -= distToNavaid;
|
|
}
|
|
// Navaid in front of us
|
|
else {
|
|
// Navaid will not be passed before distance is hit
|
|
if (distToNavaid > remainingDistance) remainingDistance = distToNavaid - remainingDistance;
|
|
}
|
|
|
|
// Compute intercept of crs from arc end and distance
|
|
const targetFix: NavFix = {
|
|
...computeDestinationPoint(arcEnd, remainingDistance, lastCourse),
|
|
name: leg.Distance.toString(),
|
|
isFlyOver: true,
|
|
altitude: leg.Alt ? leg.Alt.parseAltitude() : previousFix.altitude,
|
|
speed: speed,
|
|
speedConstraint: leg.SpeedLimit,
|
|
altitudeConstraint: leg.Alt,
|
|
};
|
|
line.push([targetFix.longitude, targetFix.latitude]);
|
|
|
|
return [targetFix, line];
|
|
};
|