Kiedy wykonujemy multitouch dwoma palcami w UIScrollView, otrzymujemy dwa punkty CG. Chcę znaleźć odległość między nimi. Następnie, gdy ponownie zrobimy szczypanie (wewnątrz lub na zewnątrz), wtedy znowu otrzymamy dwa punkty. Następnie po ponownym znalezieniu odległości między tymi dwoma punktami chcę zdecydować, czy uszczypnąłem, czy wyciągnąłem. Jeśli uszczypnąłem, na pewno nowa odległość będzie mniejsza i odwrotnie.
Ale nie wiesz, jak znaleźć dokładny pomiar odległości między 2 punktami w celu porównania? Czy ktoś ma o tym pojęcie?
iphone
cocoa-touch
rosomak
źródło
źródło
CGPoint
s.Odpowiedzi:
Odległość między
p1
ap2
:CGFloat xDist = (p2.x - p1.x); CGFloat yDist = (p2.y - p1.y); CGFloat distance = sqrt(xDist * xDist + yDist * yDist);
Wstaw funkcję:
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)) }
Wstęp: twierdzenie Pitagorasa
Jeśli chcesz tylko obliczyć, czy odległość między punktami rośnie, czy maleje, możesz pominąć funkcję sqrt (), która przyspieszy ją trochę.
źródło
Możesz użyć funkcji
hypot()
lubhypotf()
do obliczenia przeciwprostokątnej. Biorąc pod uwagę dwa punktyp1
ip2
:CGFloat distance = hypotf(p1.x - p2.x, p1.y - p2.y);
I to wszystko.
źródło
let distance = hypotf(Float(p1.x - p2.x), Float(p1.y - p2.y))
let distance = hypot(p1.x - p2.x, p1.y - p2.y)
od Swift 2.1Dla szybkich użytkowników
extension CGPoint { func distance(to point: CGPoint) -> CGFloat { return sqrt(pow(x - point.x, 2) + pow(y - point.y, 2)) } }
źródło
W Swift 4 możesz wybrać jeden z 5 następujących kodów Playground, aby uzyskać odległość między dwoma
CGPoint
instancjami.1. Korzystanie z
sqrt(_:)
funkcji Darwinaimport 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. Za pomocą
CGFloat
squareRoot()
metodyimport 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. Stosowanie
CGFloat
squareRoot()
metody ipow(_:_:)
funkcji Core Graphicsimport 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. Korzystanie z
hypot(_:_:)
funkcji Core Graphicsimport 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. Wykorzystanie
hypot(_:_:)
funkcji iCGFloat
distance(to:)
metody Core Graphicsimport 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
źródło
-(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)); }
Jeśli używasz cocos2d
float distance = ccpDistance(point1, point2);
źródło
Napisałem to, często go używam:
- (float) distanceBetween : (CGPoint) p1 and: (CGPoint) p2 { return sqrt(pow(p2.x-p1.x,2)+pow(p2.y-p1.y,2)); }
Zadzwoń tak:
float distanceMoved = [self distanceBetween touchStart and: touchEnd];
Zwykle używam cocos2d, ale nadal używam własnej funkcji do niektórych rzeczy, ponieważ kiedy się uczyłem, napisałem kilka własnych funkcji dla prostych rzeczy, zamiast szukać "oficjalnych" funkcji wyższego rzędu, a ponadto nie jestem wielki fan funkcji (vars, vars), wolę [self functions vars and: vars]
źródło
#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))
I tak z tego korzystasz:
CGPoint offset = rw_pointOffset(view1.center, view2.center); float distance = rw_pointDistance(view1.center, view2.center);
źródło
Jeśli chcesz znaleźć bezwzględną wartość odległości między dwoma punktami, możesz użyć (dla Cocos2d):
float distance = abs(ccpDistance(point1, point2));
źródło