#delaunay-triangulation #triangulation #mesh #constrained #cpp #points #idiomatic

poly2tri-rs

一种规范且快速的约束Delaunay三角剖分库

3个版本

0.1.2 2023年3月20日
0.1.1 2023年3月18日
0.1.0 2023年3月17日

地理空间 类别中排名第127

每月下载量33

MIT/Apache

440KB
3K SLoC

poly2tri-rs

这是一个规范且快速的(不仅因为语言)rust 版本的 poly2tri c++ 项目的移植。它可以在多边形上计算CDT(约束Delaunay三角剖分)。

安装

将以下内容添加到 cargo.toml 中

[dependencies]
poly2tri-rs = "0.1"

或者

cargo add poly2tri-rs

功能

  • 多孔和Steiner点
  • 快速
  • 测试覆盖率,有稳定和随机测试(prop测试)。实际上发现并修复了cpp库中的几个错误。

性能

引入了一些性能优化,以满足cpp版本,而不破坏类型系统。

写作时的计时在我的m1 mbp上

示例 poly2tri-rs poly2tri (cpp) 点数
bird 0.08ms 0.17ms 275
调试 0.06ms 0.14ms 200
nazca_heron 0.4ms 0.55ms 1036
nazca_monkey 0.52ms 0.76ms 1204

限制

  • 只支持一个折线。对于多个折线,需要预处理。
  • 不支持重复的点。(尚不支持)

示例

一个带孔的正方形

Picture

cargo run --example square && open square_with_hole.svg

示例代码

fn example() {
    // randomly generate steinier points (point with no edge)
    let mut points = Vec::<Point>::new();
    for _ in 0..100 {
        let x: f64 = rand::thread_rng().gen_range(0.0..800.);
        let y: f64 = rand::thread_rng().gen_range(0.0..800.);
        points.push(Point::new(x, y));
    }

    // outer square
    let builder = SweeperBuilder::new(vec![
        Point::new(-10., -10.),
        Point::new(810., -10.),
        Point::new(810., 810.),
        Point::new(-10., 810.),
    ])
    .add_steiner_points(points)
    // square hole
    .add_hole(vec![
        Point::new(400., 400.),
        Point::new(600., 400.),
        Point::new(600., 600.),
        Point::new(400., 600.),
    ]);

    // consume builder and grab a sweeper
    let sweeper = builder.build();

    // triangulate with cdt
    let triangles = sweeper.triangulate();

    // draw
    draw(triangles, "square_with_hole.svg".into());
}

从poly2tri的测试平台中提取测试数据

# clone repos
git clone [email protected]:jhasse/poly2tri.git
git clone [email protected]:shuoli84/poly2tri-rs.git

cd poly2tri-rs
cargo run --example draw --release -- --path ../poly2tri/testbed/data/funny.dat --output funny.svg 

# open the svg
open funny.svg

依赖项

~0.8–1.2MB
~20K SLoC