Il n'y a que deux cas où le cercle coupe le rectangle :
- Soit le centre du cercle se trouve à l'intérieur du rectangle, ou
- Une des arêtes du rectangle a un point dans le cercle.
Remarquez que cela ne nécessite pas que le rectangle soit aligné sur les axes.
(Une façon de voir ceci : si aucune des arêtes n'a un point dans le cercle (si toutes les arêtes sont complètement "à l'extérieur" du cercle), alors le seul moyen pour le cercle de croiser encore le polygone est s'il se trouve entièrement à l'intérieur du polygone.)
Avec cette idée en tête, quelque chose comme ce qui suit fonctionnera, où le cercle a pour centre P
et pour rayon R
, et le rectangle a pour sommets A
, B
, C
, D
dans cet ordre (non code complet) :
def intersect(Cercle(P, R), Rectangle(A, B, C, D)):
S = Cercle(P, R)
return (pointDansRectangle(P, Rectangle(A, B, C, D)) or
intersecterCercle(S, (A, B)) or
intersecterCercle(S, (B, C)) or
intersecterCercle(S, (C, D)) or
intersecterCercle(S, (D, A)))
Si vous écrivez de la géométrie, vous avez probablement déjà ces fonctions ci-dessus dans votre bibliothèque. Sinon, pointDansRectangle()
peut être implémenté de plusieurs manières ; n'importe quelle méthode générale de point dans un polygone fonctionnera, mais pour un rectangle vous pouvez simplement vérifier si cela fonctionne :
0 ≤ AP·AB ≤ AB·AB et 0 ≤ AP·AD ≤ AD·AD
Et intersecterCercle()
est également facile à implémenter : une façon serait de vérifier si le pied de la perpendiculaire de P
à la ligne est assez proche et entre les points d'extrémité, et de vérifier les points d'extrémité sinon.
La chose cool est que la même idée fonctionne non seulement pour les rectangles mais pour l'intersection d'un cercle avec n'importe quel polygone simple — pas besoin d'être convexe !
1 votes
Le rectangle est-il toujours aligné avec les axes, ou peut-il être tourné selon un angle arbitraire?
13 votes
@eJames: en quoi cela importe-t-il? Vous vérifiez le rectangle pour une intersection avec un cercle; vous pouvez toujours transformer votre système de coordonnées de sorte que le rectangle soit parallèle à l'axe sans aucun changement dans le cercle :-)
0 votes
Tu devrais ajouter ça comme une réponse, en tournant à travers - et tout...
2 votes
@ShreevatsaR: Cela importe en termes de savoir si j'ai besoin de m'inquiéter de cette traduction de coordonnées ou non. @aib: Oh la la!