0

我写了一个程序来解决以下问题:

在随机创建种子且粒子随机移动的环形平面上实施扩散受限聚合模拟。如果它们的粒子没有降落在种子或粒子附近,它们就会移动。用户输入种子(红色像素)、粒子(黑色像素)、步骤(无或迭代)、平面大小。

我的代码很慢。我怎样才能让它更快?

我随机创建 x 和 y 坐标并绘制红色像素(种子),然后为黑色像素(粒子)随机创建 x 和 y,如果黑色像素落在可以停留的红色或黑色像素的位置,否则它会再次随机移动直到没有更多的粒子。如果像素落在 x > 边框等边界之外,则 x=0; 如果 x <1 则 x= 边界。y 也是一样。

这只是意味着如果它落在边界上,我会将它移动到相反的边界。然后再次检查相邻像素。我有一个用于创建种子的外循环,以及用于创建粒子的内循环。在内部循环中,我检查 x,y 位置:

//Place, move, and "stick" the particles; stop if either steps or particles = 0
for (int p = 0; p < particles; p++) {

    for (int s = 0; s < steps; s++) {
        if (xPos > image.getWidth() ) {
                       do something
                    } 
        else if (xPos < 1) {
                        do something
                    }
        if (yPos > image.getHeight() - 2) {
                         do something
                    } 
        else if (yPos < 1) {
                         do something
                    } 
        else if (xPos > image.getWidth() && yPos > image.getHeight()) {
                         do something
                    } 
        else if (xPos < 1 && yPos < 1) {
                         do something
                    }

     //If the surrounding pixels' color is not white, make that particle stick.
            if (moveValid()) {
                image.setRGB(xPos, yPos, 0xFF000000);
            } 


            //Otherwise, move in a random direction
            else {
                if(xPos == 1 && image.getRGB(size - 2, yPos) != 0xFFFFFFFF){
                   draw(xPos,yPos);
                }
                else if(xPos == size - 2 && image.getRGB(1,yPos) != 0xFFFFFFFF){
                    draw(xPos,yPos);
                }
                if(yPos == 1 && image.getRGB(xPos, size - 2) != 0xFFFFFFFF){
                   draw(xPos,yPos);
                }
                else if(yPos == size - 2 && image.getRGB(xPos,1) != 0xFFFFFFFF){
                    draw(xPos,yPos);
                }
                else {
                    move();

                }


            }
        }

        //Regenerate random x and y positions for the next particle   
        xPos = random.nextInt(size);
        yPos = random.nextInt(size);
    }
4

1 回答 1

2

尽管draw()未显示 的实现,但看起来您正在更新 aBufferedImage然后渲染它。

  1. 第一步始终是分析您现有的代码,寻找易于实现的优化。

  2. 第二步有时是搁置现有代码并尝试不同的方法。

您可以利用此处概述和讨论Mode-View-Controller 模式。特别是,让您的DLA 模型在后台线程上全速发展,同时以更可持续的速度更新您的视图。本文建议了几种同步方法,并包含一个用于javax.swing.Timer调整更新速度的相关示例。

于 2012-09-15T01:18:58.633 回答