5个版本 (1个稳定版)
1.0.0 | 2021年4月5日 |
---|---|
1.0.0-pre.4 | 2021年2月22日 |
1.0.0-pre.2 | 2020年10月28日 |
825 在 算法 中
115KB
1K SLoC
Rust库,用于在多维度中采样泊松点分布。
泊松点分布产生样本,其中任意两个样本之间距离较远。这比纯随机采样产生了更加均匀的分布。
此库实现了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