2つのCGポイント間の距離を見つける方法は?


83

UIScrollViewで2本の指でマルチタッチを行うと、2つのCGポイントが得られます。それらの間の距離を見つけたい。次に、もう一度ピンチ(内側または外側)を行うと、再び2つのポイントが得られます。次に、これら2点間の距離を再度見つけた後、ピンチインしたかピンチアウトしたかを判断します。私がピンチインした場合、確かに新しい距離は短くなり、逆もまた同様です。

しかし、比較を行うために2点間の距離の正確な測定値を見つける方法がわかりませんか?誰かがこれについて考えを持っていますか?


2つの間の距離を見つけるための最大5つの異なる方法を示すSwift4の私の答えを参照しくださいCGPoint
今のプチ

回答:


123

間の距離p1p2

CGFloat xDist = (p2.x - p1.x);
CGFloat yDist = (p2.y - p1.y);
CGFloat distance = sqrt(xDist * xDist + yDist * yDist);

関数を入れる:

func distance(_ a: CGPoint, _ b: CGPoint) -> CGFloat {
    let xDist = a.x - b.x
    let yDist = a.y - b.y
    return CGFloat(sqrt(xDist * xDist + yDist * yDist))
}

背景:ピタゴラスの定理

ポイント間の距離が増加するか減少するかを計算するだけでよい場合は、sqrt()を省略して、少し速くすることができます。


32
これには便利な方法はありませんか?
SpacyRicochet 2012年

22
計算幾何学の公理#1:距離を比較する場合、sqrt()操作のコストを負担する必要はありません。
QED

4
@SpaceyRicochetメソッドhypotfとccpDistanceがあります。以下の回答を参照してください。
rmp251 2014年

@QED平方根を取る前の値には、距離を計算する中間ステップを超えた名前または意味がありますか?
allenh 2017年

@AllenHumphreys距離の二乗よりも詩的なことは何も知りません。
QED

187

hypot()orhypotf()関数を使用して、斜辺を計算できます。与えられた2つのポイントp1p2

CGFloat distance = hypotf(p1.x - p2.x, p1.y - p2.y);

以上です。


4
swiftを使用する場合、距離= hypotf(Float(p1.x)-Float(p2.x)、Float(p1.y)-Float(p2.y))
nwales 2015年

6
もしかしてlet distance = hypotf(Float(p1.x - p2.x), Float(p1.y - p2.y))
平均ジョー

6
もしかしてlet distance = hypot(p1.x - p2.x, p1.y - p2.y)スウィフト2.1以降
Cemen

この機能が、私がこの質問を検索した理由です。
ケリン

29

スイフトユーザー向け

extension CGPoint {
    func distance(to point: CGPoint) -> CGFloat {
        return sqrt(pow(x - point.x, 2) + pow(y - point.y, 2))
    }
}

それは本当に素晴らしい解決策です!正常に動作します!
gundrabur

15

Swift 4では、2つのCGPointインスタンス間の距離を取得するために、次の5つのプレイグラウンドコードのいずれかを選択できます。


1.ダーウィンsqrt(_:)関数の使用

import CoreGraphics

func distance(from lhs: CGPoint, to rhs: CGPoint) -> CGFloat {
    let xDistance = lhs.x - rhs.x
    let yDistance = lhs.y - rhs.y
    return sqrt(xDistance * xDistance + yDistance * yDistance)
}

let point1 = CGPoint(x: -10, y: -100)
let point2 = CGPoint(x: 30, y: 600)

distance(from: point1, to: point2) // 701.141925718324

2.CGFloat squareRoot()方法を使用する

import CoreGraphics

func distance(from lhs: CGPoint, to rhs: CGPoint) -> CGFloat {
    let xDistance = lhs.x - rhs.x
    let yDistance = lhs.y - rhs.y
    return (xDistance * xDistance + yDistance * yDistance).squareRoot()
}

let point1 = CGPoint(x: -10, y: -100)
let point2 = CGPoint(x: 30, y: 600)

distance(from: point1, to: point2) // 701.141925718324

3.CGFloat squareRoot()メソッドとコアグラフィックスpow(_:_:)機能の使用

import CoreGraphics

func distance(from lhs: CGPoint, to rhs: CGPoint) -> CGFloat {
    return (pow(lhs.x - rhs.x, 2) + pow(lhs.y - rhs.y, 2)).squareRoot()
}

let point1 = CGPoint(x: -10, y: -100)
let point2 = CGPoint(x: 30, y: 600)

distance(from: point1, to: point2) // 701.141925718324

4.コアグラフィックhypot(_:_:)機能の使用

import CoreGraphics

func distance(from lhs: CGPoint, to rhs: CGPoint) -> CGFloat {
    return hypot(lhs.x - rhs.x, lhs.y - rhs.y)
}

let point1 = CGPoint(x: -10, y: -100)
let point2 = CGPoint(x: 30, y: 600)

distance(from: point1, to: point2) // 701.141925718324

5.コアグラフィックスhypot(_:_:)関数とCGFloat distance(to:)メソッドの使用

import CoreGraphics

func distance(from lhs: CGPoint, to rhs: CGPoint) -> CGFloat {
    return hypot(lhs.x.distance(to: rhs.x), lhs.y.distance(to: rhs.y))
}

let point1 = CGPoint(x: -10, y: -100)
let point2 = CGPoint(x: 30, y: 600)

distance(from: point1, to: point2) // 701.141925718324

1
Swift3でも動作します。
thisClark 2017年

12
-(float)distanceFrom:(CGPoint)point1 to:(CGPoint)point2
{
CGFloat xDist = (point2.x - point1.x);
CGFloat yDist = (point2.y - point1.y);
return sqrt((xDist * xDist) + (yDist * yDist));
}

cocos2dを使用している場合

float distance = ccpDistance(point1, point2);

2
ccpDistanceはコアの一部ではなくcocos2dの一部のようです。ピタゴラスの定理を避けるためにそれを含めることはおそらくやり過ぎです。
Vox

3

私はこれを書きました、私はそれをたくさん使います:

- (float) distanceBetween : (CGPoint) p1 and: (CGPoint) p2
{
    return sqrt(pow(p2.x-p1.x,2)+pow(p2.y-p1.y,2));
}

このように呼び出します:

float distanceMoved = [self distanceBetween touchStart and: touchEnd];

私は通常cocos2dを使用しますが、学習中に「公式の」高階関数を検索するのではなく、単純なもののために独自の関数をたくさん書いたので、まだいくつかのことに独自の関数を使用しています。関数(vars、vars)の大ファン、私は[自己関数varsと:vars]を好みます


1
sqrt(pow(p2.x-p1.x、2)+ pow(p2.y-p1.y、2))ではありませんか?p2.yの2番目の出現はp1.yを置き換えました。
Sanjay Chaudhry

0
#define rw_pointOffset(point1, point2) CGPointMake(point2.x - point1.x, point2.y - point1.y)
#define rw_pointDistance(point1, point2) sqrtf( powf(point2.x - point1.x, 2.0f) + powf(point2.y - point1.y, 2.0f))

そして、それはあなたがそれを使用する方法です:

CGPoint offset = rw_pointOffset(view1.center, view2.center);
float distance = rw_pointDistance(view1.center, view2.center);

0

2点間の絶対距離値を見つけたい場合は、(Cocos2dの場合)次を使用できます。

float distance = abs(ccpDistance(point1, point2));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.