iOverlay

iOverlay 是一个快速的多边形布尔运算库,支持诸如并集、交集、差集和异或等主要操作,这些操作由奇偶规则或非零规则来管理。
该库针对不同的场景进行了优化,确保在各种用例中都能实现高性能。 有关详细的性能基准测试,请查看性能比较

文档

通过交互式演示试用 iOverlay。 该演示涵盖了并集、交集、差集和互斥等操作

特性

工作范围和精度

iOverlay 库在以下范围内和精度级别内运行

扩展范围:从 -1,000,000 到 1,000,000,精度为 0.001。 推荐范围:从 -100,000 到 100,000,精度为 0.01,以获得更准确的结果。 在推荐范围内使用该库可确保计算的最佳精度,建议在大多数用例中使用。

安装

使用 Swift Package Manager 安装 iOverlay 既简单又容易。 只需按照以下步骤操作

import iOverlay

用法

以下是如何创建带孔的正方形并与其他多边形进行并集/差集/交集/异或运算的示例

var overlay = CGOverlay()

// add shape
overlay.add(path: [
    CGPoint(x:-20, y:-16),
    CGPoint(x:-20, y: 16),
    CGPoint(x: 20, y: 16),
    CGPoint(x: 20, y:-16)
], type: ShapeType.subject)

// add hole
overlay.add(path: [
    CGPoint(x:-12, y:-8),
    CGPoint(x:-12, y: 8),
    CGPoint(x: 12, y: 8),
    CGPoint(x: 12, y:-8)
], type: ShapeType.subject)

// add clip
overlay.add(path: [
    CGPoint(x:-4, y:-24),
    CGPoint(x:-4, y: 24),
    CGPoint(x: 4, y: 24),
    CGPoint(x: 4, y:-24)
], type: ShapeType.clip)

// make overlay graph
let graph = overlay.buildGraph()

// get union shapes
let union = graph.extractShapes(overlayRule: OverlayRule.union)

// get difference shapes
let difference = graph.extractShapes(overlayRule: OverlayRule.difference)

// get intersect shapes
let intersect = graph.extractShapes(overlayRule: OverlayRule.intersect)

// get exclusion shapes
let xor = graph.extractShapes(overlayRule: OverlayRule.xor)

// get clean shapes from subject, self intersections will be removed
let subject = graph.extractShapes(overlayRule: OverlayRule.subject)

形状结果

extractShapes 函数的输出是一个 [[[CGPoint]]],其中

注意:外边界路径具有顺时针顺序,孔洞具有逆时针顺序。

并集

差集

交集

互斥 (xor)

自相交