ootk-core
Version:
Orbital Object Toolkit. A modern typed replacement for satellite.js including SGP4 propagation, TLE parsing, Sun and Moon calculations, and more.
88 lines (79 loc) • 3.47 kB
text/typescript
/**
* @author Theodore Kruczek.
* @license MIT
* @copyright (c) 2022-2025 Theodore Kruczek Permission is
* hereby granted, free of charge, to any person obtaining a copy of this
* software and associated documentation files (the "Software"), to deal in the
* Software without restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do
* so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
import { Matrix } from '../operations/Matrix.js';
import { J2000 } from './J2000.js';
import { RelativeState } from './RelativeState.js';
/**
* Represents a Radial-Intrack-Crosstrack (RIC) coordinates.
*/
export class RIC extends RelativeState {
/**
* Gets the name of the RIC coordinate system.
* @returns The name of the RIC coordinate system.
*/
get name(): string {
return 'RIC';
}
/**
* Creates a new RIC (Radial-Intrack-Crosstrack) coordinate from the J2000 state vectors.
* @param state - The J2000 state vector.
* @param origin - The J2000 state vector of the origin.
* @param transform - The transformation matrix.
* @returns The RIC coordinate.
*/
static fromJ2000Matrix(state: J2000, origin: J2000, transform: Matrix): RIC {
const dr = state.position.subtract(origin.position);
const dv = state.velocity.subtract(origin.velocity);
return new RIC(transform.multiplyVector3D(dr), transform.multiplyVector3D(dv));
}
/**
* Creates a RIC (Radial-Intrack-Crosstrack) coordinate system from a J2000 state and origin.
* @param state The J2000 state.
* @param origin The J2000 origin.
* @returns The RIC coordinate system.
*/
static fromJ2000(state: J2000, origin: J2000): RIC {
return RIC.fromJ2000Matrix(state, origin, RelativeState.createMatrix(origin.position, origin.velocity));
}
/**
* Transforms the current RIC coordinate to the J2000 coordinate system using the provided origin and transform
* matrix.
* @param origin The origin J2000 coordinate.
* @param transform The transformation matrix.
* @returns The transformed J2000 coordinate.
*/
toJ2000Matrix(origin: J2000, transform: Matrix): J2000 {
const tt = transform.transpose();
const tr = tt.multiplyVector3D(this.position);
const tv = tt.multiplyVector3D(this.velocity);
return new J2000(origin.epoch, origin.position.add(tr), origin.velocity.add(tv));
}
/**
* Transforms the current RIC coordinate to the J2000 coordinate system using the provided origin.
* @param origin The origin J2000 coordinate.
* @returns The transformed J2000 coordinate.
*/
toJ2000(origin: J2000): J2000 {
return this.toJ2000Matrix(origin, RelativeState.createMatrix(origin.position, origin.velocity));
}
}