Wie finde ich den Abstand zwischen zwei Schwerpunktpunkten?


83

Wenn wir in einer UIScrollView Multitouch mit zwei Fingern ausführen, erhalten wir zwei CG-Punkte. Ich möchte den Abstand zwischen ihnen finden. Wenn wir dann wieder die Prise machen (innen oder außen), dann bekommen wir wieder zwei Punkte. Nachdem ich den Abstand zwischen diesen beiden Punkten wieder gefunden habe, möchte ich entscheiden, ob ich ein- oder ausgequetscht habe. Wenn ich eingeklemmt habe, wird der neue Abstand sicherlich geringer sein und umgekehrt.

Aber wissen Sie nicht, wie Sie eine genaue Messung für den Abstand zwischen 2 Punkten zum Vergleich finden können? Hat jemand eine Idee davon?


Siehe meine Antwort für Swift 4 , die bis zu 5 verschiedene Möglichkeiten zeigt, um den Abstand zwischen zwei CGPoints zu ermitteln.
Imanou Petit

Antworten:


123

Abstand zwischen p1und p2:

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

Setzen Sie eine Funktion ein:

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))
}

Hintergrund: Satz von Pythagoras

Wenn Sie nur berechnen müssen, ob der Abstand zwischen den Punkten zunimmt oder abnimmt, können Sie das sqrt () weglassen, wodurch es etwas schneller wird.


32
Gibt es dafür keine bequeme Methode?
SpacyRicochet

22
Rechengeometrie-Axiom Nr. 1: Wenn Sie Entfernungen vergleichen , müssen die Kosten für die Operation sqrt () nicht anfallen.
QED

4
@SpaceyRicochet gibt es Methoden hypotf und ccpDistance. Siehe Antworten unten.
rmp251

@QED Hat der Wert vor der Quadratwurzel einen Namen oder eine Bedeutung, die über einen Zwischenschritt zur Berechnung der Entfernung hinausgeht?
Allenh

@ AllenHumphreys nichts, von dem ich weiß, dass es poetischer ist als die Entfernung im Quadrat .
QED

187

Mit der Funktion hypot()oder hypotf()können Sie die Hypotenuse berechnen. Gegeben zwei Punkte p1und p2:

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

Und das ist es.


4
Wenn Sie Swift verwenden, ist es distance = hypotf (Float (p1.x) - Float (p2.x), Float (p1.y) - Float (p2.y))
nwales

6
Sie meinenlet distance = hypotf(Float(p1.x - p2.x), Float(p1.y - p2.y))
Durchschnitt Joe

6
Sie meinen let distance = hypot(p1.x - p2.x, p1.y - p2.y)seit Swift 2.1
Cemen

Diese Funktion ist eigentlich der Grund, warum ich diese Frage gesucht habe.
Kelin

29

Für schnelle Benutzer

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

Das ist eine wirklich schöne Lösung! Funktioniert gut!
Gundrabur

14

Mit Swift 4 können Sie einen der 5 folgenden Spielplatzcodes auswählen, um den Abstand zwischen zwei CGPointInstanzen zu ermitteln.


1. Verwenden der Darwin- sqrt(_:)Funktion

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()Methode verwenden

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. Verwenden der CGFloat squareRoot()Methode und der Core Graphics- pow(_:_:)Funktion

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. Verwenden der Core Graphics- hypot(_:_:)Funktion

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. Verwenden der Core Graphics- hypot(_:_:)Funktion und CGFloat distance(to:)-Methode

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
Funktioniert auch in Swift 3.
ThisClark

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));
}

Wenn Sie cocos2d verwenden

float distance = ccpDistance(point1, point2);

2
Es scheint, dass ccpDistance Teil von cocos2d ist, nicht Teil von core. Es ist wahrscheinlich übertrieben, es aufzunehmen, um den Satz des Pythagoras zu vermeiden.
Vox

3

Ich habe das geschrieben, ich benutze es oft:

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

Rufen Sie so an:

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

Normalerweise benutze ich cocos2d, aber ich benutze immer noch meine eigene Funktion für einige Dinge, weil ich beim Lernen eine Reihe meiner eigenen Funktionen für einfache Dinge geschrieben habe, anstatt nach den "offiziellen" Funktionen höherer Ordnung zu suchen, und außerdem bin ich keine großer Fan von Funktionen (vars, vars), ich bevorzuge [Selbstfunktionen vars und: vars]


1
sollte es nicht sqrt (pow (p2.x-p1.x, 2) + pow (p2.y-p1.y, 2)) sein? Das zweite Vorkommen von p2.y ersetzte 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))

Und so benutzt du es:

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

0

Wenn Sie den absoluten Abstandswert zwischen zwei Punkten ermitteln möchten, können Sie Folgendes verwenden (für Cocos2d):

float distance = abs(ccpDistance(point1, point2));
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.