martedì 16 luglio 2013

Mandelbrot in QtQuick 2

Visto che oramai sembra che nell'immediato futuro un po' di sistemi mobili useranno le QtQuick (Ubuntu Touch ed Android) e visto che e' uscito l'SDK Qt 5.1 ho voluto riaprire l'argomento per vedere se e' la volta buona


Come risulta chiaro dal confronto con questo post QtQuick eredita molta della struttura del codice da Javascript anche se vi sono comunque differenze. Per esempio la stampa con il comando

context.fillRect(j,i,1,1);
in QtQuick e' dovuta diventare

ctx.moveTo(j,i);
ctx.lineTo(j+1,i+1);

----------------------------------------------------
import QtQuick 2.0

Canvas {
    id : canvas
    width : 640
    height : 640

    MouseArea {
             anchors.fill: parent
             onClicked: { }
         }


    onPaint: {

        var re_min = -2.0;
        var im_min = -1.2;
        var re_max = 1.0;
        var im_max = 1.2;
        var iterazioni = 255;
        var r;
        var a,b;
        var x,y,x_new,y_new;
        var k,j,i;

        var SCREEN_HEIGHT = 640;
        var SCREEN_WIDTH = 640;

        var re_factor = (re_max-re_min);
        var im_factor = (im_max-im_min);

        var ctx = canvas.getContext('2d');


        ctx.fillRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
        ctx.save();
        ctx.strokeStyle = "#FFFFFF";

        for (var i=0;i<SCREEN_WIDTH;i++) {
            for (var j=0;j<SCREEN_HEIGHT;j++) {
                a = re_min+(j*re_factor/SCREEN_WIDTH);
                b = im_min+(i*im_factor/SCREEN_HEIGHT);
                x = 0;
                y = 0;
                for (var k=0;k<iterazioni;k++)
                                      {
                                      x_new = (x*x)-(y*y)+a;
                                      y_new = (2*x*y)+b;
                                      if (((x_new*x_new)+(y_new*y_new))>4)
                                       {
                                       r = k%2;
                                       if (r == 1)
                                           {
                                           ctx.beginPath();
                                           ctx.moveTo(j,i);
                                           ctx.lineTo(j+1,i+1);
                                           ctx.stroke();
                                           }
                                       break;
                                       }
                                      x = x_new;
                                      y = y_new;
                                    }

                }
            }
         }
}
----------------------------------------------------