use std::ops::{Add, Div, Mul, Neg, Sub};
use crate::libs::{angle::AngleFmt, cs::model::Cs};
pub trait AbstractProjectionsCs2 {
fn new_from_rf(r: f64, phi_rad: f64) -> Self;
fn new_as_xy(&self) -> Cs<3>;
fn new_as_xz(&self) -> Cs<3>;
fn new_as_yz(&self) -> Cs<3>;
fn new_as_xy_from_rf(&self) -> Self;
fn new_as_xyz_from_rf_with_z(&self, z: f64) -> Cs<3>;
fn new_as_xyz_from_rf_with_y(&self, y: f64) -> Cs<3>;
fn new_as_xyz_from_rf_with_x(&self, x: f64) -> Cs<3>;
}
pub trait AbstractProjectionsCs3 {
fn new_from_rft(r: f64, phi_rad: f64, theta_rad: f64) -> Self;
fn new_from_rfz(r_d2: f64, phi_rad: f64, z: f64) -> Self;
fn new_from_rfx(r_d2: f64, phi_rad: f64, x: f64) -> Self;
fn new_from_rfy(r_d2: f64, phi_rad: f64, y: f64) -> Self;
fn new_as_xyz_from_rft(&self) -> Cs<3>;
}
pub trait AbstractMathCsGeneric {
fn sub(&self, other: &Self) -> Self;
fn add(&self, other: &Self) -> Self;
fn dot(&self, other: &Self) -> f64;
fn r_sq(&self) -> f64;
fn r(&self) -> f64;
fn normalize_r_projection(&self) -> Self;
fn angle_between(&self, other: &Self) -> f64;
}
pub trait AbstractMathCs2 {
fn rxy(&self) -> f64;
fn arctan_y_x(&self) -> f64;
fn arctan_x_y(&self) -> f64;
fn to_rf_from_xy(&self) -> Cs<2>;
fn to_ecef_from_rad_sn_we(&self, r: f64) -> Cs<3>;
fn q(&self) -> u8;
fn q_sign(&self) -> [&'static str; 2];
fn rxy_sq(&self) -> f64;
fn cross(&self, other: &Cs<2>) -> f64;
fn perp(&self) -> Cs<2>;
}
pub trait AbstractMathCs3 {
fn rxy(&self) -> f64;
fn rxz(&self) -> f64;
fn ryz(&self) -> f64;
fn rxyz(&self) -> f64;
fn arctan_y_x(&self) -> f64;
fn arctan_z_x(&self) -> f64;
fn arctan_z_y(&self) -> f64;
fn arctan_x_y(&self) -> f64;
fn arctan_x_z(&self) -> f64;
fn arctan_y_z(&self) -> f64;
fn arccos_x_rxyz(&self) -> f64;
fn arccos_y_rxyz(&self) -> f64;
fn arccos_z_rxyz(&self) -> f64;
fn to_rf_from_xy(&self) -> Cs<2>;
fn to_rf_from_xz(&self) -> Cs<2>;
fn to_rf_from_yz(&self) -> Cs<2>;
fn to_rfx_from_xyz(&self) -> Cs<3>;
fn to_rfy_from_xyz(&self) -> Cs<3>;
fn to_rfz_from_xyz(&self) -> Cs<3>;
fn to_rft_from_xyz(&self) -> Cs<3>;
fn to_ecef_from_dms_sn_we(
sn_d: i16,
sn_m: u8,
sn_s: f32,
we_d: i16,
we_m: u8,
we_s: f32,
r: f64,
) -> Self;
fn to_dms_sn_we_from_xyz(&self) -> crate::libs::cs::model::CoordsSphericalEcefSnWeDms;
fn q(&self) -> u8;
fn q_sign(&self) -> [&'static str; 3];
fn rxyz_sq(&self) -> f64;
fn rxy_sq(&self) -> f64;
fn rxz_sq(&self) -> f64;
fn ryz_sq(&self) -> f64;
fn normalize_rxy_projection(&self) -> Cs<3>;
fn normalize_rxz_projection(&self) -> Cs<3>;
fn normalize_ryz_projection(&self) -> Cs<3>;
fn cross(&self, other: &Cs<3>) -> Cs<3>;
}
pub trait AbstractModelCsGeneric<const N: usize> {
fn new(data: [f64; N]) -> Self;
fn origin() -> Self;
fn as_slice(&self) -> &[f64];
}
pub trait AbstractHelperCs2 {
fn print_q(&self, name: &str);
fn print_xy(&self, name: &str);
fn print_rf(&self, name: &str, fmt: AngleFmt);
fn print(&self, name: &str, fmt: AngleFmt);
}
pub trait AbstractHelperCs3 {
fn print_q(&self, name: &str);
fn print_xyz(&self, name: &str);
fn print_rft(&self, name: &str, fmt: AngleFmt);
fn print_rfx(&self, name: &str, fmt: AngleFmt);
fn print_rfy(&self, name: &str, fmt: AngleFmt);
fn print_rfz(&self, name: &str, fmt: AngleFmt);
fn print_dms_sn_we(&self, name: &str);
fn print(&self, name: &str, fmt: AngleFmt);
}
pub trait AbstractArithmeticCsGeneric:
Add<Output = Self>
+ Sub<Output = Self>
+ Neg<Output = Self>
+ Mul<f64, Output = Self>
+ Div<f64, Output = Self>
+ Sized {
fn add_cs(&self, rhs: &Self) -> Self;
fn sub_cs(&self, rhs: &Self) -> Self;
fn neg_cs(&self) -> Self;
fn mul_scalar(&self, rhs: f64) -> Self;
fn div_scalar(&self, rhs: f64) -> Self;
}
pub trait AbstractSignStrExt {
fn sign_str(self) -> &'static str;
fn sign_sn(self) -> &'static str;
fn sign_we(self) -> &'static str;
}