9 个版本

使用旧的 Rust 2015

0.2.0 2020年7月3日
0.1.2 2017年2月26日
0.1.1 2017年1月13日
0.0.6 2015年5月29日
0.0.1 2014年12月8日

#1166算法


被用于 dagon

MPL-2.0 许可证

57KB
1K SLoC

Build Status

acacia 是一个用 Rust 编写的空间树库。它对划分空间的维度是泛型的,因此支持二叉树、四叉树、八叉树等。目标是尽可能快地实现这些功能,覆盖尽可能多的用例,而不牺牲抽象。

项目的当前状态非常实验性。它工作良好,并具有充分的测试覆盖率,但 API 和内部结构将来很可能会改变,以提高接口和性能。

功能

  • 从简单的迭代器构建树。
  • 在构建过程中使用闭包将数据关联到树。
  • 在树上进行任意的计算查询。

示例:N体引力计算

引力计算是加速空间树计算的一个相当常见的例子。以下是一个简单的示例,用于计算一组引力粒子之间给定点的引力加速度。此处提供的代码是从可以在 example/gravity 目录中找到的完整示例中摘录的。

可以从粒子的迭代器和一些关于其几何形状的数据构建树。

let tree = Tree::new(
    particles.iter(),
    Ncube::new(origin, 11.0),

请注意,粒子实现了用于定义类型具有位置的概念的 Position 特性。

接下来,我们需要一些值和闭包来将数据与树中的每个节点关联起来:一个用于空节点的值,一个闭包,用于根据存储在其中的对象分配一个值给叶节点,以及一个闭包,用于将两个关联数据项组合起来,以计算分支节点的值。

    (origin, 0.0),
    &|obj| (obj.position, obj.mass),
    &|&(com1, m1), &(com2, m2)|
        if m1 + m2 > 0.0 {
            (com1 + (com2 - com1) * (m2 / (m1 + m2)), m1 + m2)
        } else {
            (origin, 0.0)
        }
);

在此示例中,关联数据是由节点的质心和总质量组成的元组。

现在,我们可以通过传递两个闭包到其 query_data 方法来向树发出计算查询:第一个用作递归的标准。如果一个分支节点通过这个标准,查询将继续在它的子节点上继续。第二个用于收集树在递归过程中遇到的每个关联数据项的力项。

let mut tree_gravity: Vec3<f64> = zero();
tree.query_data(
    &|node| {
        let &(ref center_of_mass, _) = node.data();
        let d = test_point.dist(center_of_mass);
        let delta: f64 = node.partition().center().dist(center_of_mass);
        d < 2.0 * node.partition().width() + delta
    },

    &mut |&(center_of_mass, mass)| {
        tree_gravity = tree_gravity + newton(mass, center_of_mass, test_point);
    },
);

许可证

此源代码形式受 Mozilla 公共许可证第 2.0 版的条款约束。如果没有随此文件一起分发 MPL 的副本,您可以在 http://mozilla.org/MPL/2.0/ 获取一个副本。

依赖项

约 4.5MB
~87K SLoC