2014-07-11 7 views
3

J'essaie de trouver le moyen le plus rapide et le plus simple dans un programme C# de calculer les intersections de deux cercles. D'après ce que je peux dire il y a deux méthodes possibles, et vous devrez me pardonner de ne pas connaître les noms officiels pour eux.Quelle est la méthode la plus efficace pour calculer les intersections de deux cercles?

Nous supposons que vous connaissez les points centraux des deux cercles et leurs rayons exacts, à partir desquels vous pouvez calculer la distance entre eux, tout ce qui manque est le (s) point (s) d'intersection. Ceci se déroule sur une parcelle x-y standard.

Le premier est un type de méthode de substitution telle que celle décrite here où l'on combine les deux formules de cercle et d'isoler soit x ou y, puis le sous-le dans une formule originale pour aboutir à une équation du second degré qui peut être résolu pour deux (ou éventuellement une ou aucune) coordonnées pour un axe, ce qui vous permet ensuite de trouver les coordonnées correspondantes sur l'autre axe. La seconde à laquelle j'ai vu une référence est l'utilisation d'une méthode de loi des cosinus pour déterminer les angles, ce qui permettrait ensuite de tracer une ligne pour chaque côté de la grille, et mettre dans votre rayon pour trouver le point d'intersection réel .

J'ai écrit les étapes pour la première méthode, et cela semble plutôt long. La seconde va prendre quelques recherches/apprendre à écrire mais semble plus simple. Ce que je n'ai jamais fait, c'est traduire des processus comme celui-ci en code, donc je ne sais pas finalement lequel sera le plus facile pour cette application. Quelqu'un a-t-il des conseils à ce sujet? Ou est-ce que je vais peut-être aller dans le mauvais sens? Y a-t-il déjà une bibliothèque que je peux utiliser pour réinventer la roue?

Quelque contexte: Je suis principalement préoccupé par le coût pour le CPU pour faire ces calculs. Je prévois sur l'application faire un bon nombre d'entre eux à la fois, à plusieurs reprises, d'où la raison pour laquelle je veux le moyen le plus simple pour l'accomplir.

+0

Vous mettez dans un lien, je pense que vous avez oublié de mettre l'URL au fond. En outre, cela ressemble beaucoup plus à un problème mathématique qu'à un problème de C#. – gunr2171

+2

Cette question semble être hors sujet car il s'agit de maths – DavidG

+0

@DavidG: Non, il s'agit de programmation.Peut-être que c'est «trop large» ou quelque chose, mais ce n'est certainement pas hors sujet en raison du sujet. – tmyklebu

Répondre

3

La géométrie de calcul est presque toujours une douleur à mettre en œuvre. C'est aussi presque toujours un processeur intensif. Cela dit, ce problème n'est que de l'algèbre si vous le configurez correctement.

Calculez d = hypot(x2-x1, y2-y1), la distance entre les deux centres. Si r1 + r2 < d, il n'y a pas d'intersection. Si r1+r2 == d, l'intersection est à (x1, y1) + r1/(r1+r2) * (x2-x1,y2-y1). Si d < abs(r1-r2), un cercle est contenu dans l'autre et il n'y a pas d'intersection. Vous pouvez déterminer le cas où les deux cercles sont tangents et l'un est contenu dans l'autre. Je ne traiterai que le cas restant.

Vous voulez trouver des distances h orthogonales à (x2-x1,y2-y1) et p parallèle à (x2-x1,y2-y1) de telle sorte que p^2 + h^2 = r1^2 et (d-p)^2 + h^2 = r2^2. Soustrayez les deux équations pour obtenir une équation linéaire en p: d^2-2dp = r2^2-r1^2. Résolvez cette équation linéaire pour p. Puis h = sqrt(r1^2 - p^2).

Les coordonnées des deux points sont (x1,y1) + p (x2-x1,y2-y1)/d +/- h (y2-y1, x1-x2)/d. Si vous travaillez à travers la dérivation ci-dessus et résolvez pour p/d et h/d à la place, vous pouvez obtenir quelque chose qui fait moins d'opérations.

+0

Merci, c'est une explication très succincte qui supprime quelques étapes que je prenais pour commencer. Je vais essayer de mettre en œuvre cela et de faire un suivi avec vous. – thanby

+0

Ok, juste un tout petit peu de clarification s'il vous plaît ... Quand je suis cette dernière étape pour trouver les coordonnées je suis, par exemple, en multipliant littéralement '(x2-x1, y2-y1)' par 'p' et en divisant par 'd', puis en ajoutant' (x1, y1) 'pour que la coordonnée finale soit' (((p (x2-x1))/d) + x1, ((p (y2-y1))/d) + y1) '? Cela fait longtemps que je n'ai pas effectué d'opérations sur les coordonnées des points, donc je veux juste m'assurer que je lis bien. Cela m'a donné une réponse proche de ce à quoi je m'attendais mais pas exactement, même si mes diagrammes dessinés à la main manquent peut-être de précision ... – thanby

+1

@thanby: Votre arithmétique est correcte. Mais '(x1, y1) + p/d (x2-x1, y2-y1)' sera le point sur la ligne entre '(x1, y1)' et '(x2, y2)' qui est à mi-chemin entre les deux -circle points d'intersection. Vous devez ajouter le terme '+/- h (y2-y1, x1-x2)' pour obtenir les points d'intersection cercle-cercle eux-mêmes. – tmyklebu

Questions connexes