use nalgebra::{Point3, RealField, UnitQuaternion, Vector3};
pub fn cart2cyl<T: RealField + Copy>(x: T, y: T) -> (T, T) {
let r = (x * x + y * y).sqrt();
let phi = y.atan2(x);
(r, phi)
}
pub fn vec_cyl2cart<T: RealField + Copy>(r: T, phi: T, theta: T) -> (T, T) {
let x = r * theta.cos() - phi * theta.sin();
let y = r * theta.sin() + phi * theta.cos();
(x, y)
}
macro_rules! compute_in_local {
($func: ident, $point: expr, $position: expr, $orientation: expr, ($($func_args:expr),*),) => {
{
let local_point = crate::base::coordinate::global_to_local_point($point, $position, $orientation);
let local_result_vector = $func(local_point, $($func_args),*);
crate::base::coordinate::local_to_global_vector(local_result_vector, $orientation)
}
};
}
pub(crate) use compute_in_local;
pub(crate) fn global_to_local_point<T: RealField + Copy>(
point: Point3<T>,
position: Point3<T>,
orientation: UnitQuaternion<T>,
) -> Point3<T> {
orientation.inverse() * Point3::from(point.coords - position.coords)
}
pub(crate) fn local_to_global_vector<T: RealField + Copy>(
vector: Vector3<T>,
orientation: UnitQuaternion<T>,
) -> Vector3<T> {
orientation * vector
}