68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
import * as geolib from 'geolib';
|
|
|
|
/**
|
|
* @param crsIntoEndpoint Course into arc endpoint
|
|
* @param crsIntoOrigin Course into arc origin point
|
|
* @param start Arc origin point
|
|
* @param center Arc center point
|
|
* @param turnDir
|
|
* @returns Line segments
|
|
*/
|
|
export const generateRFArc = (
|
|
crsIntoEndpoint: number,
|
|
crsIntoOrigin: number,
|
|
start: NavFix,
|
|
center: NavFix,
|
|
turnDir: TurnDirection
|
|
) => {
|
|
const line: LineSegment[] = [[start.longitude, start.latitude]];
|
|
|
|
if (crsIntoEndpoint !== crsIntoOrigin) {
|
|
// Turn Dir
|
|
if (!turnDir || turnDir === 'E') {
|
|
let prov = crsIntoOrigin - crsIntoEndpoint;
|
|
prov = prov > 180 ? prov - 360 : prov <= -180 ? prov + 360 : prov;
|
|
turnDir = prov > 0 ? 'L' : 'R';
|
|
}
|
|
|
|
let crsOrthogonalOnOrigin;
|
|
let crsOrthogonalOnEndpoint;
|
|
if (turnDir === 'R') {
|
|
crsOrthogonalOnOrigin = (crsIntoOrigin + 90).normaliseDegrees();
|
|
crsOrthogonalOnEndpoint = (crsIntoEndpoint + 90).normaliseDegrees();
|
|
} else {
|
|
crsOrthogonalOnOrigin = (crsIntoOrigin - 90).normaliseDegrees();
|
|
crsOrthogonalOnEndpoint = (crsIntoEndpoint - 90).normaliseDegrees();
|
|
}
|
|
|
|
const arcRad = geolib.getDistance(center, start);
|
|
|
|
crsOrthogonalOnOrigin = crsOrthogonalOnOrigin.reciprocalCourse();
|
|
crsOrthogonalOnEndpoint = crsOrthogonalOnEndpoint.reciprocalCourse();
|
|
// Start turn immediately
|
|
if (turnDir === 'R') {
|
|
crsOrthogonalOnOrigin += crsOrthogonalOnOrigin < 1 ? crsOrthogonalOnOrigin : 1;
|
|
} else {
|
|
crsOrthogonalOnOrigin -= crsOrthogonalOnOrigin < 1 ? crsOrthogonalOnOrigin : 1;
|
|
}
|
|
|
|
while (crsOrthogonalOnOrigin !== crsOrthogonalOnEndpoint) {
|
|
if (turnDir === 'R') {
|
|
const delta = (crsOrthogonalOnEndpoint - crsOrthogonalOnOrigin).normaliseDegrees();
|
|
crsOrthogonalOnOrigin += delta < 1 ? delta : 1;
|
|
crsOrthogonalOnOrigin = crsOrthogonalOnOrigin.normaliseDegrees();
|
|
} else {
|
|
const delta = (crsOrthogonalOnOrigin - crsOrthogonalOnEndpoint).normaliseDegrees();
|
|
crsOrthogonalOnOrigin -= delta < 1 ? delta : 1;
|
|
crsOrthogonalOnOrigin = crsOrthogonalOnOrigin.normaliseDegrees();
|
|
}
|
|
|
|
const arcFix = geolib.computeDestinationPoint(center, arcRad, crsOrthogonalOnOrigin);
|
|
|
|
line.push([arcFix.longitude, arcFix.latitude]);
|
|
}
|
|
}
|
|
|
|
return line;
|
|
};
|