10
votes

Intersection du cercle de segment de ligne

J'essaie de déterminer le point à laquelle un segment de ligne intersectez un cercle. Par exemple, étant donné n'importe quel point entre P0 et P3 (et supposant également que vous connaissez le rayon), quelle est la méthode la plus facile pour déterminer P3?

cercle


0 commentaires

5 Réponses :


18
votes

Généralement,

  • Trouvez l'angle entre P0 et P1
  • Tracez une ligne à cet angle de P0 à une distance R, qui vous donnera P3

    en pseudocode, xxx


3 commentaires

C'est exactement ce que je cherchais - essayer de dessiner des lignes entre deux cercles avec les lignes dirigées au centre, mais avec les points d'extrémité sur le à l'extérieur des cercles plutôt que les centres actuels.


Cette méthode est bonne, mais la restructuration de l'utilisation de RSQRT & NORMALLS, au lieu d'Atan2 + Cos + Sin & Angles, était le billet de performance pour moi. J'espère que cela aide quelqu'un! :)


Ceci est correct lorsque P0 est le centre du cercle, car le dessin ci-dessus montre, mais la question ne semble pas être à propos de cela



5
votes

Vous avez un système d'équations. Le cercle est défini par: x ^ 2 + y ^ 2 = r ^ 2 . La ligne est définie par y = y0 + [(Y1 - Y0) / (x1 - x0)] · (x - x0) . Substituez la seconde dans la première dans la première, vous obtenez x ^ 2 + (Y0 + [(Y1 - Y0) / (x1 - x0)] · (x - x0)) ^ 2 = r ^ 2 . Résolvez ceci et vous obtiendrez 0-2 valeurs pour x. Branchez-les dans une équation pour obtenir vos valeurs pour y.


3 commentaires

Lorsque vous obtenez deux solutions, comment direz-vous lequel est lequel est P3 et lequel est le point correspondant de l'autre côté du cercle?


Trouvez la distance entre chaque point et P1. Vous pouvez calculer le carré de la distance par (x3-x1) ^ 2 + (y3-y1) ^ 2, selon ceux qui sont les plus petits sont plus proches de P1.


Veuillez noter que cette solution ne fonctionne pas pour le cas où X1-X0 est nulle!



10
votes

du centre du cercle et du rayon, vous pouvez écrire l'équation décrivant le cercle. À partir des deux points P0 et P1, vous pouvez écrire l'équation décrivant la ligne.

Vous avez donc 2 équations dans 2 inconnues, que vous pouvez résoudre à la substitution.

let (x0, y0) = coordonnées du point P0

et (x1, y1) = coordonnées du point P1

et r = le rayon du cercle.

L'équation du cercle est la suivante: xxx

L'équation de la ligne est la suivante: xxx

Branchez la 2e équation dans la première donne: xxx

De même, vous pouvez trouver que xxx

Le point (x, y) est le point d'intersection entre la ligne et le cercle, (x, y) est votre réponse. xxx


0 commentaires

6
votes

aller pour ce code..its Enregistrez l'heure

private boolean circleLineIntersect(float x1, float y1, float x2, float y2, float cx, float cy, float cr ) {
      float dx = x2 - x1;
      float dy = y2 - y1;
      float a = dx * dx + dy * dy;
      float b = 2 * (dx * (x1 - cx) + dy * (y1 - cy));
      float c = cx * cx + cy * cy;
      c += x1 * x1 + y1 * y1;
      c -= 2 * (cx * x1 + cy * y1);
      c -= cr * cr;
      float bb4ac = b * b - 4 * a * c;

         // return false  No collision
         // return true Collision
      return bb4ac >= 0;
    }


3 commentaires

Ceci est pour la ligne qui si différent du segment de ligne.


Cela revient simplement un booléen qui dit s'il y a une intersection, cela ne retourne pas l'intersection elle-même


Pourquoi ne pas remplacer les 5 lignes inférieures de la fonction avec retour bb4ac> = 0 ?



1
votes

Code MATLAB

FONCTION [DRAPAIL] = CirclelineeegmentInsection2 (AX, AY, BX, BY, CX, CY, R)

% A et B sont deux points d'extrémité d'un segment de ligne et C est le centre de Le cercle,% r est le rayon du cercle. Cette fonction calculer le point le plus proche Fron C au segment% si la distance à la Point le plus proche> R retour 0 autre 1 xxx

fin


0 commentaires