@xfanta/mars-time
Version:
Mars time conversion library (MSD, MTC, Darian Calendar)
87 lines (77 loc) • 3.4 kB
text/typescript
import { utcToMarsSolDate } from './marsSolDate';
import { deg2rad } from './utils';
/**
* Calculates the heliocentric distance of Mars from the Sun in astronomical units (AU)
* for a given Earth UTC date. Uses a simplified elliptical orbit model.
*
* @param date Earth UTC date
* @returns Distance in AU
*/
export function getHeliocentricDistance(date: Date): number {
const msd = utcToMarsSolDate(date);
const meanAnomaly = (19.3871 + 0.52402075 * (msd - 44796.0)) % 360;
const eccentricity = 0.0934;
const semiMajorAxis = 1.523679; // in AU
// Approximate heliocentric distance using the orbit equation:
// r = a * (1 - e^2) / (1 + e * cos(θ))
const theta = meanAnomaly; // approximate true anomaly
const r = semiMajorAxis * (1 - eccentricity ** 2) / (1 + eccentricity * Math.cos(deg2rad(theta)));
return r;
}
/**
* Calculates the solar elevation angle above the horizon at a specific location on Mars.
*
* @param date Earth UTC date
* @param lat Latitude on Mars in degrees (positive north)
* @param lon Longitude on Mars in degrees (positive east)
* @returns Solar elevation angle in degrees
*/
export function getSolarElevation(date: Date, lat: number, lon: number): number {
const msd = utcToMarsSolDate(date);
const lmst = (24 * ((msd + lon / 360) % 1)); // Local mean solar time in hours
const hourAngle = 15 * (lmst - 12); // degrees from local noon
const decl = getSolarDeclination(msd); // solar declination in degrees
// Convert to radians
const haRad = deg2rad(hourAngle);
const latRad = deg2rad(lat);
const decRad = deg2rad(decl);
// Solar elevation formula
const sinEl = Math.sin(latRad) * Math.sin(decRad) + Math.cos(latRad) * Math.cos(decRad) * Math.cos(haRad);
return Math.asin(sinEl) * (180 / Math.PI);
}
/**
* Calculates the solar azimuth angle (direction from north) at a specific location on Mars.
*
* @param date Earth UTC date
* @param lat Latitude on Mars in degrees (positive north)
* @param lon Longitude on Mars in degrees (positive east)
* @returns Solar azimuth angle in degrees (0° = north, 90° = east)
*/
export function getSolarAzimuth(date: Date, lat: number, lon: number): number {
const msd = utcToMarsSolDate(date);
const lmst = (24 * ((msd + lon / 360) % 1)); // Local mean solar time in hours
const hourAngle = 15 * (lmst - 12); // degrees
const decl = getSolarDeclination(msd); // degrees
// Convert to radians
const haRad = deg2rad(hourAngle);
const latRad = deg2rad(lat);
const decRad = deg2rad(decl);
// Solar azimuth formula
const sinAz = Math.sin(haRad) * Math.cos(decRad);
const cosAz = Math.cos(haRad) * Math.cos(decRad) * Math.sin(latRad) - Math.sin(decRad) * Math.cos(latRad);
let az = Math.atan2(sinAz, cosAz) * (180 / Math.PI);
az = (az + 360) % 360; // Normalize to 0–360°
return az;
}
/**
* Approximates the solar declination angle (angular distance of the Sun above the Martian equator)
* based on Mars Sol Date. Uses Mars' axial tilt and orbital position (Ls).
*
* @param msd Mars Sol Date
* @returns Declination angle in degrees
*/
function getSolarDeclination(msd: number): number {
const Ls = (270.3863 + 0.5240384 * (msd - 44796.0)) % 360; // Areocentric solar longitude
const obliquity = 25.19; // Mars axial tilt in degrees
return Math.asin(Math.sin(deg2rad(obliquity)) * Math.sin(deg2rad(Ls))) * (180 / Math.PI);
}