iOverlay 是一个快速的多边形布尔运算库,支持诸如并集、交集、差集和异或等主要操作,这些操作由奇偶规则或非零规则来管理。
该库针对不同的场景进行了优化,确保在各种用例中都能实现高性能。 有关详细的性能基准测试,请查看性能比较
通过交互式演示试用 iOverlay。 该演示涵盖了并集、交集、差集和互斥等操作
iOverlay 库在以下范围内和精度级别内运行
扩展范围:从 -1,000,000 到 1,000,000,精度为 0.001。 推荐范围:从 -100,000 到 100,000,精度为 0.01,以获得更准确的结果。 在推荐范围内使用该库可确保计算的最佳精度,建议在大多数用例中使用。
使用 Swift Package Manager 安装 iOverlay 既简单又容易。 只需按照以下步骤操作
https://github.com/iShape-Swift/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]]]
,其中
[CGShape]
表示一组形状。[CGPath]
表示一个路径集合,其中第一条路径是外边界,所有后续路径都是该边界中的孔洞。[CGPoint]
是一个点序列,形成一条闭合路径。注意:外边界路径具有顺时针顺序,孔洞具有逆时针顺序。