Skip to main content

cmtool_core/coordinates/
points.rs

1// SPDX-License-Identifier: GPL-3.0-or-later
2
3use super::Coords3;
4
5//TODO: Clean wrapper for non owing point/vec
6
7//#[derive(Clone, Copy)]
8//struct CartesianCoordinateRef<'a>(pub &'a Coords3);
9//
10/// Implement From for easy conversion
11//impl<'a> From<CartesianCoordinateRef<'a>> for CartesianCoordinates {
12//fn from(c: CartesianCoordinateRef<'a>) -> Self {
13//CartesianCoordinates(*c.0)
14//}
15//}
16
17#[derive(Debug, Clone, Copy, Default)]
18pub struct CylindricalCoordinates(pub Coords3);
19#[derive(Debug, Clone, Copy, Default)]
20pub struct CartesianCoordinates(pub Coords3);
21
22impl From<&CartesianCoordinates> for CylindricalCoordinates {
23    fn from(cart: &CartesianCoordinates) -> Self {
24        let r = f64::sqrt(cart.0[0] * cart.0[0] + cart.0[1] * cart.0[1]);
25        let theta = cart.0[1].atan2(cart.0[0]); // handles all cases
26        Self([r, theta, cart.0[2]])
27    }
28}
29
30impl From<CartesianCoordinates> for CylindricalCoordinates {
31    fn from(cart: CartesianCoordinates) -> Self {
32        CylindricalCoordinates::from(&cart)
33    }
34}
35
36impl From<&CylindricalCoordinates> for CartesianCoordinates {
37    fn from(value: &CylindricalCoordinates) -> Self {
38        CartesianCoordinates([
39            value.0[0] * value.0[1].cos(),
40            value.0[0] * value.0[1].sin(),
41            value.0[2],
42        ])
43    }
44}
45
46impl From<CylindricalCoordinates> for CartesianCoordinates {
47    fn from(value: CylindricalCoordinates) -> Self {
48        CartesianCoordinates::from(&value)
49    }
50}