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?
iphone
cocoa-touch
Vielfraß
quelle
quelle
CGPoint
s zu ermitteln.Antworten:
Abstand zwischen
p1
undp2
: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.
quelle
Mit der Funktion
hypot()
oderhypotf()
können Sie die Hypotenuse berechnen. Gegeben zwei Punktep1
undp2
:CGFloat distance = hypotf(p1.x - p2.x, p1.y - p2.y);
Und das ist es.
quelle
let distance = hypotf(Float(p1.x - p2.x), Float(p1.y - p2.y))
let distance = hypot(p1.x - p2.x, p1.y - p2.y)
seit Swift 2.1Für schnelle Benutzer
extension CGPoint { func distance(to point: CGPoint) -> CGFloat { return sqrt(pow(x - point.x, 2) + pow(y - point.y, 2)) } }
quelle
Mit Swift 4 können Sie einen der 5 folgenden Spielplatzcodes auswählen, um den Abstand zwischen zwei
CGPoint
Instanzen zu ermitteln.1. Verwenden der Darwin-
sqrt(_:)
Funktionimport 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 verwendenimport 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(_:_:)
Funktionimport 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(_:_:)
Funktionimport 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 undCGFloat
distance(to:)
-Methodeimport 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
quelle
-(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);
quelle
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]
quelle
#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);
quelle
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));
quelle