iShapeTriangulation
复杂多边形三角剖分、镶嵌和分割为凸多边形。这是一个基于 "单调多边形三角剖分" 的快速 O(n*log(n)) 算法。结果可以表示为 Delaunay 三角剖分。
Delaunay 三角剖分
分割为凸多边形
附加点的三角剖分
镶嵌
质心网络
特性
基本用法
添加导入
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 添加