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; };