2

我在为 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));

有人可以帮我吗?问候,

亨利

4

2 回答 2

2
  1. onDraw如果可以帮助,请不要进行复杂的计算。
  2. 通常,Math.floor()在这些情况下使用而不是 round,因为您真的不希望在此处向上舍入。
  3. else if对于着色算法的第二个和第三个条件会更清楚。似乎第三个胜过第二个……?
  4. (这是真正的问题:-) 我敢打赌你声明ng整数!除非您这样做,否则除法将是整数除法:

转换成双倍

(n/(double)g)

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

于 2011-08-09T23:09:31.727 回答
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)){...
于 2011-08-10T01:34:08.320 回答