kdtree-3d-rust 1.0.0

A fast, memory-safe 3D KD-tree implementation
Documentation
use kdtree3d::{Tree, KdBox};
use std::time::Instant;

struct Lcg { state: u32 }
impl Lcg {
    fn next(&mut self) -> i32 {
        self.state = self.state.wrapping_mul(1664525).wrapping_add(1013904223);
        (self.state >> 16) as i32
    }
    fn next_range(&mut self, max: i32) -> i32 { self.next().rem_euclid(max) }
    fn next_u32(&mut self) -> u32 {
        let h = self.next() as u32;
        let l = self.next() as u32;
        (h << 16) | (l & 0xFFFF)
    }
}

fn main() {
    let mut tree = Tree::new();
    let mut rng = Lcg { state: 42 };

    let n_boxes = 1_000_000;
    let mut boxes = Vec::with_capacity(n_boxes);

    println!("Inserting {} boxes...", n_boxes);
    let start = Instant::now();
    for i in 0..n_boxes {
        let x1 = (rng.next_u32() % 1_000_000_000) as i32;
        let y1 = (rng.next_u32() % 1_000_000_000) as i32;
        let z1 = (rng.next_u32() % 1_000_000_000) as i32;
        let x2 = x1 + (rng.next_range(100) as i32) + 1;
        let y2 = y1 + (rng.next_range(100) as i32) + 1;
        let z2 = z1 + (rng.next_range(100) as i32) + 1;
        
        let b: KdBox = [x1, y1, z1, x2, y2, z2];
        boxes.push(b);
        tree.insert(i, b);
    }
    println!("Insertion took {:?}", start.elapsed());

    let search_area: KdBox = [0, 0, 0, 500_000_000, 500_000_000, 500_000_000];
    println!("Searching in area {:?}...", search_area);
    let start = Instant::now();
    let found_count = tree.start(search_area).count();
    println!("Found {} boxes in search area. Search took {:?}", found_count, start.elapsed());

    println!("Deleting 1000 items...");
    let start = Instant::now();
    for i in 0..1000 {
        tree.hard_delete(&i, &boxes[i]);
    }
    println!("Deletion took {:?}", start.elapsed());
}