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

时间:2009-12-15 10:31:47

标签: iphone cocoa-touch

当我们在UIScrollView中用两根手指进行多点触控时,我们得到两个CG点。我想找到它们之间的距离。然后我们再次进行捏(内部或外部),然后我们将再次得到两个点。然后在找到这两点之间的距离后,我想决定是否捏入或捏出。如果我捏了进去,肯定新的距离会更小,反之亦然。

但不知道如何找到2点之间距离的准确测量值进行比较?有人对此有所了解吗?

9 个答案:

答案 0 :(得分:179)

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

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

就是这样。

答案 1 :(得分:113)

p1p2之间的距离:

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

输入功能:

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

背景:Pythagorean theorem

如果你只需要计算点之间的距离是增加还是减少,你可以省略sqrt(),这会使它更快一点。

答案 2 :(得分:19)

对于快速用户

extension CGPoint {

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

答案 3 :(得分:12)

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

答案 4 :(得分:10)

使用Swift 4,您可以选择以下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()方法和核心图形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。使用核心图形hypot(_:_:)函数

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。使用核心图形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

答案 5 :(得分:2)

我写了这个,我经常使用它:

- (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,但我仍然使用自己的函数来处理某些事情,因为在我学习的过程中,我为了简单的东西编写了一堆我自己的函数而不是搜索“官方”高阶函数,另外我我不是函数(vars,vars)的忠实粉丝,我更喜欢[self functions vars and:vars]

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

如果要使用数组查找点之间的距离,可以使用以下方法:

extension Array where Element == CGPoint {
    func distance() -> CGFloat {
        let xDist = self[0].x - self[1].x
        let yDist = self[0].y - self[1].y
        return CGFloat(sqrt(xDist * xDist + yDist * yDist))
    }
}