0

I'm trying to to program the Mandelbrot set for Android. I try to draw it on a Canvas. It works, but I want to have a color gradient. This is my code:

package de.turbofractal;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;


public class FractalView extends View {
   private int n,g,xMax,yMax;
   private float zr,zrh,zr0,zi,zi0,ar,br,ai,bi;
   private int[][] Iterationen = new int[2560][1440];
   private Paint paint;

   public FractalView(Context context) {
      super(context);
      paint = new Paint();
      ar=-2; br=2; ai=-2; bi=2;
   }

   @Override
   protected void onDraw(Canvas canvas) {
       g = 20;
       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++;
               }
               paint.setARGB(255,0,0,Math.round((n/g)*255));  //<--------------------this is where the color gradient should be created. But the programm only draws full blue (0,0,255). Why is that?
               canvas.drawPoint(xx, yy, paint);            
           }

        }
        invalidate();
   }      


   private void schirmzupap(float ax,float bx,float ay,float by,int xschirm,int yschirm,int w,int h) {
       zr = xschirm*(bx-ax)/w+ax;
       zi = yschirm*(ay-by)/h+by;
   } 

   @Override
   public void onSizeChanged(int w, int h, int oldW, int oldH) {
      xMax = w-1;
      yMax = h-1;
   }
}

Edit: This is how it is drawn by the eclipse emulator: http://i53.tinypic.com/2mwfs7c.png

But I want it to be drawn like this (programmed with Delphi): http://i53.tinypic.com/ehg2et.png

Henry
  • 3
  • 2

1 Answers1

1
paint.setARGB(255,0,0,Math.round((n/g)*255));  

The arguments for setARGB are alpha, red, green, and blue - you are only supplying values to the alpha and blue parameters.

Inside the b parameter, both n and g are integer parameters, so when you divide them, you will get an integer result, not a double. (See "Java Integer Division, How do you produce a double?") This means you only get the whole number part of the result, which isn't what you want. Cast n or g to a double and it should work.

Community
  • 1
  • 1
Nate
  • 16,748
  • 5
  • 45
  • 59
  • That's correct. Basically I just want a color gradient from black to blue. The higher n gets without destroying the while-conditions the more blue and the less black shall the pixel be drawn. But at the moment all pixels are drawn full blue (0,0,255). – Henry Jul 27 '11 at 18:10
  • Edited - at first I thought you were asking why it was all blue, but then I realized there was an integer division problem. – Nate Jul 27 '11 at 18:15
  • Oh, that was a really stupid mistake, but I'm new to Java... Thank you very much! – Henry Jul 27 '11 at 18:25
  • 1
    Btw, integer division is actually your friend in this case. Just use (255 * n / g) for your blue value. This will give you identical output to (int)(Math.round(255 * (n/(double)g))), but will be much more efficient. – Josh Jul 27 '11 at 19:20