use flannrust::{ConstDim, KdTreeBuilder, ResultItem};
fn main() {
let mut state: u64 = 42;
let mut next = move || {
state ^= state << 13;
state ^= state >> 7;
state ^= state << 17;
(state >> 11) as f64 / (1u64 << 53) as f64 * 20.0 - 10.0
};
let pts: Vec<[f64; 3]> = (0..1000).map(|_| [next(), next(), next()]).collect();
let tree = KdTreeBuilder::new(ConstDim::<3>, pts.as_slice()).build();
let query = [0.0, 0.0, 0.0];
let mut indices = [0u32; 5];
let mut dists = [0.0f64; 5];
let found = tree.knn_search(&query, &mut indices, &mut dists);
println!("knn: {found} nearest neighbors of {query:?}:");
for (i, d) in indices.iter().zip(&dists) {
println!(" index {i:4} squared distance {d:.6}");
}
let mut out: Vec<ResultItem<u32, f64>> = Vec::new();
let n = tree.radius_search(&query, 4.0, &mut out);
println!("radius: {n} points within squared distance 4.0");
for item in out.iter().take(5) {
println!(
" index {:4} squared distance {:.6}",
item.index, item.distance
);
}
}