// ๐ŸŒŠ ์™ธ๋ถ€ ์‹ค์‹œ๊ฐ„ ์‹ ํ˜ธ ๋ฐ ํŒŒ๋™ ์ฃผ์ž… ๋ชจ๋“ˆ (src/live_streamer.rs) use std::f32::consts::PI; pub struct LiveSignalStreamer { pub time: f32, pub frequency: f32, } impl LiveSignalStreamer { pub fn new(freq: f32) -> Self { LiveSignalStreamer { time: 0.0, frequency: freq } } /// ์‹ค์‹œ๊ฐ„ ์‹œ๊ณ„์—ด ๊ณ ์กฐํŒŒ(Harmonics) ์‹ ํ˜ธ ์ƒ์„ฑ pub fn generate_harmonic_wave(&mut self, size: usize) -> Vec { self.time += 0.05; let mut wave = Vec::with_capacity(size * size); for y in 0..size { for x in 0..size { let dx = (x as f32) / (size as f32) * 2.0 - 1.0; let dy = (y as f32) / (size as f32) * 2.0 - 1.0; let dist = (dx * dx + dy * dy).sqrt(); // ์ค‘์‹ฌ์—์„œ ํผ์ ธ๋‚˜๊ฐ€๋Š” ์‚ฌ์ธํŒŒ + ๊ณ ์ฃผํŒŒ ๊ฐ„์„ญ let signal = (dist * self.frequency * 2.0 * PI - self.time * 5.0).sin() * 0.8; wave.push(signal); } } wave } /// ํŠน์ • ์ขŒํ‘œ์— ์ˆœ๊ฐ„์ ์ธ ์™ธ๋ถ€ ์—๋„ˆ์ง€ ์ถฉ๊ฒฉํŒŒ(Impulse) ์ฃผ์ž… pub fn inject_shockwave(grid: &mut [f32], size: usize, center_x: usize, center_y: usize, energy: f32) { if center_x < size && center_y < size { let idx = center_y * size + center_x; grid[idx] += energy; } } }