如何find两个CG点之间的距离?
当我们在UIScrollView中用两个手指进行多点触控时,我们得到两个CG点。 我想find他们之间的距离。 然后当我们再次捏(内部或外部),然后我们将再次得到两个点。 然后再find这两点之间的距离后,我想决定是否夹紧或放松。 如果我捏了一下,新的距离肯定会减less,反之亦然。
但不知道如何find一个准确的测量2点之间的距离做比较? 有人有这个想法吗?
p1
和p2
之间的距离:
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()
函数来计算斜边。 给定两点p1
和p2
:
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));