blob: 5fcd176f0267325312a1167dc1fdadc0f92e82cf [file] [log] [blame]
use crate::spatial::cache::{HierThomasCache, ThomasCache};
use crate::spatial::distributions::*;
use crate::spatial::{DistributionType, SpatialConfig};
use geo::Geometry;
use std::sync::OnceLock;
#[derive(Clone, Debug)]
pub struct SpatialGenerator {
pub config: SpatialConfig,
pub thomas_cache: OnceLock<ThomasCache>,
pub hier_cache: OnceLock<HierThomasCache>,
}
impl SpatialGenerator {
pub fn new(
config: SpatialConfig,
thomas_cache: OnceLock<ThomasCache>,
hier_cache: OnceLock<HierThomasCache>,
) -> Self {
Self {
config,
thomas_cache,
hier_cache,
}
}
pub fn generate(&self, index: u64, continent_affine: &[f64; 6]) -> Geometry {
match self.config.dist_type {
DistributionType::Uniform => generate_uniform(index, &self.config, continent_affine),
DistributionType::Normal => generate_normal(index, &self.config, continent_affine),
DistributionType::Diagonal => generate_diagonal(index, &self.config, continent_affine),
DistributionType::Bit => generate_bit(index, &self.config, continent_affine),
DistributionType::Sierpinski => {
generate_sierpinski(index, &self.config, continent_affine)
}
DistributionType::Thomas => {
generate_thomas(index, &self.config, &self.thomas_cache, continent_affine)
}
DistributionType::HierarchicalThomas => generate_hierarchical_thomas(
index,
&self.config,
&self.hier_cache,
continent_affine,
),
}
}
}