5个版本 (1个稳定版)

1.0.0 2021年4月5日
1.0.0-pre.42021年2月22日
1.0.0-pre.22020年10月28日

825算法

BlueOak-1.0.0

115KB
1K SLoC

crates.io Documentation

Rust库,用于在多维度中采样泊松点分布。

泊松点分布产生样本,其中任意两个样本之间距离较远。这比纯随机采样产生了更加均匀的分布。

Example of generated samples

此库实现了Robert Bridson [1]提出的算法,该算法在生成N个样本时为O(N)。也就是说,采样时间随产生的样本数量线性增长。对于二维采样,采样时间随面积增长;对于三维采样,采样时间随体积增长。

使用方法

有关库的更多信息,请参阅文档

设置

将库作为项目依赖项添加到Cargo.toml

[dependencies]
#
poisson-diskus = "1.0.0"

1.0.0开始,由于使用了const泛型,最低支持的Rust版本为1.51。预发布版本(直到1.0.0-pre.4)支持Rust的早期版本。

采样点

为了采样,Bridson算法需要以下参数:

  • box_size:区域的大小,作为一个D维数组
  • rmin:两个采样点之间的最小距离
  • k:围绕生成的点的采样尝试次数(建议值为30,增加可略微提高采样质量)
  • use_pbc:区域是否连接到对面,算法是否应在此连接处寻找冲突

采样点以标准向量形式返回 Vec<[f64; D]>,其中每个点都是类型 [f64; D]:一个具有每个轴坐标的 D 维数组。维度 D 与给定的 box_size 相同。

use poisson_diskus::bridson;

let box_size = [3.0, 5.0, 7.0];
let rmin = 0.5;
let k = 30;
let use_pbc = false;

let coords: Vec<[f64; 3]> = bridson(&box_size, rmin, k, use_pbc).unwrap();

更多维度

该算法可以在任意数量的维度中进行采样,尽管速度非常慢。

use poisson_diskus::bridson;

let box_size = [3.0, 5.0, 3.0, 2.0, 1.0];
let rmin = 1.0;
let k = 30;
let use_pbc = false;

let coords: Vec<[f64; 5]> = bridson(&box_size, rmin, k, use_pbc).unwrap();

周期性边界条件

使用 use_pbc 参数来控制算法是否应在空间周期图像的最小距离内查找邻居。这会慢一些:在二维和三维中,对于相同数量的生成点,大约慢 25%-50%。

关于精度的说明

虽然通过肉眼检查生成的结果看起来不错,但生成的分布尚未经过验证以确保准确性。目前,计算样本的径向密度分布显示出一些奇怪的行为。

简而言之,我目前不建议在点分布至关重要的工作中使用此方法。或者,至少在使用之前检查结果。

你应该使用这个库吗?

可能不是。结果还不错(但不是很好),在合理的现代硬件上,在毫秒内生成数千个点。然而,在绝对速度测试中,该库与 C 和 Python 中的许多其他实现相比慢一个数量级。

这很可能是由于效率低下的网格搜索造成的,该搜索以递归方式实现以处理任意数量的维度。这可能或可能不会得到改善。

  • 大概速度:在 Intel 4670K 3.4GHz 的发布模式下,400 毫秒内生成 60,000 个点。

引用

[1] Bridson, R. (2007). Fast Poisson disk sampling in arbitrary dimensions. SIGGRAPH sketches, 10, 1.

许可证

本库在宽松的蓝橡树许可证下提供。有关详细信息,请参阅 LICENSE.md

依赖关系

~1MB
~21K SLoC