Алгоритм рассеяния - PullRequest
       11

Алгоритм рассеяния

1 голос
/ 04 февраля 2010

Мне нужно случайным образом разбросать переменное количество объектов во Flash-фильме. Просто случайный выбор местоположения не приводит к визуально приятному результату. Объекты оказываются друг на друге, все сгруппированы на одной стороне и т. Д.

Я ищу что-то похожее на алгоритм, который Photoshop использует для создания различий при преобразовании изображения в битовый режим.

Ответы [ 3 ]

2 голосов
/ 04 февраля 2010

Недорогой метод: создайте некоторый вид лежащего в основе повторяющегося шаблона (например, сетку), а затем возмущайте местоположения.Это придаст вид случайности с некоторой регулярностью:

Псевдокод ahoy:

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

Поэкспериментируйте с размером шага и randsize, пока он не будет выглядеть хорошо для вас.

Примечаниеэто не исключает совпадений;чтобы сделать это, добавьте случайное количество между соседними x, или посмотрите на что-то вроде графа случайных точек Вороного, или сгенерируйте ряд случайных точек и удалите перекрытия, или ...

1 голос
/ 04 февраля 2010

Если у вас не так много объектов, это грубо, но выполнимо:

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;
            }
        }
    }
}

Некоторые предостережения:

  • Если у вас много объектов (тысяч и более), это может занять некоторое время, поскольку необходимо проверить все остальные объекты.
  • Возможно, этот метод приведет к расположению, при котором следующий объект нигде не может быть размещен, поскольку все возможные местоположения приводят к перекрытию. В этом случае программа будет зависать. Эта проблема более вероятна, когда имеется больше объектов и / или объекты большого размера.

Редактировать: немного переработан код, так что это для AS2, а не AS3

0 голосов
/ 04 февраля 2010

Случайное никогда не бывает достаточно случайным, не так ли? :) Возможно, стоит изучить генератор псевдослучайных чисел. Здесь есть отличная реализация / пример: http://lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/

Попробуйте это с некоторыми семенами, пока не найдете что-то визуально приятное. Удачи!

...