Martin Asprusten eaedfaf29c
Much guessing
2026-04-01 15:41:25 +02:00

126 lines
3.9 KiB
TypeScript

import type { Body } from "../calculations/constants";
import { findCheapestIntercept, findCheapestLanding, findCheapestTransfer, type Orbit, type OrbitalCoordinates, type ShipParameters, type Transfer } from "../calculations/orbit-calculations";
import type { Landing, LandingParameters, LandingProgressCallbackFunction, Manoeuvre } from "../calculations/orbit-calculations";
const ctx: Worker = self as any;
export interface FindBestTransferMessage {
type: "FindBestTransfer",
startingSituation: OrbitalCoordinates,
targetOrbit: Orbit,
body: Body
}
export interface FindBestInterceptMessage {
type: "FindBestIntercept",
startingSituation: OrbitalCoordinates,
targetSituation: OrbitalCoordinates,
additionalTrueAnomaly: number,
body: Body;
}
export interface FindBestLandingMessage {
"type": "FindBestLandingMessage",
startTime: number,
startingCoordinates: OrbitalCoordinates,
shipParameters: ShipParameters,
landingParameters: LandingParameters,
body: Body
}
export interface ProgressMessage {
type: "ProgressMessage"
finished: boolean,
percentDone: number,
bestDeltaV: number | null,
bestTransfer: Transfer | null
}
export interface LandingProgressMessage {
type: "LandingProgressMessage",
finished: boolean,
percentDone: number,
bestDeltaV: number | null,
bestLanding: Landing | null
}
ctx.addEventListener("message", event => {
const progressCallback = (numberChecked: number, totalNumber: number, bestDeltaV: number | null, bestTransfer: Transfer | null) => {
if (numberChecked % 1 == 0) {
let percentDone = numberChecked * 100 / totalNumber;
let message: ProgressMessage = {
type: "ProgressMessage",
finished: false,
percentDone: percentDone,
bestDeltaV: bestDeltaV,
bestTransfer: bestTransfer
};
ctx.postMessage(message);
}
};
const landingProgressCallback: LandingProgressCallbackFunction = (pathsChecked: number, totalNumberOfPaths: number, currentBestDeltaV: number | null, currentBestLanding: Landing | null) => {
if (pathsChecked % 100 == 0) {
let percentDone = pathsChecked * 100 / totalNumberOfPaths;
let message: LandingProgressMessage = {
type: "LandingProgressMessage",
finished: false,
percentDone: percentDone,
bestDeltaV: currentBestDeltaV,
bestLanding: currentBestLanding
};
ctx.postMessage(message);
}
}
let message = event.data as FindBestTransferMessage | FindBestInterceptMessage | FindBestLandingMessage;
if (message.type == "FindBestTransfer") {
let bestTransfer = findCheapestTransfer(message.startingSituation, message.targetOrbit, message.body, progressCallback);
let bestDeltaV = null;
if (bestTransfer) {
bestDeltaV = bestTransfer.firstManoeuvre.totalDeltaV + bestTransfer.secondManoeuvre.totalDeltaV;
}
let finishedMessage: ProgressMessage = {
type: "ProgressMessage",
finished: true,
percentDone: 100,
bestDeltaV: bestDeltaV,
bestTransfer: bestTransfer
};
ctx.postMessage(finishedMessage);
}
if (message.type == "FindBestIntercept") {
let bestIntercept = findCheapestIntercept(message.startingSituation, message.targetSituation, message.body, message.additionalTrueAnomaly, progressCallback);
let bestDeltaV = null;
if (bestIntercept) {
bestDeltaV = bestIntercept.firstManoeuvre.totalDeltaV + bestIntercept.secondManoeuvre.totalDeltaV;
}
let finishedMessage: ProgressMessage = {
type: "ProgressMessage",
finished: true,
percentDone: 100,
bestDeltaV: bestDeltaV,
bestTransfer: bestIntercept
};
ctx.postMessage(finishedMessage);
}
if (message.type == "FindBestLandingMessage") {
let bestLanding = findCheapestLanding(message.startingCoordinates, message.startTime, message.shipParameters, message.landingParameters, message.body, landingProgressCallback);
let finishedMessage: LandingProgressMessage = {
type: "LandingProgressMessage",
finished: true,
percentDone: 100,
bestDeltaV: bestLanding?.totalDeltaV ?? null,
bestLanding: bestLanding
};
ctx.postMessage(finishedMessage);
}
});