BezierKit
BezierKit 是一个用 Swift 编写的全面的贝塞尔路径库。
警告!预发布软件!
请注意,BezierKit 目前是预发布软件。它的发布遵循 语义化版本控制,这意味着在达到 1.0 状态之前,API 可能会不稳定或向后不兼容。
功能
- 构建线性(线段)、二次和三次贝塞尔曲线
- 通过 CoreGraphics 绘制曲线
- 确定曲线上的位置、导数和法线
- 通过勒让德-高斯求积法计算曲线长度
- 相交曲线并计算任何精度的三次曲线自交
- 确定边界框、极值
- 找到与点最近的曲线上的位置
- 到任意的精度
- 将曲线分割成子曲线
- 偏移和轮廓曲线
- 综合单元和集成测试覆盖率
- 完整文档
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理工具。您可以使用以下命令安装它:
$ gem install cocoapods
要使用 CocoaPods 将 BezierKit 集成到您的 Xcode 项目中,将其添加到您的 Podfile
中的目标。
target '<Your Target Name>' do
pod 'BezierKit', '>= 0.15.0'
end
然后,运行以下命令:
$ pod install
Swift 包管理器
Swift 包管理器(Swift Package Manager)是一个用于自动分发 Swift 代码的工具,并集成到 swift
编译器中。一旦您的 Swift 包设置完成,将 BezierKit 作为依赖项添加到 Package.swift
的 dependencies
值就像一样简单。
// swift-tools-version:5.0
import PackageDescription
let package = Package(
name: "<Your Target Name>",
dependencies: [
.package(url: "https://github.com/hfutrell/BezierKit.git", from: "0.15.0"),
]
)
用法
构造和绘制曲线
BezierKit 支持三次贝塞尔曲线(CubicCurve
)、二次贝塞尔曲线(QuadraticCurve
)以及线段(LineSegment
),每个都采用了包含大部分 API 功能的 BezierCurve
协议。
import BezierKit
let curve = CubicCurve(
p0: CGPoint(x: 100, y: 25),
p1: CGPoint(x: 10, y: 90),
p2: CGPoint(x: 110, y: 100),
p3: CGPoint(x: 150, y: 195)
)
let context: CGContext = ... // your graphics context here
Draw.drawSkeleton(context, curve) // draws visual representation of curve control points
Draw.drawCurve(context, curve) // draws the curve itself
相交曲线
intersections(with:curve:) -> [Intersection]
方法确定 self
和 curve
之间的每个交集,作为 Intersection
对象数组。每个交集有两个字段:t1
代表交集处的 self
的 t
值,而 t2
代表交集处的 curve
的 t
值。您可以使用曲线上的 point(at:)
方法通过传递曲线的相应 t
值来计算交集的坐标。
三次曲线可能自相交,这可以通过调用selfIntersections()
方法来确定。
let intersections: [Intersection] = curve1.intersections(with: curve2)
let points: [CGPoint] = intersections.map { curve1.point(at: $0.t1) }
Draw.drawCurve(context, curve: curve1)
Draw.drawCurve(context, curve: curve2)
for p in points {
Draw.drawPoint(context, origin: p)
}
分割曲线
split(from:,: to:j)
方法可生成一个在给定t值范围内的子曲线。可以使用split(at:)
方法进行分割,从而在特定的t值处创建左子曲线和右子曲线。
Draw.setColor(context, color: Draw.lightGrey)
Draw.drawSkeleton(context, curve: curve)
Draw.drawCurve(context, curve: curve)
let subcurve = curve.split(from: 0.25, to: 0.75) // or try (leftCurve, rightCurve) = curve.split(at:)
Draw.setColor(context, color: Draw.red)
Draw.drawCurve(context, curve: subcurve)
Draw.drawCircle(context, center: curve.point(at: 0.25), radius: 3)
Draw.drawCircle(context, center: curve.point(at: 0.75), radius: 3)
确定边界框
let boundingBox = curve.boundingBox
Draw.drawSkeleton(context, curve: curve)
Draw.drawCurve(context, curve: curve)
Draw.setColor(context, color: Draw.pinkish)
Draw.drawBoundingBox(context, boundingBox: curve.boundingBox)
更多
BezierKit是一个强大的库,功能非常丰富。目前,最好的方式是构建MacDemos目标并查看提供的每个演示。
许可证
BezierKit在MIT许可证下发布。有关详细信息,请参阅LICENSE。