2个版本
0.1.1 | 2023年5月28日 |
---|---|
0.1.0 | 2021年4月23日 |
#869 in 游戏开发
每月 22 次下载
33KB
603 行
box_intersect_ze
box_intersect_ze是一个宽相碰撞检测库,实现了Afra Zomorodian和Herbert Edelsbrunner在论文《快速盒子交集软件》中描述的算法。该算法使用流式段树、剪枝和扫描。
它非常适合视频游戏,因为在游戏中边界框经常变化,内存中保留的任何空间数据结构都可能会频繁失效。
该算法需要一个随机数生成器。通过rand-crate
可选功能,您可以使用rand crate中的任何RNG,或者如果您不想有依赖关系,您可以为您自己的RNG实现Rng
trait。
示例
use box_intersect_ze::set::BBoxSet;
use box_intersect_ze::boxes::Box3Df32;
use rand_chacha::ChaCha8Rng;
use rand::SeedableRng;
// create some boxes
let box0 = Box3Df32::new([0.0, 0.0, 0.0], [10.0, 10.0, 10.0]);
let box1 = Box3Df32::new([5.0, 5.0, 5.0], [15.0, 15.0, 15.0]);
let box2 = Box3Df32::new([10.0, 10.0, 10.0], [20.0, 20.0, 20.0]);
// add them to a BBoxSet
let mut boxes = BBoxSet::with_capacity(3);
boxes.push(0, box0);
boxes.push(1, box1);
boxes.push(2, box2);
boxes.sort(); // sort it in dimension 0
// set capacity according to expected number of intersections to avoid resizing
let mut result = Vec::with_capacity(2);
// get the intersections
box_intersect_ze::intersect_ze(&boxes, &boxes, &mut result, &mut ChaCha8Rng::seed_from_u64(1234));
assert!(result.contains(&(1,0)));
assert!(result.contains(&(2,1)));
assert!(!result.contains(&(2,0)));
assert!(!result.contains(&(0,2)));
依赖项
~72KB