diff --git a/src/data.rs b/src/data.rs index 3c3854d..1a523ad 100644 --- a/src/data.rs +++ b/src/data.rs @@ -1,6 +1,8 @@ -use ndarray::{array, s, Array, Array1, Array2, Array3, ArrayBase, ArrayView2, Ix2}; +use ndarray::{ + array, s, Array, Array1, Array2, Array3, ArrayBase, ArrayView2, Ix2, OwnedRepr, ViewRepr, +}; use num_traits::{AsPrimitive, FromPrimitive, Num, ToPrimitive}; -use quadtree_rs::Quadtree; +use quadtree_rs::{area::AreaBuilder, Quadtree}; use std::{self, borrow::Borrow, f64::consts::PI}; use thiserror::Error; @@ -24,10 +26,11 @@ pub enum CoorType { LatLon, } +#[derive(Clone)] pub struct RadarData2d where T: Num + Clone, - Raw: ndarray::Data, + Raw: ndarray::Data + Clone + ndarray::RawDataClone, X: Num, Y: Num, { @@ -57,8 +60,17 @@ trait MultiDimensionData { impl RadarData2d where T: Num + AsPrimitive + FromPrimitive + Clone, - Raw: ndarray::Data, + Raw: ndarray::Data + Clone + ndarray::RawDataClone, { + fn value_to_owned(self) -> RadarData2d> { + RadarData2d { + dim1: self.dim1, + dim2: self.dim2, + data: self.data.to_owned(), + coord_type: self.coord_type, + } + } + fn resample( &self, width_rate: f64, @@ -85,6 +97,7 @@ where fn split(&self) -> [RadarData2d>; 4] { let middle_dim1 = self.dim1.len() / 2; let middle_dim2 = self.dim2.len() / 2; + let lt = self.data.slice(s![..middle_dim1, ..middle_dim2]); let rt = self.data.slice(s![middle_dim1.., ..middle_dim2]); let lb = self.data.slice(s![..middle_dim1, middle_dim2..]); @@ -167,22 +180,42 @@ fn windowed_sinc(x: f64, y: f64) -> f64 { sinc * window } -// pub struct LevelData { -// levels: Vec>, -// } +pub struct LevelData<'a, T> +where + T: Num + Clone, +{ + tree: Quadtree>>, +} -// impl LevelData { -// fn new(levels: Vec>) -> Self { -// let mut qt = Quadtree::>::new(levels.len()); -// Self { levels } -// } -// } +impl<'a, T> LevelData<'a, T> +where + T: Num + Clone + AsPrimitive + FromPrimitive, +{ + fn value( + level_data: Vec>>, + level_num: usize, + ) -> Vec>> { + + if level_num == 0 { + return level_data; + } + + let mut result: Vec>> = + Vec::with_capacity(level_data.len() * 4); + let a = level_data.first().unwrap().split(); + + result.extend(a.into_iter().map(|x| x.value_to_owned())); + + return Self::value(result, level_num - 1); + } + +} // impl + FromPrimitive> MultiDimensionData for RadarData2d { -// // fn levels(&self, levels: usize) -> Self { -// // let a: Vec<_> = Array1::linspace(0.0, 1.0, levels) -// // .into_iter() -// // .map(|scale| self.resample(scale, scale, 3.0)) -// // .collect(); -// // } +// fn levels(&self, levels: usize) -> Self { +// let a: Vec<_> = Array1::linspace(0.0, 1.0, levels) +// .into_iter() +// .map(|scale| self.resample(scale, scale, 3.0)) +// .collect(); +// } // }