計算 CGPoint 兩點距離的 hypotf & hypot
計算 CGPoint 兩點距離的 hypotf & hypot
開發 iOS App 時,表示畫面上某一點的型別是 CGPoint,它的屬性 x & y 標示著點的座標位置。
public struct CGPoint {
public var x: CGFloat
public var y: CGFloat
public init()
public init(x: CGFloat, y: CGFloat)
}
那如果有兩個點,比方 point0 & point1,我們要如何知道它們之間連線的長度呢 ?
let point1 = CGPoint(x: 10, y: 20)
let point2 = CGPoint(x: 30, y: 100)
我們小時候學的數學真的不是白學,終於有派上用場的一天。如下圖所示,(10, 20) 到 (30, 100) 的距離,其實可以畫成直角三角形,三角形斜邊的長度即是兩點的距離。
因此我們可用畢式定理,兩條直角邊的長度的平方和等於斜邊長的平方計算:
假設兩條直角邊的長度分別為 a & b,斜邊長可用以下公式求出
因此,我們可用以下 swift 程式求出兩點的距離。
let point1 = CGPoint(x: 10, y: 20)
let point2 = CGPoint(x: 30, y: 100)
let length1 = Float(point1.x - point2.x)
let length2 = Float(point1.y - point2.y)
let hypotenuseLength = sqrtf(length1 * length1 + length2 * length2)
利用兩點的 x 相減和 y 相減即可求出兩個直角邊的長度。相減時我們不用擔心負數的問題,因為到時候負負得正,負數相乘又會變回正數。( function sqrtf 是計算平方根的意思,平方根的英文為 square root)
計算平方也可利用 function pow 或 powf。
public func pow(_ lhs: Float, _ rhs: Float) -> Float
pow 可計算 lhs 的 rhs 次方,因此當 rhs 傳入 2 時,即可計算平方,比方以下程式可算出 2.5 的平方為 6.25。(ps: 2.5² 的英文說法是 2.5 raised to the power of 2,因此 function 取名為 pow)
let number: Float = 2.5
powf(number, 2)
剛剛的程式可以進一步改寫,變成以 pow 計算平方。
let hypotenuseLength = sqrtf(pow(length1, 2) + pow(length2, 2))
然而這些都太慢了,有個更快的方法 !
let hypotenuseLength = hypotf(length1, length2)
利用 function hypotf,傳入代表長度的兩個數字(假設數字為 a & b),即可算出數字平方和開根號的結果。(斜邊的英文為 hypotenuse,因此 function 取名為 hypotf)
public func hypotf(_: Float, _: Float) -> Float
從以上的例子,我們終於明白了一件事。其實難的不是數學,而是英文呀。看來得好好認識這些數學的英文說法,才能記得這些特別的 function。