Як знайти відстань між двома точками КГ?


83

Коли ми виконуємо мультитач двома пальцями в UIScrollView, ми отримуємо дві точки CG. Я хочу знайти відстань між ними. Потім, коли ми знову зробимо защемлення (всередині або зовні), тоді ми знову отримаємо два бали. Потім, знайшовши ще раз відстань між цими двома точками, я хочу вирішити, вщипнув я чи ні. Якщо я вціпив, напевно нова відстань буде меншою і навпаки.

Але ви не знаєте, як знайти точне вимірювання відстані між 2 точками для порівняння? Хто-небудь має про це уявлення?


Дивіться мою відповідь на Swift 4, яка показує до 5 різних способів знайти відстань між двома CGPoints.
Imanou Petit

Відповіді:


123

Відстань між 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

@QED Чи має значення, перш ніж взяти квадратний корінь, назву чи значення поза проміжним етапом обчислення відстані?
Аллен

@AllenHumphreys нічого, що я не знаю, більше поетичного, ніж відстань у квадраті .
QED

187

Ви можете використовувати функцію 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.03.15

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

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), я віддаю перевагу [самофункції vars і: 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.