Si vous avez un cercle avec centre (center_x, center_y)
et rayon radius
, comment testez-vous si un point donné avec des coordonnées se (x, y)
trouve à l'intérieur du cercle?
309
Si vous avez un cercle avec centre (center_x, center_y)
et rayon radius
, comment testez-vous si un point donné avec des coordonnées se (x, y)
trouve à l'intérieur du cercle?
Réponses:
En général,
x
ety
doit satisfaire(x - center_x)^2 + (y - center_y)^2 < radius^2
.Veuillez noter que les points qui satisfont l'équation ci-dessus avec
<
remplacé par==
sont considérés comme les points sur le cercle, et les points qui satisfont l'équation ci-dessus avec<
remplacé par>
sont considérés comme l' extérieur du cercle.la source
<=
trouvera des points à l'intérieur du cercle ou sur son bord.Mathématiquement, Pythagore est probablement une méthode simple comme beaucoup l'ont déjà mentionné.
Sur le plan informatique, il existe des moyens plus rapides. Définir:
Si un point est plus susceptible d'être en dehors de ce cercle, imaginez un carré tracé autour de lui de telle sorte que ses côtés soient tangents à ce cercle:
Imaginez maintenant un diamant carré dessiné à l'intérieur de ce cercle de telle sorte que ses sommets touchent ce cercle:
Nous avons maintenant couvert la majeure partie de notre espace et il ne reste qu'une petite zone de ce cercle entre notre carré et le diamant à tester. Ici, nous revenons à Pythagore comme ci-dessus.
Si un point est plus susceptible d'être à l' intérieur de ce cercle, inversez l'ordre des 3 premières étapes:
D'autres méthodes imaginent un carré à l'intérieur de ce cercle au lieu d'un diamant, mais cela nécessite un peu plus de tests et de calculs sans avantage de calcul (le carré intérieur et les diamants ont des zones identiques):
Mettre à jour:
Pour ceux qui s'intéressent aux performances, j'ai implémenté cette méthode en c et compilé avec -O3.
J'ai obtenu les temps d'exécution par
time ./a.out
J'ai implémenté cette méthode, une méthode normale et une méthode fictive pour déterminer le temps système.
Normal: 21.3s This: 19.1s Overhead: 16.5s
Il semble donc que cette méthode soit plus efficace dans cette implémentation.
la source
inCircleN
vous utilisez un ABS inutile. Probablement sans différence ABS entreinCircle
etinCircleN
serait plus petit.Vous pouvez utiliser Pythagore pour mesurer la distance entre votre point et le centre et voir si elle est inférieure au rayon:
EDIT (pointe du chapeau à Paul)
En pratique, la quadrature est souvent beaucoup moins chère que de prendre la racine carrée et comme nous ne sommes intéressés que par une commande, nous pouvons bien sûr renoncer à prendre la racine carrée:
En outre, Jason a noté que cela
<=
devrait être remplacé par<
et, selon l'utilisation, cela pourrait avoir du sensmême si je crois que ce n'est pas vrai au sens mathématique strict. Je me suis trompé.la source
**
ou^
. Le meilleur moyen de le faire lorsque vous avez juste besoin x ^ 2 ou x ^ 3 est de le faire « manuellement »:x*x
.C'est plus efficace et plus lisible. Il évite l'opération coûteuse de racine carrée. J'ai également ajouté une vérification pour déterminer si le point se trouve dans le rectangle englobant du cercle.
La vérification du rectangle n'est pas nécessaire, sauf avec de nombreux points ou de nombreux cercles. Si la plupart des points se trouvent à l'intérieur des cercles, la vérification du rectangle englobant ralentira les choses!
Comme toujours, assurez-vous de considérer votre cas d'utilisation.
la source
Calculez la distance
c'est en C # ... convertir pour une utilisation en python ...
la source
Vous devez vérifier si la distance entre le centre du cercle et le point est inférieure au rayon, c.-à-d.
la source
Comme indiqué ci-dessus - utilisez la distance euclidienne.
la source
Trouvez la distance entre le centre du cercle et les points donnés. Si la distance entre eux est inférieure au rayon, le point se trouve à l'intérieur du cercle. si la distance entre eux est égale au rayon du cercle, alors le point est sur la circonférence du cercle. si la distance est supérieure au rayon, le point est en dehors du cercle.
la source
L'équation ci-dessous est une expression qui teste si un point se trouve dans un cercle donné où xP & yP sont les coordonnées du point, xC & yC sont les coordonnées du centre du cercle et R est le rayon de ce cercle donné.
Si l'expression ci-dessus est vraie, le point se trouve dans le cercle.
Voici un exemple d'implémentation en C #:
la source
Il s'agit de la même solution que celle mentionnée par Jason Punyon , mais elle contient un exemple de pseudo-code et quelques détails supplémentaires. J'ai vu sa réponse après avoir écrit ceci, mais je ne voulais pas supprimer la mienne.
Je pense que le moyen le plus facilement compréhensible est de calculer d'abord la distance entre le centre du cercle et le point. J'utiliserais cette formule:
Ensuite, comparez simplement le résultat de cette formule, la distance (
d
), avec leradius
. Si la distance (d
) est inférieure ou égale au rayon (r
), le point est à l'intérieur du cercle (sur le bord du cercle sid
etr
sont égaux).Voici un exemple de pseudo-code qui peut facilement être converti en n'importe quel langage de programmation:
Où
circle_x
etcircle_y
est les coordonnées centrales du cercle,r
est le rayon du cercle etx
ety
est les coordonnées du point.la source
Ma réponse en C # comme solution complète de copier-coller (non optimisé):
Usage:
la source
Comme indiqué précédemment, pour montrer si le point est dans le cercle, nous pouvons utiliser ce qui suit
Pour le représenter graphiquement, nous pouvons utiliser:
la source
J'ai utilisé le code ci-dessous pour des débutants comme moi :).
classe publique incirkel {
la source
Entrer dans le monde de la 3D si vous voulez vérifier si un point 3D se trouve dans une sphère d'unité vous finissez par faire quelque chose de similaire. Pour travailler en 2D, il suffit d'utiliser des opérations vectorielles 2D.
la source
Je sais que c'est à quelques années de la meilleure réponse votée, mais j'ai réussi à réduire le temps de calcul de 4.
Il vous suffit de calculer les pixels à partir du 1/4 du cercle, puis de multiplier par 4.
Voici la solution que j'ai trouvée:
la source
Voici le code java simple pour résoudre ce problème:
et les mathématiques derrière: /math/198764/how-to-know-if-a-point-is-inside-a-circle
la source
PHP
la source