Refactor complete
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
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;
|
||||
};
|
||||
Reference in New Issue
Block a user