如何find两个CG点之间的距离?

当我们在UIScrollView中用两个手指进行多点触控时,我们得到两个CG点。 我想find他们之间的距离。 然后当我们再次捏(内部或外部),然后我们将再次得到两个点。 然后再find这两点之间的距离后,我想决定是否夹紧或放松。 如果我捏了一下,新的距离肯定会减less,反之亦然。

但不知道如何find一个准确的测量2点之间的距离做比较? 有人有这个想法吗?

p1p2之间的距离:

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

Swift 3:

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

背景: 毕达哥拉斯定理

编辑:如果您只需要计算点之间的距离是增加还是减less,则可以省略sqrt(),这会使其更快一些。

您可以使用hypotf()或者hypotf()函数来计算斜边。 给定两点p1p2

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

就是这样。

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

对于迅速的用户

 extension CGPoint { func distance(toPoint p:CGPoint) -> CGFloat { return sqrt(pow(x - px, 2) + pow(y - py, 2)) } } 

使用Swift 4,您可以select以下5个Playground代码中的一个来获取两个CGPoint实例之间的距离。


1.使用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.使用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()方法和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.使用核心graphicshypot(_:_:)函数

 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.使用Core Graphics 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 

我写了这个,我用了很多:

 - (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,但是我仍然使用自己的函数来处理一些事情,因为当我学习的时候,我写了一堆我自己的函数来做简单的事情,而不是去search“官方”的高阶函数,另外我不是function的大粉丝(variables,variables),我更喜欢[自我functionvariables和:variables]

我相信使用乘法将比某些人喜欢的pow函数更快。 在Swift中:

 public func distanceBetween(p1 : CGPoint, p2 : CGPoint) -> CGFloat { let dx : CGFloat = p1.x - p2.x let dy : CGFloat = p1.y - p2.y return sqrt(dx * dx + dy * dy) } 

提示比较距离

然而,一个build议的话:如果你比较距离(例如,find最小或最大的一个),那么最好跳过sqrt位(这是慢的),只是比较距离的平方。

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

如果你想find两点之间的绝对距离值,那么你可以使用(对于Cocos2d):

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