Como encontrar a distância entre dois pontos CG?

Quando fazemos multitouch com dois dedos em um UIScrollView, obtemos dois pontos CG. Eu quero encontrar a distância entre eles. Então quando novamente nós fazemos o beliscão (dentro ou fora), Então nós novamente teremos dois pontos. Então, depois de encontrar a distância novamente entre esses dois pontos, quero decidir se entro ou não. Se eu tiver apertado, certamente a nova distância será menor e vice-versa.

Mas não sabe como encontrar uma medida precisa para a distância entre dois pontos para fazer comparações? Alguém tem idéia sobre isso?

Distância entre p1 e p2 :

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

Coloque em uma function:

 func distance(_ a: CGPoint, _ b: CGPoint) -> CGFloat { let xDist = ax - bx let yDist = ay - by return CGFloat(sqrt(xDist * xDist + yDist * yDist)) } 

Antecedentes: Teorema de Pitágoras

Se você só precisa calcular se a distância entre os pontos aumenta ou diminui, você pode omitir o sqrt (), que irá torná-lo um pouco mais rápido.

Você pode usar a function hypot() ou hypotf() para calcular a hipotenusa. Dados dois pontos p1 e p2 :

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

E é isso.

Para usuários rápidos

 extension CGPoint { func distance(toPoint p:CGPoint) -> CGFloat { return sqrt(pow(x - px, 2) + pow(y - py, 2)) } } 
 -(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)); } 

Se você estiver usando cocos2d

 float distance = ccpDistance(point1, point2); 

Com o Swift 4, você pode escolher um dos 5 códigos Playground a seguir para obter a distância entre duas instâncias do CGPoint .


1. Usando a function Darwin 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. Usando o método 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. Usando o CGFloat squareRoot() e a function Core Graphics 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. Usando a function hypot(_:_:) Core Graphics

 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. Usando a function hypot(_:_:) Core Graphics e o CGFloat distance(to:) CGFloat

 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 

Eu escrevi isso, eu uso muito:

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

Ligue assim:

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

Eu normalmente uso cocos2d, mas eu ainda uso minha própria function para algumas coisas, porque quando eu estava aprendendo eu escrevi um monte de funções para coisas simples, em vez de procurar pelas funções “oficiais” de maior ordem, e além disso eu não sou grande fã de funções (vars, vars), eu prefiro [auto funções vars e: vars]

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

E é assim que você usa:

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

Se você quiser encontrar o valor da distância absoluta entre dois pontos, então você pode usar (para Cocos2d):

 float distance = abs(ccpDistance(point1, point2));