首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >散点算法

散点算法
EN

Stack Overflow用户
提问于 2010-02-05 02:13:03
回答 3查看 1.8K关注 0票数 1

我需要在Flash电影中随机散布可变数量的对象。仅仅随机选择位置不会产生视觉上令人愉悦的输出。对象最终堆叠在一起,所有对象都在一侧聚集在一起,等等。

我正在寻找一些类似的算法,Photoshop用来创建扩散抖动时,转换为位图模式的图像。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-05 03:01:55

如果你没有那么多的对象,这很粗糙,但却是可行的:

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2010-02-05 02:33:12

一种低成本的方法:生成某种潜在的重复模式(例如网格),然后干扰位置。这将给人一种随机性的外观,其中包含一些规律性:

伪码ahoy:

代码语言:javascript
复制
for(x=0; x<max; x+=step) {
    for(y=0; y<max; y+=step) {
       location = x*step+random(randsize), y*step+random(randsize);
    }
}

尝试步长和随机大小,直到它看起来对你很好。

注意:这并不排除重叠;要做到这一点,请在相邻的x之间添加一个随机量,或者查看类似于随机点的Voronoi图,或者生成一系列随机点并删除重叠,或者...

票数 2
EN

Stack Overflow用户

发布于 2010-02-05 02:33:40

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2202062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档