Skip to main content

acoustic_engine/
grid.rs

1// SPDX-License-Identifier: GPL-2.0-or-later
2
3/// Grille 2D de `f32` stockée en ligne-majeure (`index = y * nx + x`).
4#[derive(Debug, Clone)]
5pub struct Grid2D {
6    pub nx: usize,
7    pub ny: usize,
8    pub dx: f32,
9    pub dy: f32,
10    data: Vec<f32>,
11}
12
13impl Grid2D {
14    pub fn new(nx: usize, ny: usize, dx: f32, dy: f32) -> Self {
15        Self {
16            nx,
17            ny,
18            dx,
19            dy,
20            data: vec![0.0; nx * ny],
21        }
22    }
23
24    #[inline(always)]
25    pub fn index(&self, x: usize, y: usize) -> usize {
26        y * self.nx + x
27    }
28
29    #[inline]
30    pub fn get(&self, x: usize, y: usize) -> f32 {
31        self.data[self.index(x, y)]
32    }
33
34    #[inline]
35    pub fn set(&mut self, x: usize, y: usize, val: f32) {
36        let idx = self.index(x, y);
37        self.data[idx] = val;
38    }
39
40    pub fn fill(&mut self, val: f32) {
41        self.data.fill(val);
42    }
43
44    /// Lecture seule des données brutes (export, rendu, boucles rapides).
45    #[inline]
46    pub fn as_slice(&self) -> &[f32] {
47        &self.data
48    }
49
50    /// Écriture sur les données brutes.
51    #[inline]
52    pub fn as_mut_slice(&mut self) -> &mut [f32] {
53        &mut self.data
54    }
55
56    /// Ligne `y` en lecture seule.
57    #[inline]
58    pub fn row(&self, y: usize) -> &[f32] {
59        &self.data[y * self.nx..(y + 1) * self.nx]
60    }
61}