use crate::{LabelFormat,LabelU16}; use avl_tree::*; #[derive(Debug)] struct Data { label: u16, area: usize, perimeter: usize, cell_cell: usize, cell_tissue: usize, } impl Data { const fn new(label: u16, area: usize, perimeter: usize, cell_cell: usize, cell_tissue: usize) -> Self { Self { label, area, perimeter, cell_cell, cell_tissue, } } } impl LabelFormat { fn get_tree(&self) -> AVLTree { let mut avt = avl_tree::AVLTree::::new(); for y in 0..self.height { for x in 0..self.width { let index = x + y * self.width; let key = self.buffer[index]; if key.is_zero() { continue; } if let Some(data) = avt.get(key) { let mut new_data = Data::new( data.label, data.area, data.perimeter, data.cell_cell, data.cell_tissue, ); new_data.area += 1; avt.insert(key, new_data); } else { avt.insert(key, Data::new(key, 1, 0, 0, 0)); } } } avt } } #[cfg(test)] mod tests { use super::*; #[test] fn get_areas_test() { const DIM: usize = 6; let mut test_data = LabelFormat:: { buffer: vec![0u16; DIM*DIM], width: DIM, height: DIM, }; test_data.buffer[2+3*DIM] = 1; test_data.buffer[3+3*DIM] = 1; test_data.buffer[4+3*DIM] = 2; for (key,val) in test_data.get_tree().iter() { println!("{} -> {:?}",key,val) } } }