Bonjour,


J'essaye de dessiner des ensembles de Julia à l'aide de Qt mais je rencontre un problème.

J'obtiens bien une fractale mais ça ressemble pas à un ensemble de Julia...


Je vous met un bout de code qui pour moi est susceptible de poser problème:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
 
//Méthode censée dessiner l'ensemble de Juli
//cReel et cIma partie réel et imaginaire du nombre complexe c qui définit un ensemble de Julia,
//nbIteration c'est le nombre de fois qu'on itère la suite avant de s'arrêter, 
//zoom c'est un facteur pour convertir les coordonnées d'un pixel en coordonnées du plan complexe, exemple si zoom=0.01,  100 pixel correspondent à 1.
void ZoneDessin::paintJulia(QPainter &painter, double cReel, double cIma, int nbIteration, double zoom )
{
 
    double a, b; //partie réel et imaginaire de la suite.
 
    for (int i=-height()/2; i<height()/2; i++){      //On boucle sur tout les pixels de l'écran:
        for (int j=-width()/2; j<=width()/2; j++){ //on commence par celui en haut à gauche et on fini par celui en bas à droite
                                                   //(j'ai translaté le painter pour que l'origine soit au centre de l'écran avant)
            a=j*zoom;//on convertit les coordonnées du pixel en coordonées cartésiennes.
            b=i*zoom;
 
            if(appartientJulia(a, b, cReel, cIma, nbIteration)){//Si le point appartient  à l'ensemble de julia
                painter.drawPoint(QPoint(j,i)); //on le peint en blanc...
 
 
            }
 
 
        }
 
    }
 
}
 
 
bool ZoneDessin::appartientJulia(double a, double b, double cReel, double cIma,int nbIteration)
{
    double module;
    for(int i=0; i<nbIteration; i++){
        a=a*a-b*b+cReel;   //on calcul la suite jusqu'au nbIteration-ième terme
        b=2*a*b+cIma;
 
       module=sqrt(a*a+b*b);
 
        if(module>2)  //Si le module devient supérieur à 2 alors on est sur que la suite diverge
            return false;
 
 
    }
 
    return true; //Sinon on est pas sur mais on fait l'approximation qu'elle converge
}

Et j'ai notamment remarqué un truc étonnant, si je modifie la deuxième méthode comme suis:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool ZoneDessin::appartientJulia(double a, double b, double cReel, double cIma,int nbIteration)
{
    double module;
    for(int i=0; i<nbIteration; i++){
        a=a*a-b*b+cReel;   
        b=2*a*b+cIma;
 
       }
 
    module=sqrt(a*a+b*b);
    if(module>2)  
        return false;
    else
        return true;
 
}
Et bien ça me met tout en blanc, donc ça passe jamais par false !?





Merci pour votre aide.