Как найти расстояние между двумя точками компьютерной графики? - PullRequest
67 голосов
/ 15 декабря 2009

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

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

Ответы [ 8 ]

179 голосов
/ 13 апреля 2013

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

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

И это все.

115 голосов
/ 15 декабря 2009

Расстояние между 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 (), что сделает его немного быстрее.

19 голосов
/ 08 июля 2015

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

extension CGPoint {

    func distance(toPoint p:CGPoint) -> CGFloat {
        return sqrt(pow(x - p.x, 2) + pow(y - p.y, 2))
    }
}
12 голосов
/ 20 декабря 2012
-(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);
10 голосов
/ 04 сентября 2017

С помощью 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() и функции 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(_:_:) function

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
2 голосов
/ 14 июня 2013

Я написал это, я часто его использую:

- (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]

0 голосов
/ 28 июля 2013
#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 голосов
/ 27 мая 2013

Если вы хотите найти абсолютное значение расстояния между двумя точками, вы можете использовать (для Cocos2d):

float distance = abs(ccpDistance(point1, point2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...