iphone - usa - Calcula la distancia entre dos CGPoints
recorrido entre dos direcciones (7)
Respuesta corta
CGPoint p1, p2; // Having two points
CGFloat distance = hypotf((p1.x-p2.x), (p1.y-p2.y));
Explotacion mas larga
Si tiene dos puntos p1
y p2
, obviamente es fácil encontrar la diferencia entre su height
y su width
(p. Ej., ABS(p1.x - p2.x)
), pero para encontrar una representación real de su distancia, realmente desea la hipótesis ( H
abajo).
p1
|/
| /
| / H
| /
| /
|_ _ _/
p2
Afortunadamente, hay una macro incorporada para esto: hypotf
(o hypot
para doubles
):
// Returns the hypothenuse (the distance between p1 & p2)
CGFloat dist = hypotf((p1.x-p2.x), (p1.y-p2.y));
( reference original)
Bueno, con las cosas de su referencia también donde está el código completo:
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]
La distancia es la distancia variable.
Que esta pasando aqui:
- Así que antes que nada hacemos dos puntos ...
- Luego encontramos la distancia entre las coordenadas x de los puntos.
- Ahora encontramos la distancia entre las coordenadas y.
- Estas longitudes son dos lados del triángulo, de hecho son las patas, es hora de encontrar la hipotenusa, lo que significa que después de hacer algunos cálculos matemáticos para reordenar c ^ 2 = a ^ 2 + b ^ 2 obtenemos la hipotenusa igual a sqrt ((xDist ^ 2) + (yDist ^ 2)). xDist ^ 2 = (xDist * xDist). Y de la misma manera: yDist ^ 2 = (yDist * yDist)
Realmente no se puede hacer que un CGPoint sea la distancia, la distancia no tiene un componente xey. Es sólo 1 número.
Si piensa que CGPoint es una unidad de medida (por ejemplo, pies es una unidad de medida) no lo es.
En Swift, puede agregar una extensión a CGPoint:
extension CGPoint {
func distance(to point: CGPoint) -> CGFloat {
return sqrt(pow((point.x - x), 2) + pow((point.y - y), 2))
}
}
y úsalo así:
let distance = p1.distance(to: p2)
He tenido que hacer esto manualmente 10.000 veces, por lo que escribí una función y la coloqué en mi biblioteca personal que siempre descargué al comienzo de un nuevo programa, así que olvido que no es un cañón.
- (float)distanceBetween:(CGPoint)p1 and:(CGPoint)p2
{
return sqrt(pow(p2.x-p1.x,2)+pow(p2.y-p1.y,2));
}
así que lo llamas así (di que quieres saber a qué distancia moviste tu dedo):
float moveDistance = [self distanceBetween:touchStart and:touchEnd];
Esto es útil en las funciones de movimiento, así como para la comprobación puntual en un menú de desplazamiento:
if([self distanceBetween:touchStart and:touchAt] > 20*scalePoints)
isItATap = FALSE;
Establezca "isItATap" verdadero en los toques. Empiece, toque lo anterior en los toques Movido, entonces sabrá que el jugador movió su dedo demasiado lejos para que el toque sea un "toque", por lo que puede hacer que NO seleccione el objeto que tocó el jugador y, en cambio, desplazar objeto alrededor
En cuanto a la escala, debe basarse en si tiene o no pantalla de retina y en qué tamaño de dispositivo está (divida entre 2 para pantalla de retina debido a una distancia física de 5 "puntos" en una pantalla normal como dedo del usuario siente que surgirá como 10 "píxeles" en una pantalla de visualización de retina, ya que cada punto es de 4 píxeles, por lo que terminará en una situación en la que al jugador le cuesta mucho tocar la pantalla de retina (que es un descuido común) )
Parece que probablemente quieras el vector de p1 a p2 (o diferencia ) en lugar de la distancia.
const CGPoint p1 = {10, 10};
const CGPoint p2 = {510, 310};
const CGPoint diff = {p2.x - p1.x, p2.y - p1.y} // == (CGPoint){500, 300}
Swift 4, solución 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))
}
}
solo esto...
float distance = ccpLength(ccpSub(p1,p2));
donde p1 y p2 son objetos de CGPoint