在Android上设置Mandelbrot设置的问题

时间:2011-08-09 22:52:04

标签: java android colors gradient mandelbrot

我对Mandelbrot套装着色有问题。 这是我的onDraw()过程:

@Override
protected void onDraw(Canvas canvas) {
   g = Math.round(60+(iter_count*(2500/16)));
   iter_count++;
   for(int xx = 1; xx <= xMax; xx++) {
       for(int yy = 1; yy <= yMax; yy++) {
           schirmzupap(ar,br,bi,ai,xx,yy,xMax,yMax);
           n = 1;
           zr0 = zr;
           zi0 = zi;
           while ((n<g) && (zr*zr+zi*zi<4)) {
               zrh = zr;
               zr = (zr*zr)-zi*zi+zr0;
               zi = zrh*zi+zi*zrh+zi0;
               n++;
           }
           if (n==g) {                                                //[Coloring]
               paint.setARGB(255,0,0,0);  
           }
           if ((n/g) < (1/2)) {
               paint.setARGB(255,Math.round((n/g)*255),0,0);
           }
           if (((n/g) < 1) && ((n/g) > 1/2)) {
               paint.setARGB(255,255,Math.round((n/g)*255),Math.round((n/g)*255));  
           }
           canvas.drawPoint(xx, yy, paint);                           //[/Coloring]
       }              
    }
}

这就是Java Android模拟器的看法:http://i55.tinypic.com/14ctqi8.png

这就是我想要它的样子:http://i54.tinypic.com/nh1aqe.png它是用Delphi编写的,但着色部分实际上是相同的:

if n=g then image1.canvas.Pixels[xx,yy]:=RGB2TColor(0,0,0);
if (n/g)<(1/2) then image1.canvas.Pixels[xx,yy]:=RGB2TColor(Round((n/g)*255),0,0);
if ((n/g)<(1)) AND ((n/g)>(1/2)) then image1.canvas.Pixels[xx,yy]:=RGB2TColor(255,Round((n/g)*255),Round((n/g)*255));
有人可以帮帮我吗? 格尔茨,

亨利

2 个答案:

答案 0 :(得分:2)

  1. 如果有帮助,请不要在onDraw进行复杂的计算。
  2. 一般情况下,在这些情况下使用Math.floor()而不是圆形,因为您不希望事情在这里向上舍入。
  3. 对于着色算法的第二和第三个条件,else if会更清楚。似乎第三个人赢了第二个......?
  4. (这是真正的问题:-)我打赌你宣布ng为整数!除非你这样做,否则除法将是整数除法:
  5. 转换为双

    (n/(double)g)
    

    记住整数除法,例如25000 / 25600== 0,因此所有这些像素都将获得(255,0,0)

答案 1 :(得分:1)

正如桑杰所说你的分裂存在问题。

if ((n/g) < (1/2)) {...

if (((n/g) < 1) && ((n/g) > 1/2)) {....

你可以修复Sanjay-way。但请注意1/2 = 0 1.0 / 2 = 0.5。 或者更少的可重复但更快一点

if((2*n)<g){...

if((n<g)&&(2*n>g)){...