测试已测试 | ✓ |
Lang语言 | SwiftSwift |
许可证 | MIT |
Released上次发布 | 2016年12月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Wagner Truppel 维护。
依赖 | |
WTBinaryFloatingPointExtensions | >= 0 |
WTUIColorExtensions | >= 0 |
一个对 CGPoint
、CGVector
以及 CGGradient
有用扩展的 Swift
集合。如果您需要二维向量,则可能喜欢这个库。
如果查看 CGPoint
和 CGVector
的定义,您会发现它们有很多需要改进的地方。实际上,如果您从事任何二维游戏开发,您知道按照定义的 CGVector
根本不是向量!
public struct CGPoint
{
public var x: CGFloat
public var y: CGFloat
public init()
public init(x: CGFloat, y: CGFloat)
}
extension CGPoint
{
public static var zero: CGPoint { get }
public init(x: Int, y: Int)
public init(x: Double, y: Double)
public init?(dictionaryRepresentation dict: CFDictionary)
}
extension CGPoint : Equatable {}
public struct CGVector
{
public var dx: CGFloat
public var dy: CGFloat
public init()
public init(dx: CGFloat, dy: CGFloat)
}
extension CGVector
{
public static var zero: CGVector { get }
public init(dx: Int, dy: Int)
public init(dx: Double, dy: Double)
}
extension CGVector : Equatable {}
不过,现在不再是了。我已经整理了一套全面的二维向量操作方法,从向量和点的加法,到点积和叉积,再到旋转,以及求投影,所有这些方法都经过了彻底测试。
以下是对这些类型添加的完整 API 列表
public enum WTCoreGraphicsExtensionsError : Error
{
case negativeTolerance
case negativeMagnitude
case notNormalizable
case divisionByZero
}
public extension CGFloat
{
static public let tolerance: CGFloat
}
public extension CGPoint
{
public init(x: Float, y: Float)
public static func random(_ a: CGFloat, _ b: CGFloat) -> CGPoint
public func isNearlyEqual(to other: CGPoint, tolerance: CGFloat = default) throws -> Bool
public func isNearlyZero(tolerance: CGFloat = default) throws -> Bool
public func distance(to other: CGPoint) -> CGFloat
public func distanceSquared(to other: CGPoint) -> CGFloat
public func manhattanDistance(to other: CGPoint) -> CGFloat
public func vector(to other: CGPoint) -> CGVector
public func vector(from other: CGPoint) -> CGVector
public static func vector(from point1: CGPoint, to point2: CGPoint) -> CGVector
public static func +(lhs: CGPoint, rhs: CGVector) -> CGPoint
public static func -(lhs: CGPoint, rhs: CGVector) -> CGPoint
public static func -(lhs: CGPoint, rhs: CGPoint) -> CGVector
public static func +=(lhs: inout CGPoint, rhs: CGVector)
public static func -=(lhs: inout CGPoint, rhs: CGVector)
}
extension CGPoint : Hashable
{
public var hashValue: Int { get }
}
public extension CGVector
{
public init(dx: Float, dy: Float)
public init(from p1: CGPoint, to p2: CGPoint)
public init(magnitude m: CGFloat, angle a: CGFloat) throws
public init(magnitude m: CGFloat, sine sina: CGFloat, cosine cosa: CGFloat) throws
public static func random(_ a: CGFloat, _ b: CGFloat) -> CGVector
public static var unitVectorX: CGVector { get }
public static var unitVectorY: CGVector { get }
public func isNearlyEqual(to other: CGVector, tolerance: CGFloat = default) throws -> Bool
public func isNearlyZero(tolerance: CGFloat = default) throws -> Bool
public var magnitude: CGFloat { get }
public var magnitudeSquared: CGFloat { get }
public var manhattanMagnitude: CGFloat { get }
public var isNormalizable: Bool { get }
public mutating func normalize() throws
public var normalized: CGVector? { get }
public mutating func scaleMagnitude(to value: CGFloat) throws
public func magnitudeScaled(to value: CGFloat) -> CGVector?
public mutating func scaleMagnitudeDownToIfLarger(than maxValue: CGFloat) throws
public func magnitudeScaledDownToIfLarger(than maxValue: CGFloat) throws -> CGVector
public mutating func scaleMagnitudeUpToIfSmaller(than minValue: CGFloat) throws
public func magnitudeScaledUpToIfSmaller(than minValue: CGFloat) throws -> CGVector
public func dot(with other: CGVector) -> CGFloat
public func cross(with other: CGVector) -> CGFloat
public var angleFromXAxis: CGFloat { get }
public var sinAngleFromXAxis: CGFloat { get }
public var cosAngleFromXAxis: CGFloat { get }
public var tanAngleFromXAxis: CGFloat { get }
public func smallestAngle(with other: CGVector) -> CGFloat
public func projectionParallel(to other: CGVector) -> CGVector
public func isNearlyParallel(to other: CGVector, tolerance: CGFloat = default) throws -> Bool
public func projectionPerpendicular(to other: CGVector) -> CGVector
public func isNearlyPerpendicular(to other: CGVector, tolerance: CGFloat = default) throws -> Bool
public mutating func rotateClockwise(by angle: CGFloat)
public func rotatedClockwise(by angle: CGFloat) -> CGVector
public mutating func rotateClockwise(sine sina: CGFloat, cosine cosa: CGFloat)
public func rotatedClockwise(sine sina: CGFloat, cosine cosa: CGFloat) -> CGVector
public mutating func rotateCounterClockwise(by angle: CGFloat)
public func rotatedCounterClockwise(by angle: CGFloat) -> CGVector
public mutating func rotateCounterClockwise(sine sina: CGFloat, cosine cosa: CGFloat)
public func rotatedCounterClockwise(sine sina: CGFloat, cosine cosa: CGFloat) -> CGVector
public static func +(lhs: CGVector, rhs: CGVector) -> CGVector
public static func -(lhs: CGVector, rhs: CGVector) -> CGVector
public static func *(lhs: CGFloat, rhs: CGVector) -> CGVector
public static func *(lhs: CGVector, rhs: CGFloat) -> CGVector
public static func /(lhs: CGVector, rhs: CGFloat) throws -> CGVector
public prefix static func -(vector: CGVector) -> CGVector
public static func +=(lhs: inout CGVector, rhs: CGVector)
public static func -=(lhs: inout CGVector, rhs: CGVector)
public static func *=(lhs: inout CGVector, rhs: CGFloat)
public static func /=(lhs: inout CGVector, rhs: CGFloat) throws
}
extension CGVector : Hashable
{
public var hashValue: Int { get }
}
public extension CGGradient
{
public enum CGGradientError : Error
{
case mismatchedColorAndLocationArraySizes
case invalidNumberOfColorLocationPairs
case invalidColorLocations
}
public static func rgbaGradient(with colors: [UIColor],
at locations: @autoclosure @escaping [CGFloat]) throws -> CGGradient?
}
WTCoreGraphicsExtensions 添加了 68 个属性和函数,通过 138 个测试用例进行了测试,覆盖率达到 92% 以上。缺失的 8% 测试覆盖率是由于 CGGradient
类型非常封闭,一旦 rgbaGradient(with:at:)
创建它,就无法从中提取任何内容进行比较。
WTCoreGraphicsExtensions 依赖于我的另外两个库
WTCoreGraphicsExtensions 的更改列表在此列出:https://github.com/wltrup/Swift-WTCoreGraphicsExtensions/blob/master/CHANGELOG.md。
WTCoreGraphicsExtensions 通过 CocoaPods 提供。要安装它,请将以下行添加到 Podfile 中
pod "WTCoreGraphicsExtensions"
Wagner Truppel,[email protected]
WTCoreGraphicsExtensions 可在 MIT 许可下使用。请参阅 LICENSE 文件以了解更多信息。