1. 程式人生 > >計算 CGPoint 兩點距離的 hypotf & hypot

計算 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。