use crate::field::FractalField;
use crate::graphedge::GraphEdge;
use crate::traits::Generator;
use crate::vec3::Vec3;
use num_complex::Complex;
use rand::Rng;
pub struct RandomFieldGenerator {
pub count: usize,
pub mutation_strength: f32,
}
impl Generator for RandomFieldGenerator {
fn generate(&self) -> Vec<FractalField> {
let mut rng = rand::rng();
(0..self.count)
.map(|_| {
let edges = (0..5) .map(|_| GraphEdge {
origin: Vec3::random(),
direction: Vec3::X,
length: 1.0,
depth: rng.random_range(0..5),
data: Complex::new(rng.random_range(-1.0..1.0), rng.random_range(-1.0..1.0)),
})
.collect();
FractalField { edges }
})
.collect()
}
fn mutate(&self, field: &FractalField) -> Vec<FractalField> {
let mut rng = rand::rng();
(0..self.count)
.map(|_| {
let edges = field
.edges
.iter()
.map(|e| {
let (amp, phase) = e.data.to_polar();
let amp_mut = amp + rng.random_range(-self.mutation_strength..self.mutation_strength);
let phase_mut = phase + rng.random_range(-self.mutation_strength..self.mutation_strength);
GraphEdge {
data: Complex::from_polar(amp_mut.max(0.0), phase_mut), ..*e
}
})
.collect();
FractalField { edges }
})
.collect()
}
}