cad_cs/libs/cs/core/d2.rs
1// 📃 ./src/libs/cs/core/d2.rs
2
3use crate::libs::cs::{
4 abstracts::AbstractProjectionsCs2,
5 model::{Cs, *},
6 types::Cs2,
7};
8
9// --- IMPLEMENTACJE FROM (DTO -> Cs2) ---
10
11impl From<CoordsXy> for Cs2 {
12 /// 📚 【 POL】: Konwertuje kartezjańskie DTO XY na wektor Cs2.
13 /// 📚 【 ENG】: Converts Cartesian XY DTO to a Cs2 vector.
14 #[inline]
15 fn from(c: CoordsXy) -> Self { Cs([c.x, c.y]) }
16}
17
18impl From<CoordsPolar> for Cs2 {
19 /// 📚 【 POL】: Konwertuje współrzędne biegunowe XY na wektor kartezjański Cs2.
20 /// 📚 【 ENG】: Converts XY polar coordinates to a Cs2 Cartesian vector.
21 #[inline]
22 fn from(c: CoordsPolar) -> Self {
23 let (sin_f, cos_f) = c.f_y_x.sin_cos();
24 Cs([c.r_d2 * cos_f, c.r_d2 * sin_f])
25 }
26}
27
28impl AbstractProjectionsCs2 for Cs<2> {
29 /// 📚 【 POL】: Tworzy nowy wektor Cs2 z układu biegunowego (R, Φ) na płaszczyźnie XY.
30 /// 📚 【 ENG】: Creates a new Cs2 vector from a polar system (R, Φ) on the XY plane.
31 #[rustfmt::skip] #[inline]
32 fn new_from_rf(r: f64, phi_rad: f64) -> Self {
33 let (sin_phi, cos_phi) = phi_rad.sin_cos();
34 Cs([r * cos_phi, r * sin_phi])
35 }
36
37 // Projeksje 2D -> 3D
38 #[rustfmt::skip] #[inline] fn new_as_xy(&self) -> Cs<3> { Cs([self.0[0], self.0[1], 0.0]) }
39 #[rustfmt::skip] #[inline] fn new_as_xz(&self) -> Cs<3> { Cs([self.0[0], 0.0, self.0[1]]) }
40 #[rustfmt::skip] #[inline] fn new_as_yz(&self) -> Cs<3> { Cs([0.0, self.0[0], self.0[1]]) }
41
42 // ===================================================================================
43 // KREACJA Z UKŁADÓW BIEGUNOWYCH I CYLINDRYCZNYCH (Źródło: R, Phi)
44 // ===================================================================================
45 // ⚠️ UWAGA DOTYCZĄCA ZAKRESU PONIŻSZYCH METOD:
46 // Poniższe metody asymilują ("as"), że wywołujący obiekt `self` NIE JEST
47 // wektorem kartezjańskim [X, Y], lecz kontenerem na dane układu biegunowego:
48 // self.0[0] = R (Promień)
49 // self.0[1] = Φ (Kąt Azymutu w radianach)
50 // Przykładowe wywołanie: let punkt = cs![promien, azymut_rad].new_as_xy_from_rf();
51
52 /// 📚 【 POL】: Interpretuje Cs2 jako kontener [R, Φ] i zwraca kartezjański wektor 2D [X, Y].
53 /// 📚 【 ENG】: Interprets Cs2 as a [R, Φ] container and returns a 2D Cartesian vector [X, Y].
54 #[rustfmt::skip] #[inline]
55 fn new_as_xy_from_rf(&self) -> Cs<2> {
56 let (sin_phi, cos_phi) = self.0[1].sin_cos();
57 Cs([self.0[0] * cos_phi, self.0[0] * sin_phi])
58 }
59
60 /// 📚 【 POL】: Interpretuje Cs2 jako [R_xy, Φ] i zwraca kartezjański Cs3 z zadaną wysokością Z.
61 /// 📚 【 ENG】: Interprets Cs2 as [R_xy, Φ] and returns a Cartesian Cs3 with a given Z height.
62 #[rustfmt::skip] #[inline]
63 fn new_as_xyz_from_rf_with_z(&self, z: f64) -> Cs<3> {
64 let (sin_phi, cos_phi) = self.0[1].sin_cos();
65 Cs([self.0[0] * cos_phi, self.0[0] * sin_phi, z])
66 }
67
68 /// 📚 【 POL】: Interpretuje Cs2 jako [R_xz, Φ] i zwraca kartezjański Cs3 z zadaną szerokością Y.
69 /// 📚 【 ENG】: Interprets Cs2 as [R_xz, Φ] and returns a Cartesian Cs3 with a given Y width.
70 #[rustfmt::skip] #[inline]
71 fn new_as_xyz_from_rf_with_y(&self, y: f64) -> Cs<3> {
72 let (sin_phi, cos_phi) = self.0[1].sin_cos();
73 Cs([self.0[0] * cos_phi, y, self.0[0] * sin_phi])
74 }
75
76 /// 📚 【 POL】: Interpretuje Cs2 jako [R_yz, Φ] i zwraca kartezjański Cs3 z zadaną współrzędną X.
77 /// 📚 【 ENG】: Interprets Cs2 as [R_yz, Φ] and returns a Cartesian Cs3 with a given X coordinate.
78 #[rustfmt::skip] #[inline]
79 fn new_as_xyz_from_rf_with_x(&self, x: f64) -> Cs<3> {
80 let (sin_phi, cos_phi) = self.0[1].sin_cos();
81 Cs([x, self.0[0] * cos_phi, self.0[0] * sin_phi])
82 }
83}