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? P>
p>
5 Réponses :
Généralement,
en pseudocode, p>
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 i> 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
Vous avez un système d'équations. Le cercle est défini par: x ^ 2 + y ^ 2 = r ^ 2 code>. La ligne est définie par y = y0 + [(Y1 - Y0) / (x1 - x0)] · (x - x0) code>. 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 code>. Résolvez ceci et vous obtiendrez 0-2 valeurs pour x. Branchez-les dans une équation pour obtenir vos valeurs pour y. P>
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!
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. P>
let (x0, y0) = coordonnées du point P0 P>
et (x1, y1) = coordonnées du point P1 P>
et r = le rayon du cercle. P> blockquote>
L'équation du cercle est la suivante: p>
xxx pré> L'équation de la ligne est la suivante: p>
xxx pré> Branchez la 2e équation dans la première donne: p>
xxx pré> De même, vous pouvez trouver que p>
xxx pré> Le point (x, y) est le point d'intersection entre la ligne et le cercle, (x, y) est votre réponse. p>
xxx pré> p>
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;
}
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 code>?
Code MATLAB STRAR> FONCTION [DRAPAIL] = CirclelineeegmentInsection2 (AX, AY, BX, BY, CX, CY, R) P> % 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 p>
blockQuote> fin p> p>