두 CG 포인트 사이의 거리를 찾는 방법은 무엇입니까?


84

UIScrollView에서 두 손가락으로 멀티 터치를하면 두 개의 CG 포인트를 얻습니다. 나는 그들 사이의 거리를 찾고 싶다. 그런 다음 다시 핀치 (내부 또는 외부)를 수행하면 다시 두 점을 얻습니다. 그런 다음이 두 지점 사이의 거리를 다시 찾은 후 끼어들 었는지 아니면 끼 었는지 결정하고 싶습니다. 내가 끼어들었다면 분명히 새로운 거리가 더 짧아지고 그 반대도 마찬가지입니다.

그러나 비교를 위해 두 지점 사이의 거리에 대한 정확한 측정을 찾는 방법을 모르십니까? 누구든지 이것에 대해 생각하고 있습니까?


두 s 사이의 거리를 찾는 최대 5 가지 방법을 보여주는 Swift 4에 대한 내 대답을 참조하십시오 CGPoint.
Imanou Petit

답변:


125

p1과 사이의 거리 p2:

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

배경 : 피타고라스 정리

점 사이의 거리가 증가하거나 감소하는 경우에만 계산해야하는 경우 sqrt ()를 생략하면 조금 더 빨라집니다.


32
이것에 대한 편리한 방법이 없습니까?
SpacyRicochet 2012 년

22
계산 기하학 공리 # 1 : 거리 를 비교 하는 경우 sqrt () 작업의 비용이 발생할 필요가 없습니다.
QED

4
@SpaceyRicochet hypotf 및 ccpDistance 메서드가 있습니다. 아래 답변을 참조하십시오.
rmp251 2014 년

@QED 제곱근을 취하기 전의 값이 거리를 계산하는 중간 단계를 넘어서는 이름이나 의미가 있습니까?
allenh

@AllenHumphreys 거리 제곱 보다 더 시적인 것을 아는 것은 없습니다 .
QED

188

hypot()또는 hypotf()함수를 사용하여 빗변을 계산할 수 있습니다 . 두 점이 주어 p1지고 p2:

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

그리고 그게 다야.


4
신속한 그것의 거리 = hypotf (- 플로트 (p2.x), 플로트 (p1.y) - 플로트 (p2.y) 플로트 (을 P1.x))를 사용하는 경우
nwales

6
당신은 의미let distance = hypotf(Float(p1.x - p2.x), Float(p1.y - p2.y))
평균 조

6
당신은 let distance = hypot(p1.x - p2.x, p1.y - p2.y)Swift 2.1 이후
Cemen dec

이 기능이 제가이 질문을 검색 한 이유입니다.
kelin

30

신속한 사용자를 위해

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

정말 좋은 솔루션입니다! 잘 작동합니다!
gundrabur

15

Swift 4를 사용하면 두 CGPoint인스턴스 간의 거리를 확인하기 위해 다음 5 개의 플레이 그라운드 코드 중 하나를 선택할 수 있습니다 .


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

1
Swift 3에서도 작동합니다.
ThisClark 2017-10-12

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

2
ccpDistance는 코어의 일부가 아닌 cocos2d의 일부인 것으로 보입니다. 피타고라스 정리를 피하기 위해 그것을 포함시키는 것은 아마도 과잉 일 것입니다.
Vox 2013

3

나는 이것을 썼고 많이 사용합니다.

- (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]를 선호합니다.


1
sqrt (pow (p2.x-p1.x, 2) + pow (p2.y-p1.y, 2)) 여야하지 않습니까? p2.y의 두 번째 발생이 p1.y를 대체했습니다.
Sanjay Chaudhry 2013

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

0

두 점 사이의 절대 거리 값을 찾으려면 다음을 사용할 수 있습니다 (Cocos2d의 경우).

float distance = abs(ccpDistance(point1, point2));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.