69 lines
2.4 KiB
TypeScript
69 lines
2.4 KiB
TypeScript
import computeDestinationPoint from 'geolib/es/computeDestinationPoint';
|
|
import getPreciseDistance from 'geolib/es/getPreciseDistance';
|
|
|
|
/**
|
|
* @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.equal(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 = getPreciseDistance(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.equal(crsOrthogonalOnEndpoint)) {
|
|
if (turnDir === 'R') {
|
|
const delta = (crsOrthogonalOnEndpoint - crsOrthogonalOnOrigin).normaliseDegrees();
|
|
crsOrthogonalOnOrigin += delta < 0.1 ? delta : 0.1;
|
|
crsOrthogonalOnOrigin = crsOrthogonalOnOrigin.normaliseDegrees();
|
|
} else {
|
|
const delta = (crsOrthogonalOnOrigin - crsOrthogonalOnEndpoint).normaliseDegrees();
|
|
crsOrthogonalOnOrigin -= delta < 0.1 ? delta : 0.1;
|
|
crsOrthogonalOnOrigin = crsOrthogonalOnOrigin.normaliseDegrees();
|
|
}
|
|
|
|
const arcFix = computeDestinationPoint(center, arcRad, crsOrthogonalOnOrigin);
|
|
|
|
line.push([arcFix.longitude, arcFix.latitude]);
|
|
}
|
|
}
|
|
|
|
return line;
|
|
};
|