Рассчитать расстояние между двумя CGPoints - PullRequest
26 голосов
/ 20 июня 2011

Мне нужно рассчитать расстояние между двумя CGPoint с. Я упоминал это и это , но я не понимаю.

Ответы [ 7 ]

52 голосов
/ 20 июня 2011

Ну, с вещами, которые вы тоже используете, где полный код:

CGPoint p2; //[1]
CGPoint p1;
//Assign the coord of p2 and p1...
//End Assign...
CGFloat xDist = (p2.x - p1.x); //[2]
CGFloat yDist = (p2.y - p1.y); //[3]
CGFloat distance = sqrt((xDist * xDist) + (yDist * yDist)); //[4]

Расстояние - это переменное расстояние.

Что здесь происходит:

  1. Итак, сначала мы делаем две точки ...
  2. Затем мы находим расстояние между координатами x точек.
  3. Теперь мы находим расстояние между координатами y.
  4. Эти длины - две стороны треугольника, потому что они - ноги, время, чтобы найти гипотенузу, что означает, что после некоторой математики, чтобы перераспределить(xDist ^ 2) + (yDist ^ 2)).xDist ^ 2 = (xDist * xDist).И также: yDist ^ 2 = (yDist * yDist)

Вы не можете сделать CGPoint равным расстоянию, расстояние не имеет компонентов x и y.Это всего лишь 1 цифра.

Если вы думаете, что CGPoint - это единица измерения (например, футы - это единица измерения), это не так.

22 голосов
/ 14 июня 2013

Мне приходилось делать это вручную 10000 раз, поэтому я написал для нее функцию и вставил ее в свою личную библиотеку, которую я всегда помещаю в начало новой программы, поэтому я забываю, что это не пушка.

- (float)distanceBetween:(CGPoint)p1 and:(CGPoint)p2
{
    return sqrt(pow(p2.x-p1.x,2)+pow(p2.y-p1.y,2));
}

так вы называете это так (скажем, вы хотите знать, как далеко вы двигали пальцем):

float moveDistance = [self distanceBetween:touchStart and:touchEnd];

Это полезно в функциях перемещения, а также для выборочной проверки в меню прокрутки:

if([self distanceBetween:touchStart and:touchAt] > 20*scalePoints)
    isItATap = FALSE;

Установите «isItATap» в true в touchsBegan, поместите вышеупомянутое в touchsMoved, чтобы вы знали, что игрок слишком сильно сдвинул палец, чтобы касание было «касанием», так что вы можете сделать так, чтобы он НЕ выбирал объект, которого касался игрок вместо этого прокрутите объект вокруг.

Что касается масштаба, то это должно основываться на том, есть ли у вас дисплей сетчатки и какой у вас размер устройства (делите на 2 для дисплея сетчатки, поскольку физическое расстояние в 5 «точек» на обычном экране равно палец пользователя чувствует, что на экране дисплея сетчатки он будет отображаться как 10 «пикселей», поскольку каждая точка имеет 4 пикселя, поэтому вы столкнетесь с ситуацией, когда игроку будет очень трудно постучать по дисплею сетчатки (который общий недосмотр)

20 голосов
/ 20 июня 2011

Звучит так, как будто вы, вероятно, хотите вектор от p1 до p2 (или разница ), а не расстояние.

const CGPoint p1 = {10, 10};
const CGPoint p2 = {510, 310};

const CGPoint diff = {p2.x - p1.x, p2.y - p1.y} // == (CGPoint){500, 300}
14 голосов
/ 16 января 2016

Короткий ответ

CGPoint p1, p2; // Having two points
CGFloat distance = hypotf((p1.x-p2.x), (p1.y-p2.y));

Более длинное объяснение

Если у вас есть две точки p1 и p2, очевидно, легко найти разницу между их heightи width (например, ABS(p1.x - p2.x)), но чтобы найти истинное представление об их расстоянии, вам действительно нужен гипотенуза (H ниже).

 p1
  |\  
  | \  
  |  \ H
  |   \
  |    \
  |_ _ _\
         p2

К счастью, для этого есть встроенный макрос:hypotf (или hypot для doubles):

// Returns the hypothenuse (the distance between p1 & p2)
CGFloat dist = hypotf((p1.x-p2.x), (p1.y-p2.y));

(оригинал ссылка )

10 голосов
/ 01 июля 2016

В Swift вы можете добавить расширение для CGPoint:

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

и используйте его так:

let distance = p1.distance(to: p2)
2 голосов
/ 07 февраля 2014

только это ...

    float distance = ccpLength(ccpSub(p1,p2));

, где p1 и p2 - объекты CGPoint

1 голос
/ 19 апреля 2018

Swift 4, решение Swift 3

 extension CGPoint {
        static func distanceBetween(point p1: CGPoint,
                                    andPoint p2: CGPoint) -> CGFloat {
            return sqrt(pow((p2.x - p1.x), 2) + pow((p2.y - p1.y), 2))
        }
    }
...