10 releases (1 stable)
1.0.0 | Mar 2, 2023 |
---|---|
0.7.1 | Feb 23, 2023 |
0.6.0 | May 19, 2021 |
0.5.1 | Mar 15, 2021 |
0.1.0 | Dec 22, 2020 |
#179 in Algorithms
284 downloads per month
Used in 3 crates
(2 directly)
55KB
1K
SLoC
StaticAABB2DIndex
Summary
Fast static spatial index data structure for 2D axis aligned bounding boxes utilizing hilbert curve spatial ordering. This is a rust port of the excellent flatbush javascript library.
By default no unsafe code is used (#![forbid(unsafe_code)]
is applied). Some unsafe optimizations
can be enabled by toggling on the unsafe_optimizations
flag.
Quick Links
Quick Code Example
use static_aabb2d_index::*;
// create builder for index containing 4 axis aligned bounding boxes
// index also supports integers and custom types that implement the IndexableNum trait
let mut builder: StaticAABB2DIndexBuilder<f64> = StaticAABB2DIndexBuilder::new(4);
// add bounding boxes to the index
// add takes in (min_x, min_y, max_x, max_y) of the bounding box
builder.add(0.0, 0.0, 2.0, 2.0);
builder.add(-1.0, -1.0, 3.0, 3.0);
builder.add(0.0, 0.0, 1.0, 3.0);
builder.add(4.0, 2.0, 16.0, 8.0);
// note build may return an error if the number of added boxes does not equal the static size
// given at the time the builder was created or the type used fails to cast to/from a u16
let index: StaticAABB2DIndex<f64> = builder.build().unwrap();
// query the created index (min_x, min_y, max_x, max_y)
let query_results = index.query(-1.0, -1.0, -0.5, -0.5);
// query_results holds the index positions of the boxes that overlap with the box given
// (positions are according to the order boxes were added the index builder)
assert_eq!(query_results, vec![1]);
// the query may also be done with a visiting function that can stop the query early
let mut visited_results: Vec<usize> = Vec::new();
let mut visitor = |box_added_pos: usize| -> Control<()> {
visited_results.push(box_added_pos);
// return continue to continue visiting results, break to stop early
Control::Continue
};
index.visit_query(-1.0, -1.0, -0.5, -0.5, &mut visitor);
assert_eq!(visited_results, vec![1]);
Dependencies
~150KB