Probleme dans mon programme fractale

Résolu
Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 - 3 août 2005 à 17:43
Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 - 4 août 2005 à 16:43
Bonjour tout le monde,

J'aurais besoin d'aide pour résoudre un petit problème. J'ai adapté un programme que j'ai fais en C (fractale de Julia) en Java. Le problème c'est que mon programme en java n'affiche rien, enfin juste un carré noir. Je voudrais savoir si quelqu'un peut m'aider à résoudre ce problème svp. En vous remerciant d'avance.
Voici ma source:

import java.applet.Applet;
import java.awt.*;


public class MandelbrotApp extends Applet {


public void paint(Graphics g)
{
int winx=250;
int winy=250;
double xbegin = -1.5;
double xend=1.5;
double ybegin = -1.5;
double yend=1.5;

for(float i=0;i<winx;i+=0.999){
for(float j=0;j<winy;j+=0.999){


// define z_0
double zIm = j*(yend-ybegin)/(winy*1.0)+ybegin;
double zRe = i*(xend-xbegin)/(winx*1.0)+xbegin;
double cIm = -0.1;
double cRe = -0.745;
int res = 0;
double Re2Z;
double Im2Z;

Re2Z = zRe * zRe;
Im2Z = zIm * zIm;

while(res<255 && (zIm*zIm + zRe*zRe)<=4.0 ){
Re2Z = zRe * zRe;
Im2Z = zIm * zIm;
zIm = 2 * zRe * zIm + cIm;
zRe = (Re2Z - Im2Z) + cRe;


res++;
}
g.setColor(new Color((float)(Math.cos(res / 10.) + 0.03), (float)(Math.tan (zRe / 10.)), (float)(Math.sin (res / 10.) + .3)));

g.drawLine((int)(i), (int)(j),(int)(i),(int)(j));
}
}
}
public String getAppletInfo()
{
return "Cet applet montre la fractale de Julia";
}


}

Jarod_Delaware

6 réponses

cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
3 août 2005 à 19:34
Bon, j'ai retrouvé, mais c'est du C prévu pour passer par JNI. J'avais mis toutes les méthodes de calcul dans une DLL séparée.





//*env, jclass : ici, on s'en fout ;)

//n : tableau qui contient toutes les valeurs de sorties (tous les "res" dans ton algo)

//l : la longueur de n



//ite : le nombre max d'itérations (255 dans ton algo)

//r, g et b (entre 0 et 255) : couleur du "fond", c.a.d la couleur quand res=0



JNIEXPORT jintArray JNICALL Java_jfractal_Algorithme_palette (JNIEnv
*env, jclass, jintArray n, jint l, jint ite, jint r, jint g, jint b) {

jintArray sortie = env->NewIntArray(l*3);//création du tableau qui va contenir les couleurs

jint tmp,rs,gs,bs; //rs, gs, bs : composantes rouge vert bleu en sortie

jdouble phi1,phi2,phi3;

const jdouble Pi=3.141592653589793;



phi1=asin(r/255.); //Arcsinus pour transformer la couleur en "déphasage"

phi2=asin(g/255.);

phi3=asin(b/255.);





for (jint i=0; i<l; i++) {//pour chaque point du fractal

env->GetIntArrayRegion(n,i,1,&tmp);// on charge la valeur de sortie de tmp (tmp = res de ton algo)

//c'est à partir de là que ça nous intéresse ;)

//tmp1, tmp2, tmp3

if (tmp==ite) {//quand res = resMax,

rs=0;//la couleur de sortie est noire, c'est juste pour l'esthétique :D

gs=0;

bs=0;

}

else {//sinon... ce que je disais dans le message précédent :)

rs=abs(255*sin((2*Pi*tmp+phi1*ite)/ite));

gs=abs(255*sin((2*Pi*tmp+phi2*ite)/ite));

bs=abs(255*sin((2*Pi*tmp+phi3*ite)/ite));

}

env->SetIntArrayRegion(sortie,i*3,1,&rs);//on place dans sortie les valeurs calculées

env->SetIntArrayRegion(sortie,i*3+1,1,&gs);

env->SetIntArrayRegion(sortie,i*3+2,1,&bs);

}

return sortie;

}




voilà

A+



Dobel
[Une fois rien, c'est rien; deux fois rien, ce
n'est pas beaucoup, mais pour trois fois rien, on peut déjà s'acheter
quelque chose, et pour pas cher]
3
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
3 août 2005 à 18:33
Il y a un problème dans ton calcul de couleur (et c'est pas trop étonnant vu les fonctions que tu as écrit )



avec un truc plus simple genre :

g.setColor(new Color( (float) Math.abs(Math.cos(res / 10.)),


(float) Math.abs(Math.tan(zRe / 10.)),


(float) Math.abs(Math.sin(res / 10.))));


ça fonctionne mieux , mais ce n'est sans doute pas ce que tu veux car ça ne rend pas très très bien...



tu peux peut-être adopter un truc de la forme :

g.setColor(new Color( (float) Math.abs(Math.sin(2*Math.PI*res / 255. + phi1)),


(float) Math.abs(Math.sin(2*Math.PI*res / 255. + phi2)),


(float) Math.abs(Math.sin(2*Math.PI*res / 255. + phi3)))); //255 car
dans ton truc, l'algo s'arrête pour res = 255



où phi1, phi2 et phi3 sont 3 déphasages que tu adaptes suivant la "couleur de fond" souhaitée.





j'avais déjà fait un algo du genre qui pouvait donner des trucs sympas ;)

je peux essayer de le retrouver et te le copier si ça t'intéresses.



Dobel
[Une fois rien, c'est rien; deux fois rien, ce
n'est pas beaucoup, mais pour trois fois rien, on peut déjà s'acheter
quelque chose, et pour pas cher]
0
Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 2
3 août 2005 à 18:45
Salut Dobel,
Je te remercie beaucoup pour ta réponse. Je vais essayé de faire comme tu m'as dis. Si tu retrouves ton algo ça m'interesse egalement.
Merci encore.

Jarod_Delaware
0
Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 2
3 août 2005 à 19:56
Super !
Merci beaucoup Dobel pour ton aide et pour l'algo. Je vais de travailler dessus. Je vais egalement essayé de mettre un zoom dans mon programme. Mais bon, pour le moment je ne sais pas comment on fait en Java. Si tu as une idée sur la question ou si tu connais des tutorials dessus je suis preneur.
Merci encore pour ton aide.

Jarod_Delaware
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
4 août 2005 à 16:28
Je ne connais aucun algo pour les zooms, mais ça doit bien exister puisqu'il existe des programmes capables de faire des zoom en temps réel (xaos par exemple http://xaos.sourceforge.net/english.php).

Dans mon programme, je me contentais de redéfinir les bornes de l'image et la précision du calcul, et recalculer une image.

Dobel
[Une fois rien, c'est rien; deux fois rien, ce n'est pas beaucoup, mais pour trois fois rien, on peut déjà s'acheter quelque chose, et pour pas cher]
0
Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 2
4 août 2005 à 16:43
Salut Dobel,
J'ai regardé un peu sur le net pour voir comment ils font des zooms de selection rectangulaire mais j'ai pas tout compris. Pour le zoom j'etais arriver à en faire un mais c'etait en C et avec Glut. Ca m'a l'air d'être plus compliqué en Java. J'ai posté un message dans le forum de javafr pour avoir une aide pour le zoom. Mais pour le moment toujours pas de réponses.
Encore merci pour ton aide et ton algo Dobel.

Jarod_Delaware
0
Rejoignez-nous