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

Рассчитать расстояние между двумя CGPoints

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

4b9b3361

Ответ 1

Хорошо, с материалом, на котором вы ссылаетесь, где находится полный код:

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]

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

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

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

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

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

Ответ 2

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

- (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 в touchhesBegan, поместите вышеприведенное в touchhesMoved, тогда вы знаете, что игрок слишком далеко перемещает свой палец, чтобы касание было "нажатием", поэтому вы можете НЕ выбирать объект, к которому коснулся игрок, и вместо этого прокрутите объект вокруг.

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

Ответ 3

Похоже, вы, вероятно, хотите, чтобы вектор от 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}

Ответ 4

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

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

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

Ответ 5

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

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

и используйте его следующим образом:

let distance = p1.distanceToPoint(p2)

Ответ 6

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

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

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