wip: Spacial index coming along pretty well, some tests and documentation left to write and should be good to go
This commit is contained in:
parent
c4cbef68d9
commit
996f83e92a
@ -5,6 +5,7 @@ pub use point::*;
|
|||||||
mod space_colonization;
|
mod space_colonization;
|
||||||
pub use space_colonization::*;
|
pub use space_colonization::*;
|
||||||
mod math;
|
mod math;
|
||||||
|
mod spacial_index;
|
||||||
|
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|||||||
110
src/space_colonization/spacial_index.rs
Normal file
110
src/space_colonization/spacial_index.rs
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
use super::Point;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct SpatialIndex<T> {
|
||||||
|
elements: Vec<Vec<T>>,
|
||||||
|
number_cells_x: i32,
|
||||||
|
cell_size: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> SpatialIndex<T> {
|
||||||
|
pub fn new(max_point: Point, cell_size: i32) -> SpatialIndex<T> {
|
||||||
|
// Here we add 1 to number cells x and y to handle the right and bottom edges where
|
||||||
|
// x = max_point.x or y = max_point.y
|
||||||
|
// For example, with max_point of (100,100)
|
||||||
|
// the point 100,100 is valid but 100/10 = 10, which is out of bounds of a zero based
|
||||||
|
// array of length 10. So we add 1 to the length and 10 is a valid index in a zero based
|
||||||
|
// array of length 11
|
||||||
|
let number_cells_x = (max_point.x / cell_size) + 1;
|
||||||
|
let number_cells = number_cells_x * ((max_point.y / cell_size) + 1);
|
||||||
|
let mut elements = Vec::with_capacity(number_cells as usize);
|
||||||
|
for _ in 0..number_cells {
|
||||||
|
elements.push(Vec::new());
|
||||||
|
}
|
||||||
|
SpatialIndex {
|
||||||
|
elements,
|
||||||
|
cell_size,
|
||||||
|
number_cells_x,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Adds an element in the cell of point
|
||||||
|
///
|
||||||
|
/// panics if the point is outside of
|
||||||
|
pub fn add(&mut self, point: &Point, element: T) {
|
||||||
|
let element_index = self.get_index_from_position(point);
|
||||||
|
dbg!(element_index);
|
||||||
|
self.elements
|
||||||
|
.get_mut(element_index as usize)
|
||||||
|
.unwrap()
|
||||||
|
.push(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_surrounding_elements<'a>(&'a self, point: &Point) -> Vec<&'a Vec<T>> {
|
||||||
|
let element_index = self.get_index_from_position(point);
|
||||||
|
dbg!(element_index);
|
||||||
|
vec![&self.elements[element_index]]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_index_from_position(&self, point: &Point) -> usize {
|
||||||
|
((point.x / self.cell_size) + ((point.y / self.cell_size) * self.number_cells_x)) as usize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn when_no_element_surrounding_nodes_returns_empty_vec() {
|
||||||
|
let index: SpatialIndex<usize> = SpatialIndex::new(Point::new((100, 100)), 10);
|
||||||
|
assert_eq!(
|
||||||
|
index.get_surrounding_elements(&Point::new((0, 0))),
|
||||||
|
vec![&Vec::<usize>::new()]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn added_point_is_surrounding_itself() {
|
||||||
|
let mut index: SpatialIndex<usize> = SpatialIndex::new(Point::new((100, 100)), 10);
|
||||||
|
index.add(&Point::new((50, 50)), 132);
|
||||||
|
assert_eq!(
|
||||||
|
index.get_surrounding_elements(&Point::new((50, 50))),
|
||||||
|
vec![&vec![132]]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn adding_point_outside_grid_panics() {
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn point_on_top_edge_is_close_to_first_cell() {
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn point_on_bottom_edge_is_close_to_first_cell() {
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn point_on_right_edge_is_close_to_first_cell() {
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn point_on_left_edge_is_close_to_first_cell() {
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn when_elements_too_far_surrounding_is_empty() {
|
||||||
|
let mut index: SpatialIndex<usize> = SpatialIndex::new(Point::new((100, 100)), 10);
|
||||||
|
index.add(&Point::new((0, 0)), 132);
|
||||||
|
assert_eq!(
|
||||||
|
index.get_surrounding_elements(&Point::new((99, 99))),
|
||||||
|
vec![&Vec::<usize>::new()]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user