Skip to main content

cad_cs/libs/cs/helper/
d3.rs

1// 📃 ./src/libs/cs/helper/d3.rs
2
3use crate::libs::{
4	angle::AngleFmt,
5	cs::{
6		abstracts::{AbstractHelperCs3, AbstractMathCs3},
7		model::Cs,
8	},
9};
10
11// ===================================================================================
12// TRAIT DLA 3D
13// ===================================================================================
14
15impl AbstractHelperCs3 for Cs<3> {
16	#[rustfmt::skip] #[inline]
17	fn print_q(&self, name: &str) {
18		let s = self.q_sign();
19		println!(" {}    (Oktant: {} [{}, {}, {}])", name, self.q(), s[0], s[1], s[2]);
20	}
21
22	#[rustfmt::skip] #[inline]
23	fn print_xyz(&self, name: &str) {
24		println!(" {} 🔶 (x: {:?}, y: {:?}, z: {:?})", name, self.0[0], self.0[1], self.0[2]);
25	}
26
27	#[rustfmt::skip] #[inline]
28	fn print_rft(&self, name: &str, fmt: AngleFmt) {
29		let rft = self.to_rft_from_xyz();
30		println!(" {} 🟫 (R: {:?}, Φ: {}, Θ: {})", name, rft[0], fmt.format(rft[1]), fmt.format(rft[2]));
31	}
32
33	#[rustfmt::skip] #[inline]
34	fn print_rfx(&self, name: &str, fmt: AngleFmt) {
35		let rfx = self.to_rfx_from_xyz();
36		println!(" {} 🟧 (R: {:?}, Φ: {}, x: {:?})", name, rfx[0], fmt.format(rfx[1]), rfx[2]);
37	}
38
39	#[rustfmt::skip] #[inline]
40	fn print_rfy(&self, name: &str, fmt: AngleFmt) {
41		let rfy = self.to_rfy_from_xyz();
42		println!(" {} 🟨 (R: {:?}, Φ: {}, y: {:?})", name, rfy[0], fmt.format(rfy[1]), rfy[2]);
43	}
44
45	#[rustfmt::skip] #[inline]
46	fn print_rfz(&self, name: &str, fmt: AngleFmt) {
47		let rfz = self.to_rfz_from_xyz();
48		println!(" {} 🟥 (R: {:?}, Φ: {}, z: {:?})", name, rfz[0], fmt.format(rfz[1]), rfz[2]);
49	}
50
51	/// 📚 【 POL】: Wyświetla współrzędne w formacie geodezyjnym DMS (Stopnie, Minuty, Sekundy) z oznaczeniami N/S i E/W.
52	/// 📚 【 ENG】: Displays coordinates in geodetic DMS (Degrees, Minutes, Seconds) format with N/S and E/W indicators.
53	#[rustfmt::skip] #[inline]
54	fn print_dms_sn_we(&self, name: &str) {
55		// Pobieramy nasz rozszerzony trait dla formatowania znaków
56		use crate::libs::cs::abstracts::AbstractSignStrExt;
57
58		// Dekompresujemy ECEF (XYZ) do DTO z DMS
59		let dms = self.to_dms_sn_we_from_xyz();
60
61		// Wyciągamy litery kierunków na podstawie znaków (N/S i E/W)
62		let lat_dir = dms.sn_lat_d.sign_sn();
63		let lon_dir = dms.we_lon_d.sign_we();
64
65		// Wyświetlamy dokładnie jak na zrzucie ekranu z Google Maps!
66		// {:02} dodaje zera wiodące do minut (np. 8 -> 08)
67		// {:04.1} dodaje zera i ustala 1 miejsce po przecinku dla sekund (np. 2.3 -> 02.3)
68		println!(" {} 🌍 {}°{:02}'{:04.1}\"{} {}°{:02}'{:04.1}\"{}",
69			name,
70			dms.sn_lat_d.abs(), dms.sn_lat_m, dms.sn_lat_s, lat_dir,
71			dms.we_lon_d.abs(), dms.we_lon_m, dms.we_lon_s, lon_dir
72		);
73	}
74
75	#[rustfmt::skip] #[inline]
76	fn print(&self, name: &str, fmt: AngleFmt) {
77		let spacer = " ".repeat(name.chars().count());
78		self.print_xyz(name);
79		self.print_q(&spacer);
80		self.print_rft(&spacer, fmt);
81		self.print_rfz(&spacer, fmt);
82		self.print_rfy(&spacer, fmt);
83		self.print_rfx(&spacer, fmt);
84		self.print_dms_sn_we(&spacer);
85		println!(" ");
86	}
87}