#碰撞检测 #碰撞 #盒子 # # #宽相 #aa-bb

box_intersect_ze

使用Zomorodian和Edelsbrunner的混合算法(带有剪枝和扫描的流式段树)实现的宽相碰撞检测

2个版本

0.1.1 2023年5月28日
0.1.0 2021年4月23日

#869 in 游戏开发

每月 22 次下载

GPL-3.0-or-later

33KB
603

box_intersect_ze

Latest version Documentation

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