2010-02-04 4 views
1

J'ai besoin de disperser de façon aléatoire un nombre variable d'objets dans un film Flash. Le fait de choisir au hasard des emplacements n'aboutit pas à une sortie visuellement agréable. Les objets se superposent, tous regroupés d'un côté, etc.Algorithme de dispersion

Je cherche quelque chose de similaire à l'algorithme que Photoshop utilise pour créer un Dither Dither lors de la conversion d'une image en mode Bitmap.

Répondre

1

Si vous ne disposez pas que de nombreux objets, c'est brut mais réalisable:

var myObjects:Array; 

... 

for (var i = 0; i < myObjects.length; ++i) { 
    var overlaps:Boolean = true; 
    while (overlaps) { 
     // Pick a random location 
     myObjects[i]._x = Math.random() * WIDTH; 
     myObjects[i]._y = Math.random() * HEIGHT; 

     // Make sure it doesn't overlap any object that has been placed 
     overlaps = false; 
     for (var j = 0; j < i; ++j) { 
      if (myObjects[i].hitTest(myObjects[j])) { 
       overlaps = true; 
       break; 
      } 
     } 
    } 
} 

Quelques mises en garde:

  • Si vous avez beaucoup d'objets (en milliers ou plus), ce Cela peut prendre un certain temps, car il doit vérifier tous les autres objets.
  • Il est possible que cette méthode aboutisse à un arrangement dans lequel l'objet suivant ne peut pas être placé n'importe où car tous les emplacements possibles entraînent un chevauchement. Dans ce cas, le programme va se bloquer. Ce problème est plus probable lorsqu'il y a plus d'objets et/ou que les objets sont volumineux.

Edit: Code révisé légèrement il est donc pour AS2, AS3 pas

2

Une méthode à faible coût: générer une sorte de motif répétitif sous-jacent (par exemple une grille) et ensuite perturber les emplacements. Cela donnera l'apparence de hasard avec une certaine régularité inclus:

pseudocode Ahoy:

for(x=0; x<max; x+=step) { 
    for(y=0; y<max; y+=step) { 
     location = x*step+random(randsize), y*step+random(randsize); 
    } 
} 

expérience avec la taille de l'étape et randsize jusqu'à ce qu'il semble bon pour vous.

Notez que cela n'empêche pas les chevauchements; pour ce faire, ajoutez une quantité aléatoire entre les x adjacents, ou regardez quelque chose comme un graphique de Voronoi de points aléatoires, ou générez une série de points aléatoires et supprimez les chevauchements, ou ...