我想尝试在AIDE上使用libGDX渲染mandelbrot集(我只有我的手机才能编码)。所以,我研究了算法并尝试实现它。
为屏幕上的每个像素调用此函数 -
public int calcFract(int x, int y, int maxiter)
{
zx = zy = 0;
cx = (x - width/2) / zoom;
cy = (y - height/2) / zoom;
while( zx * zx + zy * zy < 4.0 && iter < maxiter )
{
tmp = zx * zx - zy * zy + cx;
zy = 2.0 * zx * zy + cy;
zx = tmp;
iter++;
}
return iter | iter << 8;
}
这是create()回调 -
public void create()
{
width = Gdx.graphics.getWidth();
height = Gdx.graphics.getHeight();
Gdx.input.setInputProcessor(this);
fractal = new Pixmap(width, height, Pixmap.Format.RGB888);
for (int i = 0; i < width; ++i)
for (int j = 0; j < height; ++j)
{
int c = mandelbrot.calcFract(i, j, maxiter);
fractal.drawPixel( i, j, Color.toIntBits(0xff, c, c, c));
}
fracTex = new Texture(fractal);
batch = new SpriteBatch();
}
应用程序编译时没有错误,但是当我运行它时,它会显示我 -
notice the left side of the screen
这里也是render()回调 -
public void render()
{
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw(fracTex, 0, 0);
batch.end();
}
请告诉我我的代码是否有任何问题。 提前谢谢!
答案 0 :(得分:0)
我犯了一个非常不正常的错误。
如果你看一下我的代码,你会注意到在渲染像素图的第一个像素后,算法停止工作,因为它永远停留在maxiter,因为我忘了为每个像素重置iter。对于第一个之后的所有像素,iter = maxiter
跳过while循环。这意味着第一个像素之后的所有像素都采用相同的颜色,破坏了一切。
我通过在calcFract()中的while循环之前将iter设置为0来修复它。