#delaunay-triangulation #polygon #complex #shapes #convex #resolution #advanced

i_triangle

多边形三角剖分库:高效处理复杂形状的Delaunay三角剖分

32个版本 (破坏性)

0.25.1 2024年8月5日
0.25.0 2024年7月13日
0.24.1 2024年6月19日
0.19.1 2024年3月31日
0.2.0 2023年11月16日

#300 in 算法

Download history 288/week @ 2024-04-22 169/week @ 2024-04-29 123/week @ 2024-05-06 152/week @ 2024-05-13 152/week @ 2024-05-20 13/week @ 2024-05-27 12/week @ 2024-06-03 17/week @ 2024-06-10 155/week @ 2024-06-17 3/week @ 2024-06-24 113/week @ 2024-07-08 17/week @ 2024-07-15 2/week @ 2024-07-22 5/week @ 2024-07-29 134/week @ 2024-08-05

每月181次下载
bevy_logic中使用

MIT许可

57KB
1.5K SLoC

iTriangle

A fast and efficient library for Delaunay triangulation and converting complex polygons into convex shapes, including advanced self-intersection resolution.

Delaunay三角剖分

分解为凸多边形

特性

  • Delaunay三角剖分: 高效且稳健的Delaunay三角剖分生成实现。
  • 凸多边形: 将复杂多边形分解为更简单的凸多边形。
  • 自相交: 使用偶-奇或非零规则智能解决相交问题。

文档

入门

将以下内容添加到您的Cargo.toml中

[dependencies]
i_triangle = "^0.25.0"

之后,将您的多边形表示为顶点数组。以下是一个奶酪多边形的示例

let shape = [
    [ // body
        F64Point::new(0.0, 20.0),    // 0
        F64Point::new(8.0, 10.0),    // 1
        F64Point::new(7.0, 6.0),     // 2
        F64Point::new(9.0, 1.0),     // 3
        F64Point::new(13.0, -1.0),   // 4
        F64Point::new(17.0, 1.0),    // 5
        F64Point::new(26.0, -7.0),   // 6
        F64Point::new(14.0, -15.0),  // 7
        F64Point::new(0.0, -18.0),   // 8
        F64Point::new(-14.0, -15.0), // 9
        F64Point::new(-25.0, -7.0),  // 10
        F64Point::new(-18.0, 0.0),   // 11
        F64Point::new(-16.0, -3.0),  // 12
        F64Point::new(-13.0, -4.0),  // 13
        F64Point::new(-8.0, -2.0),   // 14
        F64Point::new(-6.0, 2.0),    // 15
        F64Point::new(-7.0, 6.0),    // 16
        F64Point::new(-10.0, 8.0)    // 17
    ].to_vec(),
    [ // hole
        F64Point::new(2.0, 0.0),     // 18
        F64Point::new(-2.0, -2.0),   // 19
        F64Point::new(-4.0, -5.0),   // 20
        F64Point::new(-2.0, -9.0),   // 21
        F64Point::new(2.0, -11.0),   // 22
        F64Point::new(5.0, -9.0),    // 23
        F64Point::new(7.0, -5.0),    // 24
        F64Point::new(5.0, -2.0)     // 25
    ].to_vec()
].to_vec();

let triangulation = shape.to_triangulation(Some(FillRule::NonZero), 0.0);

println!("points: {:?}", triangulation.points);
println!("indices: {:?}", triangulation.indices);

输出三角剖分: 三角形索引和顶点,其中所有三角形按顺时针方向排列。

依赖

~0.6–1.2MB
~27K SLoC