Trouver tous les points à l'intérieur d'un cercle dans l'espace 2D
Je représente mon espace 2D (envisager une fenêtre), où chaque pixel est représenté par une cellule dans un tableau 2D. c'est à dire un 100x100 fenêtre est représentée par le tableau de mêmes dimensions.
Maintenant donné un point dans la fenêtre, si je dessine un cercle de rayon r
, je veux trouver tous les points situés dans le cercle.
Je pensais que je voudrais vérifier pour chaque point dans le carré de la région autour du rayon, avec side = 2*r
, si elle se trouve dans le cercle ou pas. Je vais utiliser la distance normale formule peut-être?
D'où, peut-être les suivantes:
for (x=center-radius ; x<center+radius ; x++){
for (y=center-radius ; y<center+radius; y++) {
if (inside) {
//Do something
}
}
}
Il va servir mon but? Puis-je le rendre plus rapide?
- Pour simuler le nombre pi, un uniforme distribué des valeurs aléatoires sont générés avec le xx+yy<=rr restriction. Je pense que ça pourrait être une très bonne idée de mettre des valeurs aléatoires, puis recherche les voisins comme l'escalade la colline de l'algorithme.
- Utiliser après le Théorème de Pythagore pour déterminer si la distance de la "cellule" est dans le cercle ou pas.
Vous devez vous connecter pour publier un commentaire.
Pour votre 100x100, oui.
Oui. Par exemple, vous pouvez:
Code:
C'est à propos de 4x vitesse.
JS tests pour les solutions présentées ici. La symétrie est la manière la plus rapide sur mon ordinateur. Trigonométrie présenté par le Niet de l'Obscurité Absol est très intelligent, mais il implique cher fonctions mathématiques comme
sin
etacos
, qui ont un impact négatif sur les performances.[ /* (x, y) (-x, -y) are in circle */ for (x of r) for (y of r) if ((x - center)*(x - center) + (y - center)*(y - center) < rad*rad)];
Essayer dans FFVous pouvez ignorer la nécessité d'un contrôle conditionnel:
Si nécessaire, vous pouvez
round(yspan)
.radius
dans lefor
et lasin
pour obtenir une ellipse.Vous pouvez obtenir la vitesse de l'onduleur par l'informatique autant en dehors de la boucle que possible. Aussi il n'y a pas besoin de faire le Théorème de Pythagore racine carrée... il suffit de garder tout au carré. Une vitesse finale peut être faite seulement par les de faire le calcul pour un quart de cercle (parce que c'est symétrique)... quand une correspondance est trouvée, vous venez de le reproduire pour les trois autres trimestres.
Si les conditions suivantes sont remplies:
où
xPos
etyPos
sont les coordonnées d'un point, vous êtes arrivée, alors le point est à l'intérieur de votre cercle.semble correcte. vous pouvez la rendre un peu plus rapide par trouver minY et ensuite de faire DoSomething de -rangeY à +rangeY pour le courant X.
Pour obtenir une liste de tous les points à l'intérieur d'un cercle, vous devez utiliser:
Voir http://jsperf.com/circles/2 pour le profilage contre les autres solutions ici.
Je sais que cette question a accepté de répondre, mais j'ai un beaucoup plus facile solution. Les autres réponses qui me confond, comme je ne sais pas ce
center
,xcenter
,ycenter
ont été, et les mathématiques derrière les fonctions étaient de gauche inexpliquée et j'ai parcouru à la découverte d'une solution mathématique de mon propre.Mon équation est très simple:
cx
est le point x du centre du cerclecy
est le point y du centre du cerclerad
est le rayon du cercleCe que mon équation/fonction n'est de calculer les points en calculant pour chaque point, étant donné le rayon et il ajoute et soustrait l'offset de
cx
etcy
.Le rendement est beaucoup plus élevé que les autres réponses: http://jsperf.com/point-in-circle/4
Vous pouvez consulter mon équation avec les mathématiques, à l'aide de l'équation qui permettra de valider si un point est à l'intérieur d'un cercle
x*x + y*y <= r*r
OUx^2 + y^2 <= r^2
Edit - Super compressé ES6 version: