Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

И что это.

Ответ 3

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

extension CGPoint {

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

Ответ 4

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

Ответ 5

С 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(_:_:)

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:) method

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

Ответ 6

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

- (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, но я по-прежнему использую свою собственную функцию для некоторых вещей, потому что, когда я учился, я написал кучу своих собственных функций для простых вещей, а не для поиска "официальных" функций более высокого порядка и, кроме того, m не большой поклонник функций (vars, vars), я предпочитаю [self functions vars and: vars]

Ответ 7

Я считаю, что использование умножения будет быстрее, чем функция pow, которую некоторые предпочитают. В Swift:

public func distanceBetween(p1 : CGPoint, p2 : CGPoint) -> CGFloat {
    let dx : CGFloat = p1.x - p2.x
    let dy : CGFloat = p1.y - p2.y
    return sqrt(dx * dx + dy * dy)
}

Совет для сравнения расстояний

Однако совет: если вы сравниваете расстояния (например, чтобы найти наименьший или самый большой), то лучше пропустить бит sqrt (который медленный) и просто сравнить квадраты расстояний.

Ответ 8

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

float distance = abs(ccpDistance(point1, point2));

Ответ 9

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

Ответ 10

Это способ сделать это, если вы хотите найти расстояние между точками, используя массив:

extension Array where Element == CGPoint {
    func distance() -> CGFloat {
        let xDist = self[0].x - self[1].x
        let yDist = self[0].y - self[1].y
        return CGFloat(sqrt(xDist * xDist + yDist * yDist))
    }
}