Как найти расстояние между двумя точками ЦТ?


84

Когда мы выполняем мультитач двумя пальцами в UIScrollView, мы получаем две точки компьютерной графики. Я хочу найти расстояние между ними. Затем, когда мы снова делаем щепотку (внутри или снаружи), то мы снова получаем два балла. Затем, снова найдя расстояние между этими двумя точками, я хочу решить, ущипнул я или нет. Если я зажал, то новое расстояние наверняка будет меньше, и наоборот.

Но не знаете, как найти точное измерение расстояния между двумя точками для сравнения? Кто-нибудь знает об этом?


См. Мой ответ для Swift 4, в котором показано до 5 различных способов найти расстояние между двумя CGPoints.
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

22
Аксиома вычислительной геометрии №1: если вы сравниваете расстояния, нет необходимости нести затраты на операцию sqrt ().
QED

4
@SpaceyRicochet есть методы hypotf и ccpDistance. См. Ответы ниже.
rmp251 05

@QED Имеет ли значение перед извлечением квадратного корня имя или значение помимо промежуточного шага вычисления расстояния?
allenh

@AllenHumphreys нет ничего более поэтического, чем квадрат расстояния .
QED

188

Вы можете использовать функцию hypot()или hypotf()для вычисления гипотенузы. Учитывая два балла p1и p2:

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

Вот и все.


4
при использовании swift это расстояние = hypotf (Float (p1.x) - Float (p2.x), Float (p1.y) - Float (p2.y))
nwales 05

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

Эта функция на самом деле является причиной, по которой я искал этот вопрос.
kelin

30

Для быстрых пользователей

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

Это действительно хорошее решение! Работает отлично!
gundrabur 02

15

В Swift 4 вы можете выбрать один из 5 следующих кодов игровой площадки, чтобы определить расстояние между двумя CGPointэкземплярами.


1. Использование 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(_:_:)функции Core Graphics

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(_:_:)функции 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. Использование hypot(_:_:)функции и CGFloat distance(to:)метода Core Graphics

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

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

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

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));
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.