通过协议 VectorOperatable
和 VectorArithmetic
扩展 CGPoint
、CGSize
和 CGVector
处理与架构差异相关的某些 Swift 的 bug。
值得注意的是,Apple 本身在整个 UIKit 中使用 CGPoint 来表示速度和其他向量。所以,当您看到 myPoint + myOtherPoint * 2
时请记住这一点
为了在不同的数值类型之间获得更好的互操作性,请使用
let vector = CGVector(20, 5.5)
let point = CGPoint(x: 5, y: 5)
vector.angleInRadians // -1.30243011588899
vector.magnitude // 20.7424685126915
vector.length // synonym to magnitude
vector.lengthSquared // 430.25
vector.dotProduct(point) // 127.5
vector.crossProduct(point) // -72.5
vector.distanceTo(point) // 15.0083310198036
vector.reversed // {dx -20.0, dy -5.5}
vector.normalized // {dx 0.96420539280379, dy 0.265156483021042}
vector.limited(20) // {dx 19.2841078560758, dy 5.30312966042085}
vector.scaled(20) // synonym to limited()
vector.angled(90) // {dx -9.29415287392715, dy 18.5436976451859}
var point:CGPoint = CGPoint(x: 2.0, y: 2.0)
var vector:CGVector = CGVector(horizontal: 2.0, vertical: 2.0)
point = point + vector
point += vector
point = point - vector
point -= vector
point = point * vector
point *= vector
point = point / vector
point /= vector
vector = vector * 4.5
vector *= 20.5
vector = vector / 2.0
vector /= 2.0
point == vector
point != vector
point < vector
point <= vector
point > vector
point >= vector
let point = CGPoint(horizontal:2.0,vertical:2.0)
let vector = CGVector(horizontal:2.0,vertical:2.0)
let yourStruct = YourStruct(horizontal:2.0,vertical:2.0)
class Boid<T:VectorOperatable, U:VectorOperatable> {
var position = T(horizontal: 2.0, vertical: 2.5)
var velocity = U(horizontal: 2.0, vertical: 2.5)
}
let boid = Boid<CGPoint, CGVector>()
boid.position = CGPointZero
boid.velocity = CGVectorMake(20, 20)
boid.velocity > boid.position // True
protocol VectorOperatable {
init(horizontal:Double,vertical:Double)
var horizontal:Double { get set }
var vertical:Double { get set }
}
protocol VectorArithmetic : VectorOperatable {
var angleInRadians:Double {get}
var magnitude:Double {get}
var length:Double {get}
var lengthSquared:Double {get}
func dotProduct <T : VectorArithmetic>(vector:T) -> Double
func distanceTo <T : VectorArithmetic>(vector:T) -> Double
var reversed:Self {get}
var normalized:Self {get}
func limited(scalar:Double) -> Self
func scaled(scalar:Double) -> Self
func angled(scalar:Double) -> Self
}
如果您在项目中使用了 VectorArithmetic,我非常乐意听到您的反馈。
电子邮件:[email protected]
推特:@seivanheidari
VectorArithmetic 是 © 2014 Seivan 的财产,可以在MIT 许可证下自由分发。请参阅LICENSE.md
文件。