2010-08-09 12 views
1

J'ai un rectangle, et un cercle à l'intérieur de ce rectangle (qui se trouve autour du centre du rectangle). Je veux générer un vecteur aléatoire à deux composantes qui tombe dans le rectangle, mais pas le cercle. Comment puis-je le faire? Editer: Je préférerais une méthode que je peux utiliser pour générer un vecteur qui réponde à ces contraintes sans le forcer brutalement.Générer un vecteur aléatoire à l'intérieur d'un rectangle mais pas un cercle?

Répondre

1
Vector = Rectangle.RandomVector(); 

while (Circle.Contains(Vector)) { 
    Vector = Rectangle.RandomVector(); 
} 

Aka, juste force brute. Il a 21,5% de chances d'être hors du cercle à chaque fois :)

+1

Comment avez-vous calculé ce 21,5%? Il ne semble pas y avoir suffisamment d'informations provenant du PO pour obtenir une telle statistique. – Ponkadoodle

+0

Pas si! Il décrit un cercle inscrit dans un rectangle (et, je suppose un carré basé sur cela). La surface du cercle représente 78,5% de la superficie du carré. Ainsi, une chance de 21,5% d'être dans le carré, mais en dehors du cercle. (Si le cercle est effectivement plus petit que le rectangle, le pourcentage augmente, mais l'idée est la même) –

+0

Je n'ai jamais dit que le cercle sortait à l'un des bords du cercle; il est probable que ce ne sera pas le cas. – RCIX

0

Génère des nombres aléatoires pour les composantes x et y du vecteur telles que x < rectangle.width et y < rectangle.heigth. Ensuite, vérifiez si x^2 + y^2 < circle.radius^2 et jetez le vecteur si c'est le cas.

Mise à jour: Une autre méthode qui génère une distribution non uniforme mais ne rejette aucun vecteur est la suivante: Choisissez au hasard un angle entre l'intervalle 0 et 2 * pi. Déterminer maintenant la longueur du vecteur en choisissant au hasard une valeur de l'intervalle déterminé par les intersections de la ligne avec l'ancien angle commençant au centre avec le cercle et le rectangle. La distribution résultante sera uniforme lorsqu'elle sera protégée sur le cercle. Il sera également uniforme pour chaque angle. Il ne sera pas uniforme dans l'avion cependant.

+0

J'ai obtenu cette configuration, mais je préfère ne pas jeter un tas de vecteurs ... – RCIX

+0

Malheureusement, c'est la seule façon de le garder uniformément distribué. :( – corsiKa

+0

@Glowcoder: ça ne me dérange pas une distribution non uniforme, ça dépend de ce que c'est ... Mind élaborant une réponse? – RCIX