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

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));
user2425159
источник