mercoledì 11 aprile 2012

Semplice Mandelbrot

un esempio di uso della grafica su Android per generare l'insieme di Mandelbrot



Per la cronaca sul mio telefono vengono impiegati circa 12,5 secondi per generare l'immagine con i parametri impostati nel programma sottostante (255 iterazioni per ciclo full screen)
----------------------------------------------------------------------------------------
package com.mandelbrot;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Display;
import android.view.View;
import android.widget.ImageView;

public class MandelbrotIntActivity extends Activity {
    /** Called when the activity is first created. */
    private static final double re_min = -2.5;
    private static final double re_max = 1.0;
    private static final double im_min = -1.0;
    private static final double im_max = 1.0;
    private static int iterazioni = 255;
    private double y;
    private double x;
    private double ynew;
    private double xnew;
    private double a;
    private double b;
    private int test;
    private double re_factor;
    private double im_factor;
   

   
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ImageView view = (ImageView) findViewById(R.id.imageView1);

        Display display = getWindowManager().getDefaultDisplay();
        int width = display.getWidth(); //240
        int height = display.getHeight();
        
        Bitmap bitmap = Bitmap.createBitmap(width, height, Config.RGB_565);
        
        Paint paint = new Paint();
        paint.setColor(Color.WHITE);
        Canvas canvas = new Canvas(bitmap);
        
        canvas.drawColor(Color.BLACK);
       
        view.setImageBitmap(bitmap);
       
        re_factor = (re_max - re_min);
        im_factor = (im_max - im_min);
  
        // recupera le informazioni sulle dimensioni dello schermo

        for (int i=0;i<width;i++)
        {
            for (int j=0;j<height;j++)
            {
                double b = im_min + i * im_factor / width;
                double a = re_min + j * re_factor / height;
                x = 0.0;
                y = 0.0;
                test = 0;
                for (int k=0;k<iterazioni;k++)
                {
                      xnew = x * x - y * y + a;
                      ynew = 2 * x * y + b;
                      if (((xnew*xnew)+(ynew*ynew))>4)
                      {
                          test = k;
                          k = iterazioni;
                         
                      }
                      x = xnew;
                      y = ynew;
                }
           
                if (test%2 == 1)
                {
                    //punto bianco
                    canvas.drawPoint(i, j, paint);

                }
            }
           
        }
    }
}

----------------------------------------------------------------------------------------
Sempre giusto per la cronaca nel 1988 facevo piu' o meno la stessa cosa con la stessa risoluzione grafica ma con un Commodore 64  (lascio perdere i tempi di calcolo che erano della grandezza delle ore e non certo dei secondi)