Проблема раскраски множества Мандельброта на Android - PullRequest
2 голосов
/ 10 августа 2011

У меня проблема с раскрашиванием множества Мандельброта. Это моя процедура 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));

Может ли кто-нибудь помочь мне, пожалуйста? Greetz,

Henry

Ответы [ 2 ]

2 голосов
/ 10 августа 2011
  1. Не выполняйте сложные вычисления в onDraw, если это можно сделать.
  2. В общем, используйте Math.floor() вместо округления в этих случаях, так как вы на самом деле ничего не хотитездесь округляться в большую сторону.
  3. Было бы яснее с else if для второго и третьего условий вашего алгоритма раскраски.Кажется, что третий выигрывает у второго ...?
  4. (это реальная проблема :-) Держу пари, вы объявили n и g как целые числа!Деления будут целочисленными, если вы не сделаете это:

преобразовать в двойные

(n/(double)g)

Запомните целочисленное деление, например 25000 / 25600 будет == 0, и, следовательно, все эти пикселиполучит (255,0,0)

1 голос
/ 10 августа 2011

Как сказал Санджай, у тебя проблемы с делением.

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

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

Ты можешь исправить в Санджай-вэйНо обратите внимание, 1/2 = 0, 1,0 / 2 = 0,5.Или менее читаемым, но немного быстрее

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

и

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