Comment puis-je placer des rectangles avec une largeur et une hauteur variables, au hasard dans une scène mais loin d'un cercle au centre qui a un rayon de x

Merci d'avance

MODIFIER

Vérifier mon code jusqu'à présent

http://jsfiddle.net/chchrist/cAShH/1/

0
chchrist 8 nov. 2011 à 14:26

3 réponses

Meilleure réponse

Je commencerais par un système de coordonnées centré sur 0,0 et après avoir généré des coordonnées valides, mappez-les sur votre carré / rectangle.

Voici un exemple simple:

function getValidCoordinates() {
    var x, y, isValid = false;

    while (!isValid) {
        x = Math.random() * 400 - 200;
        y = Math.random() * 400 - 200;

        if (Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) > 50)
            isValid = true;
        //else alert('too close ' + x + ',' + y);
    }

    return {x: x + 200, y: y + 200};
}

for (var i=0; i < 10; i++) {
    var co = getValidCoordinates();
    alert('x=' + co.x + ', y=' + co.y);
}
0
James 8 nov. 2011 à 13:03

Une approche pourrait consister à réfléchir à la façon de mapper des nombres aléatoires uniformes dans des positions légales.

Par exemple (en simplifiant légèrement), si vous aviez un carré de 200 x 200 et que vous vouliez éviter tout point dans un carré de 100x100 au milieu, vous pourriez faire ce qui suit pour chaque coordonnée. Générez un nombre aléatoire entre 0 et 100. S'il est inférieur à 50, utilisez-le directement; sinon ajoutez-y 100 (pour le mettre dans la gamme 150-200)

Conceptuellement, cela étend la plage autour du «trou» au milieu, tout en laissant les points résultants uniformément répartis.

Ce sera plus compliqué avec votre cercle, car les axes ne sont pas indépendants, mais une variation de cette méthode pourrait être utile. (Surtout si vous n'avez que des exigences "douces" pour le caractère aléatoire et que vous pouvez donc assouplir quelque peu les contraintes sur la distribution).

1
Andrzej Doyle 8 nov. 2011 à 11:05

Les trois options potentielles que je suivrais sont:

  • Générez des coordonnées aléatoires dans [400 400] puis vérifiez que la distance de [200 200] est inférieure à 50. Si c'est le cas, c'est bien; sinon, recommencez.

  • Générez des coordonnées polaires aléatoires (c.-à-d. Angle et distance), où la distance est supérieure à 50. Ensuite, convertissez-les en cartésiennes, centrées autour de [200 200] et limitées à votre zone ... Le problème avec cette approche est qu'elle introduirait un biais aux extrémités de votre zone rectangulaire.

  • Ignorez le cercle et délimitez-le par un carré, puis utilisez la première approche mais avec une logique simplifiée.

2
Xophmeister 8 nov. 2011 à 10:41