散射算法

时间:2010-02-04 18:13:03

标签: flash actionscript actionscript-2

我需要在Flash影片中随机散布可变数量的对象。只是随机选择位置不会产生视觉上令人愉悦的输出。物体最终彼此叠加,一边都聚集在一起,等等。

我正在寻找类似于Photoshop在将图像转换为位图模式时用来创建Difussion Dither的算法。

3 个答案:

答案 0 :(得分:2)

低成本方法:生成某种基础重复模式(例如网格),然后扰乱位置。这将给出随机性的外观,包括一些规律性:

伪代码啊:

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之间添加一个随机数量,或者查看类似随机点的Voronoi图,或生成一系列随机点并删除重叠,或者......

答案 1 :(得分:1)

如果你没有那么多物品,这很粗糙但可行:

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

答案 2 :(得分:0)

随机是永远不够随意的,是吗? :)探索伪随机数生成器可能是值得的。这里有一个很好的实现/示例:http://lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/

尝试使用一些种子直到找到视觉上令人愉悦的东西。祝你好运!