Calculer la distance entre deux CGPoints
7 réponses
Eh bien, avec stuff votre référencement aussi Où est le code complet:
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 distance est la distance variable.
Que se passe-t-il ici:
- donc d'abord, nous faisons deux points...
- Ensuite, nous trouvons la distance entre les coordonnées x des points.
- Maintenant, nous trouvons la distance entre les coordonnées Y.
- ces longueurs sont les deux côtés du triangle, en fait ce sont les jambes, le temps de trouver l'hypoténuse ce qui signifie Après avoir fait quelques calculs pour rearragne c^2 = a^2 + b^2 nous obtenons l'hypoténuse à sqrt égal((xDist^2) + (yDist^2)). xDist^2 = (xDist * xDist). Et de même: yDist^2 = (yDist * yDist)
Vous ne pouvez pas vraiment faire D'un CGPoint la distance, la distance n'a pas de composant x et Y. Il est juste 1 Nombre.
Si vous pensez que CGPoint est une unité de mesure (par exemple, feet est une unité de mesure), ce n'est pas le cas.
J'ai dû le faire à la main 10 000 fois alors j'ai écrit une fonction pour cela et je l'ai collée dans ma bibliothèque personnelle que je jette toujours au début d'un nouveau programme donc j'oublie que ce n'est pas cannon.
- (float)distanceBetween:(CGPoint)p1 and:(CGPoint)p2
{
return sqrt(pow(p2.x-p1.x,2)+pow(p2.y-p1.y,2));
}
Donc vous l'appelez comme ceci (dites que vous voulez savoir jusqu'où vous avez déplacé votre doigt):
float moveDistance = [self distanceBetween:touchStart and:touchEnd];
Ceci est également utile dans les fonctions de mouvement pour la vérification ponctuelle dans un menu de défilement:
if([self distanceBetween:touchStart and:touchAt] > 20*scalePoints)
isItATap = FALSE;
Définir "isItATap" vrai dans touchesBegan, mettre ce qui précède dans touchesMoved, alors vous savez le joueur a déplacé son doigt trop loin pour que le toucher soit un "robinet", de sorte que vous pouvez ne pas sélectionner l'objet touché par le joueur et faire défiler l'objet.
En ce qui concerne l'échelle, cela devrait être basé sur le fait que vous ayez ou non un écran retina et la taille d'un appareil sur lequel vous vous trouvez (diviser par 2 pour l'affichage retina car une distance physique de 5 "points" sur un écran normal, car le doigt de l'utilisateur sent qu'il apparaîtra comme 10 "pixels" sur un écran Retina, puisque chaque point est de 4 pixels, donc, vous vous retrouverez avec une situation où le joueur a du mal à taper sur l'écran retina (ce qui est un oubli commun)
On dirait que vous voulez probablement le vecteur de p1 à p2 (ou différence) plutôt que la distance.
const CGPoint p1 = {10, 10};
const CGPoint p2 = {510, 310};
const CGPoint diff = {p2.x - p1.x, p2.y - p1.y} // == (CGPoint){500, 300}
Réponse Courte
CGPoint p1, p2; // Having two points
CGFloat distance = hypotf((p1.x-p2.x), (p1.y-p2.y));
Explination Plus Longue
Si vous avez deux points p1
et p2
, il est évidemment facile de trouver la différence entre leur height
et width
(par exemple, ABS(p1.x - p2.x)
), mais de trouver une représentation fidèle de leur distance que vous voulez vraiment l'hypothénuse (H
ci-dessous).
p1
|\
| \
| \ H
| \
| \
|_ _ _\
p2
, Heureusement, il y a un construit en macro: hypotf
(ou hypot
pour doubles
):
// Returns the hypothenuse (the distance between p1 & p2)
CGFloat dist = hypotf((p1.x-p2.x), (p1.y-p2.y));
(original référence)
Dans Swift, vous pouvez ajouter une extension à CGPoint:
extension CGPoint {
func distance(to point: CGPoint) -> CGFloat {
return sqrt(pow((point.x - x), 2) + pow((point.y - y), 2))
}
}
Et utilisez-le comme ceci:
let distance = p1.distance(to: p2)
Seulement ceci...
float distance = ccpLength(ccpSub(p1,p2));
Où p1 et p2 sont des objets de CGPoint
Swift 4, Swift 3 solution
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))
}
}