Skip to main content

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}