#predicates #robust #geometry #points

robust-predicates

计算机几何的鲁棒谓词

5次发布

0.1.4 2022年10月20日
0.1.3 2021年11月8日
0.1.2 2021年11月8日
0.1.1 2021年11月8日
0.1.0 2020年12月26日

#594 in 数学

28每月下载量
rs_concaveman中使用

MIT许可

180KB
3.5K SLoC

C 3.5K SLoC // 0.1% comments Rust 46 SLoC // 0.0% comments

robust-predicates

来自Jonathan Schewchuk库的鲁棒几何谓词https://www.cs.cmu.edu/~quake/robust.html

此crate提供了与原始库相同的API,用于4个几何自适应谓词。它将文件编译并链接,以原样导出这些谓词,在简单的[f64;2]和[f64;3]数组上操作。

此crate可能被视为https://crates.io/crates/robust2d的简化版本。该库使用cc crate而不是gcc来编译(在https://crates.io/crates/robust2d中使用),并且不包装点结构中的[f64;2]或具有其他名称的函数。

定义的函数

fn exactinit();
fn orient2d(pa:&[f64;2], pb:&[f64;2], pc:&[f64;2]) -> f64;
fn orient3d(pa:&[f64;3], pb:&[f64;3], pc:&[f64;3], pd:&[f64;3]) -> f64;
fn incircle(pa:&[f64;2], pb:&[f64;2], pc:&[f64;2], pd:&[f64;2]) -> f64;
fn insphere(pa:&[f64;3], pb:&[f64;3], pc:&[f64;3], pd:&[f64;3], pe:&[f64;3]) -> f64;

使用方法

在使用这些谓词时,需要考虑的唯一一件事是。与Schewchuk的库一样,此crate可以在不初始化全局变量的情况下工作,因为只需要用于自适应滤波步骤(困难的情况)。因此建议,但不是强制,在使用谓词之前使用函数。

示例

// main.rs

use robust_predicates::*;

fn main() {
    exactinit();
    let points: [[f64;2];4] = [[0.0,0.0],[1.0,0.0],[0.0,1.0],[0.5,0.5]];
    let c = incircle(&points[0],&points[1],&points[2],&points[3]);
    let d = orient2d(&points[1],&points[0],&points[2]);
    println!("{}",c);
    println!("{}",d);
}

您可以使用insphereorient3d以相同的方式使用,但需要额外的参数和[f64;3]数组。

致谢

此crate的开发受到https://crates.io/crates/robust2d的很大影响。如果您正在寻找2d谓词的包装器,该crate非常出色。

您还可以在https://www.cs.cmu.edu/~quake/robust.html获取原始的文件。

无运行时依赖

~180KB