Calculer la distance entre deux CGPoints

J'ai besoin de calculer la distance entre deux CGPoints. J'ai appelé ce et ce, mais je ne l'obtenez pas.

25
demandé sur Community 2011-06-20 23:04:38

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:

  1. donc d'abord, nous faisons deux points...
  2. Ensuite, nous trouvons la distance entre les coordonnées x des points.
  3. Maintenant, nous trouvons la distance entre les coordonnées Y.
  4. 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.

49
répondu Dair 2011-06-20 19:24:22

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)

21
répondu redux 2016-12-15 09:28:38

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}
18
répondu Andrew Pouliot 2011-06-20 19:48:06

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)

11
répondu Firo 2017-05-23 12:34:39

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)
8
répondu Chris Vasselli 2018-05-02 10:14:59

Seulement ceci...

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

Où p1 et p2 sont des objets de CGPoint

2
répondu mohitdream4u 2014-02-07 10:05:48

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))
        }
    }
1
répondu Vyacheslav 2018-04-18 22:19:18