我最近一直在分形发生器上工作,并专门研究Mandelbrot套装。不幸的是,缩放和移动似乎非常有用,需要花费很长时间才能刷新。我每次放大时都会生成它,我知道这可能不是最有效的方法,而且我似乎无法找到使用我理解的其他方法的代码。 这些是我使用的以下方法,第一种是初始生成,第二种是刷新方法。
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.");
}
答案 0 :(得分:1)
我认为cells
是某种List
实现?
在这种情况下,刷新方法的大部分时间都花在这一行上:
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
类的目的,但是如果你只是将它用作颜色的包装,如果你将每个像素的计算颜色存储在一个颜色中,你可能会获得更多的性能。二维数组或直接写入Graphics
或Raster
对象,而不是处理单元格包装器的平面列表。
答案 1 :(得分:0)
很可能你需要细分分形并计算不那么有趣的不太有趣的瓷砖。 8000次重复很多。您还可以稍微简化计算。