Si un cercle est à l'intérieur d'un cercle
Je vais avoir un peu de mal. J'ai une mission qui m'oblige à trouver si un deuxième cercle se chevauchent à l'intérieur, ou ni l'un second cercle. Cependant, j'ai du mal à vérifier pour le chevauchement et si le second cercle est à l'intérieur de la première.
(variables utilisées sont x1, x2, y1, y2, r1, r2, distance)
Voici ce que j'ai:
if (distance > (r1 + r2)) {
//No overlap
System.out.println("Circle2 does not overlap Circle1");
} else if (distance <= Math.abs(r1 + r2)) {
//Overlap
System.out.println("Circle2 overlaps Circle1");
} else if ((distance <= Math.abs(r1 - r2)) {
//Inside
System.out.println("Circle2 is inside Circle1");
}
Je crains que le problème est avec le chevauchement et à l'intérieur des chèques, mais je ne peux pas comprendre comment bien le configurer afin que je puisse vérifier de façon fiable si le second cercle est à l'intérieur de la première.
De l'aide ou des conseils seraient grandement appréciés comme j'ai essayé plusieurs méthodes mais la solution tout simplement m'échappe à chaque fois.
Toutes les variables sont entrés par l'utilisateur. Oui, la distance est la distance entre les deux centres des deux cercles avec la formule de la distance.
Je viens de googlé pour trouver au sujet de ce problème et a trouvé ce gamedev.stackexchange.com/questions/7172/...
Je pense que la distance entre les centres est la clé.... et l'ordre que vous faites le test...
Génial, merci, cela va aider un peu.
OriginalL'auteur Battleroid | 2012-02-28
Vous devez vous connecter pour publier un commentaire.
vous avez juste besoin de vérifier à l'intérieur avant de se chevaucher distance pour l'intérieur <= distance de chevauchement
réponse modifiés par Chris commentaires
Vous disposez de code inutile. Depuis r1 et r2 sont tous les deux >0 (je suppose, car ils sont les rayons) puis r1+r2 n'a pas besoin de l'abs appeler autour de lui. Si vous puis de comparer cette case pour votre premier alors vous allez noter qu'il sera toujours essayer si le premier était faux, de sorte que vous pouvez sauter la condition et de faire le dernier une plaine d'autre.
Je sais que j'ai juste remanié le code dans la question d'origine, mais c'est un bon point à faire, je vais mettre un commentaire.
Ce que vous avez fait indique que c'est le bon test mais qui ne l'est pas. Si vous avez le bon critère, il n'est pas n'importe quel ordre. La seule raison pour laquelle votre réponse fonctionne est parce que votre test final arrive toujours true.
OriginalL'auteur Dampsquid
Ce problème est probablement plus facile travaillé visuellement d'abord et ensuite le code écrit. Vous regardez comme vous avez le droit de logique pour ne pas l'intérieur et entièrement à l'intérieur.
Le moyen le plus facile de traiter avec cela est que si ils ne sont pas entièrement à l'intérieur et à l'extérieur alors qu'ils doivent se chevaucher. Ce n'est certainement comment je code. Le calcul est un peu plus compliqué que les deux autres.
L'état actuel est:
r2>r1-d
etr2 < r1+d
Par symmetery nous n'avons pas besoin de faire les deux moyens de contourner (si vous échangez des r2 et r1 en deux et faire un peu de réarrangement vous obtenez le même paire d'équations).
Plus simple de tout simplement laisser cela dans le "else" catégorie mais plutôt que de coder pour elle, sauf si vous devez pour une raison quelconque.
OriginalL'auteur Chris
Bien, si la somme de la distance et de plus petit rayon est inférieur à l'autre rayon, cercle plus petit doit être à l'intérieur le plus grand.
Désolé, mais ce n'est pas vrai. Eh bien, au moins, aussi longtemps que le distance signifie que la distance entre les deux centres. Si les centres sont assez loin que les cercles se coupent, nous aurons alors deux cas: a) le centre d'un cercle à l'est dans l'autre => d+r2 > r1 || d+r1 > r2 ; ou b) un cercle de centre est dans l'autre cercle => d>r1 || j>r2 déjà.
OriginalL'auteur Matthias
Vous êtes très près de là. C'est juste l'ordre des conditions qui ne va pas.
Vérification de l'intérieur", après le "non-cumul" cas assure qu'il ne sera pas accidentellement considéré comme un chevauchement. Alors tout le reste doit être chevauchements.
OriginalL'auteur Phil H
Modifier pour l'évidence commentaire proxy:
La distance entre deux points dans l'espace, sont décrits par pythagore:
Qui, évidemment, se traduit par le code
La distance est au contact r1 + r2.
Avant de modifier les indices:
Vous avez besoin de l'angle entre les cercles.
Ensuite, vous calculez la distance depuis circle1 de cercle 2. Si elle est inférieure à radii1 + radii2 vous êtes à l'intérieur.
atan2 peut être fonction de l'intérêt.
Ou tout simplement aller avec le pythagoricien distance directement.
Oui, c'est la distance de pythagore.
Je ne suis pas sûr ce qui explique pourquoi vous pensez que vous avez besoin angles. Vous allez seulement à compliquer les choses et atan2 est pas vraiment d'intérêt pour ce problème et va vous conduire sur le chemin à une mauvaise solution...
J'essayais juste d'être utile avec une multitude de suggestions tagged Java, en mathématiques et en devoirs. Tous les moyens ont leurs propres récompenses, aucune fin dans une mauvaise solution. Je n'ai aucune idée de pourquoi vous avez écrit que.
Je ne crois pas que toute solution qui peut être considéré comme le droit serait d'utiliser les fonctions trigonométriques. Je ne suis même pas sûr que vous avez besoin de l'xn,yn puisque nous avons reçu la distance entre les deux points. Si vous commencez à utiliser l'angle que vous êtes plus susceptible de faire quelque chose qui peut être grandement simplifié. par exemple, même en supposant que nous n'avons pas la distance déjà, vous pouvez travailler l'angle de l'x et y à l'aide de arctan et ensuite utiliser sin/cos à travailler sur la distance entre les deux points, mais il ne serait toujours pas une bonne façon de le faire (et donc j'avais mal dit), étant donné que vous pouvez simplement utiliser le théorème de pythagore pour le faire (comme vous l'avez fait).
OriginalL'auteur Captain Giraffe
Son une tâche simple,
prendre la somme du rayon de deux cercle. dire r1+ r2 .
Maintenant, trouver la distance entre le centre de deux cercle qui est sqrt((x1-x2)^2 + (y1-y2)^2)
if r1+r2 = sqrt((x1-x2)^2 + (y1-y2)^2) they just touch each other.
if r1+r2 > sqrt((x1-x2)^2 + (y1-y2)^2) the circle overlaps(intersect)
if r1+ r2 < sqrt((x1-x2)^2 + (y1-y2)^2) the circle doesnot intersect
OriginalL'auteur Invictus
OriginalL'auteur Sergiu