Мне нужно рассчитать расстояние между двумя CGPoint
s. Я ссылался на этот и этот, но я этого не понимаю.
Рассчитать расстояние между двумя CGPoints
Ответ 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