3个版本
0.1.2 | 2023年3月20日 |
---|---|
0.1.1 | 2023年3月18日 |
0.1.0 | 2023年3月17日 |
在 地理空间 类别中排名第127
每月下载量33次
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 |
限制
- 只支持一个折线。对于多个折线,需要预处理。
- 不支持重复的点。(尚不支持)
示例
一个带孔的正方形
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