1

私は最近フラクタルジェネレーターに取り組んでおり、特にマンデルブロ集合に取り組んでいます。残念ながら、ズームと移動は非常に不十分なようで、更新にはかなりの時間がかかります。ズームするたびに生成していますが、これがおそらく最も効率的な方法ではないことはわかっています。また、理解している別の方法を使用するコードを見つけることができないようです。これらは私が使用する次の方法です。最初の方法は初期生成であり、2番目の方法は更新方法です。

    private void genMandelbrot(Dimension size) {
    for(int x=0;x<size.width;x++) {
        for(int y=0;y<size.height;y++) {
            double moveX=globalx;
            double moveY=globalx;
            //zoom and x/y offset.
            double real = 1.5 * (x - size.width / 2) / (0.5 * zoom * size.width) + moveX;
            double imaginary=(y - size.height / 2) / (0.5 * zoom * size.height) + moveY;
            double newRe=0,newIm=0,oldRe=0,oldIm=0;

            int i;
            for(i=0;i<8000;i++) {
                oldRe = newRe;
                oldIm = newIm;
                newRe = oldRe * oldRe - oldIm * oldIm + real;
                newIm = 2 * oldRe * oldIm + imaginary;
                if((newRe * newRe + newIm * newIm) > 4) break;
            }

            Cell c = new Cell(Color.getHSBColor(i % 256, i % 255, 255 * ((i<20)? 1:0)), new Dimension(1,1), new Point(x,y));
            cells.add(c);
        }
    }
}
public void refreshMandelbrot(Dimension size) {
    for(Cell c : cells) {
            double moveX=globalx;
            double moveY=globalx;
            int x=c.x;
            int y=c.y;
            //zoom and x/y offset.
            double real = 1.5 * (x - size.width / 2) / (0.5 * zoom * size.width) + moveX;
            double imaginary=(y - size.height / 2) / (0.5 * zoom * size.height) + moveY;
            double newRe=0,newIm=0,oldRe=0,oldIm=0;

            int i;
            for(i=0;i<8000;i++) {
                oldRe = newRe;
                oldIm = newIm;
                newRe = oldRe * oldRe - oldIm * oldIm + real;
                newIm = 2 * oldRe * oldIm + imaginary;
                if((newRe * newRe + newIm * newIm) > 4) break;
            }

            cells.set(cells.indexOf(c), new Cell(Color.getHSBColor(i % 256, i % 255, 255 * ((i<20)? 1:0)), new Dimension(1,1), new Point(x,y)));
    }
    System.out.println("Set refreshed.");
}
4

2 に答える 2

1

それcellsはある種のList実装だと思いますか?

その場合、refreshメソッドのほとんどの時間は次の行で費やされます。

cells.set(cells.indexOf(c), new Cell(Color.getHSBColor(i % 256, i % 255, 255 * ((i<20)? 1:0)), new Dimension(1,1), new Point(x,y)));

より正確にはcells.indexOf(c)、で、リスト全体が繰り返されて、の正しいインデックスが検索されますc

各セルの色を変更するだけなので、最も簡単な修正は、現在作業しているセルの色を変更することです。Cellクラスの実際の実装はわかりませんが、メソッドがある場合setColor(...)は、上記の行を次のように置き換えることができます。

c.setColor(Color.getHSBColor(i % 256, i % 255, 255 * ((i<20)? 1:0)));

これにより、refreshMandelbrotメソッドの実行時間がメソッドの場合と同じになりgenMandelbrotます。

クラスの目的はわかりませんがCell、色のラッパーとしてのみ使用している場合は、各ピクセルの計算された色を2次元配列に格納するか、直接書き込むと、パフォーマンスが向上する可能性があります。セルラッパーのフラットリストを処理する代わりに、Graphicsまたはオブジェクト。Raster

于 2013-03-21T18:43:42.983 に答える
0

ほとんどの場合、フラクタルを細分化し、あまり興味のないタイルを計算する必要があります。8000回の繰り返しが多いです。計算を少し単純化することもできます。

于 2013-03-21T18:13:53.103 に答える