iShapeTriangulation 1.0.2

iShapeTriangulation 1.0.2

Nail Sharipov 维护。



  • Nail Sharipov

iShapeTriangulation

复杂多边形三角剖分、镶嵌和分割为凸多边形。这是一个基于 "单调多边形三角剖分" 的快速 O(n*log(n)) 算法。结果可以表示为 Delaunay 三角剖分。

Delaunay 三角剖分

分割为凸多边形

附加点的三角剖分

镶嵌

质心网络

特性

💡基于“单形多边形分割”的快速 O(n*log(n)) 算法

💡全部代码根据“面向数据设计”进行编写。没有类等引用类型,只有结构体。

💡支持有孔的多边形

💡支持简单和Delaunay分割

💡支持镶嵌

💡支持分割成凸多边形

💡支持构建质心网络

💡相同的点不受限制

💡多边形不得有自交

💡使用整数几何进行计算

💡超过100个测试


基本用法

添加导入

import iGeometry
import iShapeTriangulation

之后需要将多边形表示为顶点的数组,顶点按照顺时针方向排列。以下是一个奶酪多边形的示例。

    let path = [
        // vertices listed in clockwise direction
        Point(x: 0, y: 20),       // 0
        Point(x: 8, y: 10),       // 1
        Point(x: 7, y: 6),        // 2
        Point(x: 9, y: 1),        // 3
        Point(x: 13, y: -1),      // 4
        Point(x: 17, y: 1),       // 5
        Point(x: 26, y: -7),      // 6
        Point(x: 14, y: -15),     // 7
        Point(x: 0, y: -18),      // 8
        Point(x: -14, y: -15),    // 9
        Point(x: -25, y: -7),     // 10
        Point(x: -18, y: 0),      // 11
        Point(x: -16, y: -3),     // 12
        Point(x: -13, y: -4),     // 13
        Point(x: -8, y: -2),      // 14
        Point(x: -6, y: 2),       // 15
        Point(x: -7, y: 6),       // 16
        Point(x: -10, y: 8)       // 17
    ]

然后获取 Triangulator 类的实例,用多边形分割。作为结果,您将得到顶点数组上的索引数组。其中每个三元组代表一个三角形顶点的索引。

    let triangulator = Triangulator()
    if let triangles = try? triangulator.triangulateDelaunay(points: path) {
        for i in 0..<triangles.count / 3 {
            let ai = triangles[3 * i]
            let bi = triangles[3 * i + 1]
            let ci = triangles[3 * i + 2]
            print("triangle \(i): (\(ai), \(bi), \(ci))")
        }
    }

三元组总是按照顺时针方向列出顶点。

让我们看看一个带有孔的多边形示例。现在您需要将孔表示为一个顶点的数组,顶点按照逆时针方向排列。

    let hole = [
        // vertices listed in counterclockwise direction
        Point(x: 2, y: 0),    // 18
        Point(x: -2, y: -2),  // 19
        Point(x: -4, y: -5),  // 20
        Point(x: -2, y: -9),  // 21
        Point(x: 2, y: -11),  // 22
        Point(x: 5, y: -9),   // 23
        Point(x: 7, y: -5),   // 24
        Point(x: 5, y: -2)    // 25
    ]
    
    let points = path + hole
    if let triangles = try? triangulator.triangulateDelaunay(points: points, hull: points[0..<path.count], holes: [points[path.count..<points.count]], extraPoints: nil) {
        for i in 0..<triangles.count / 3 {
            let ai = triangles[3 * i]
            let bi = triangles[3 * i + 1]
            let ci = triangles[3 * i + 2]
            print("triangle \(i): (\(ai), \(bi), \(ci))")
        }
    }

---

安装

添加导入

import iGeometry
import iShapeTriangulation

通过 CocoaPods 安装

将以下内容添加到您的 Podfile

pod 'iShapeTriangulation'

Cartage

将以下内容添加到您的 Cartfile

github "iShape-Swift/iShapeTriangulation"

Package Manager

将以下内容添加到您的 Package.swift

let package = Package(
    name: "[your name]",
    products: [
        dependencies: [
            .package(url: "https://github.com/iShape-Swift/iShapeTriangulation", from: "1.0.0")
        ],
        targets: [
            .target(
                name: "[your target]",
                dependencies: ["iShapeTriangulation"])
        ]
    ]
)

或者直接通过 .xcodeproj 添加