#计算几何 #几何 #算术 #鲁棒 #谓词 #精确

geometry-predicates

Rust 版本的鲁棒几何谓词

6 个版本

使用旧的 Rust 2015

0.3.0 2021年2月10日
0.2.1 2021年1月29日
0.1.2 2018年8月25日
0.1.1 2017年9月3日

#304算法

Download history 752/week @ 2024-03-13 791/week @ 2024-03-20 367/week @ 2024-03-27 785/week @ 2024-04-03 802/week @ 2024-04-10 861/week @ 2024-04-17 775/week @ 2024-04-24 731/week @ 2024-05-01 895/week @ 2024-05-08 991/week @ 2024-05-15 807/week @ 2024-05-22 883/week @ 2024-05-29 958/week @ 2024-06-05 1158/week @ 2024-06-12 1317/week @ 2024-06-19 1107/week @ 2024-06-26

4,698 每月下载次数
7 仓库中使用 (3 个直接使用)

MIT 许可证

1MB
20K SLoC

Rust 17K SLoC // 0.1% comments C 3K SLoC // 0.2% comments

geometry-predicates

"自适应精度浮点数算术和快速鲁棒几何谓词"的安全 Rust 实现

Build Status Documentation Version License Downloads

此库提供了用于计算几何中广泛使用的有效精确几何谓词的 Rust 解决方案。

以下谓词在根级别公开

  • orient2d
  • incircle
  • orient3d
  • insphere

以及它们的近似(不精确)对应物

  • orient2d_fast
  • incircle_fast
  • orient3d_fast
  • insphere_fast

此外,这些谓词的构建块,即自适应精度浮点数算术原语也被公开,以便扩展到其他谓词或精确几何构造。

此库支持使用标准 IEEE 754 浮点数的 no-std 目标。

背景

这些谓词已经是在计算几何中多年的基本组成部分,并在工业界得到广泛使用。在几何算法的背景下,确定点相对于线(或平面)的方向以及点是否在圆(或球)内部常常是至关重要的。这些测试通常需要精确的原因是因为许多几何算法都会问一些问题(为了确定方向或在圆/球内)关于点配置,这些问题需要一致的答案。例如,如果 abc 是二维平面上三个点,询问 b 相对于通过 ac 的线的位置(左侧、右侧或重合)与询问 a 相对于通过 cb 的线的位置是相同的。形式上,这个条件可以写成

sgn(orient2d(a,c,b)) == sgn(orient2d(c,b,a))

从数学上讲,像 orient2d 这样的谓词被定义为

                                        ⎛⎡ax ay 1⎤⎞
orient2d([ax,ay],[bx,by],[cx,cy]) := det⎜⎢bx by 1⎥⎟
                                        ⎝⎣cx cy 1⎦⎠

很容易看出,这些谓词解决了计算小矩阵行列式的问题,并且无论矩阵多么接近奇异,都可以得到正确的符号。

例如,为了计算矩阵 [a b; c d] 的行列式并得到正确的符号,我们可以调用

orient2d([a,b], [c,d], [0,0])

有关更多详细信息,请参阅 Jonathan Shewchuk 的原始网页,其中包含这些谓词。

注意事项

这些谓词不处理指数溢出 [1],这意味着小于 1e-142 或大于 1e201 的浮点数输入可能不会产生准确的结果。这同样适用于 predicates.c 中的原始谓词以及其他对这些谓词的 Rust 端口和绑定。

参考文献

致谢

这个端口最初是由一个名为 Corrode 的 C 到 Rust 转换器创建的。没有它,将这个库完整地转换为 Rust 将是一项艰巨的任务。在此,我特别感谢 Corrode 的作者提供了这样一个有用的工具。这个crate的0.2版本使用了 c2rust crate。同样的感激之情也献给 C2Rust 的开发者。

无运行时依赖