kelk'un pourrai m'expliker ce code svp? [Java] - Programmation
Marsh Posté le 25-02-2002 à 16:00:28
bon bon j viens de voir ke c un peu long a expliker kan meme...
snif..
connaitriez po de bons sites ki explikerait un peu les focntiosn k'on trouve ici?
ou sinon une exlpikation d'ensemble alors.
merci encore
Marsh Posté le 25-02-2002 à 16:03:35
Et tu le code en quoi ?
Sinon, pas trop long, t'es gentil !!
en plus y'a toute la partie graphique qui vient "polluer" l'algo proprement dit...
leboss a écrit a écrit : Vouala c dans le cadre de mon tpe,j dois faire un prog pour generer un arbre en fractale ; alors la j'ai trouvé un code source en java mais bon je n'y connais absolument rien en java ( un peu en c ) et j'aimerais k'on m'explik un peu le code svp paske en fait c po exactement ce ke je ve et ej voudrais ameliorer kelkes ptites choses . Thanx ( si kelk'un a le temps de faireune explikation ligne par ligne ca s'rait tres sympa ; le prog est po tres long) import java.awt.*; import java.applet.Applet; class Fractale extends Panel { Arbre arbre; boolean Affiche = false; double Rap, Pos, Ang; Color Coul[]; int X1, Y1, X2, Y2, Iter, Tr, Tv, Tb, Fr, Fv, Fb; Image OffScr; Dimension Dim; Graphics OffGra; Fractale(Arbre arbre) { this.arbre = arbre; } void Fractal(Graphics g, int Ax, int Ay, int Bx, int By, double Angle, int I) { g.setColor(Coul[I]); OffGra.setColor(Coul[I]); g.drawLine(Ax, Ay, Bx, By); OffGra.drawLine(Ax, Ay, Bx, By); if(I != Iter){ double Ag = Angle - Math.random() * Ang; double Ad = Angle + Math.random() * Ang; double Dist = Math.sqrt((Bx - Ax) * (Bx - Ax) + (By - Ay) * (By - Ay)); int Cx = (int) (Pos * Bx + (1 - Pos) * Ax); int Cy = (int) (Pos * By + (1 - Pos) * Ay); int Dx = (int) (Cx + Rap * Dist * Math.sin(Ag)); int Dy = (int) (Cy - Rap * Dist * Math.cos(Ag)); int Ex = (int) (Cx + Rap * Dist * Math.sin(Ad)); int Ey = (int) (Cy - Rap * Dist * Math.cos(Ad)); Fractal(g, Cx, Cy, Dx, Dy, Ag, I+1); Fractal(g, Cx, Cy, Ex, Ey, Ad, I+1); } } public void paint(Graphics g){ Dimension d = size(); if ((Affiche) || (OffScr == null) || (d.width != Dim.width) || (d.height != Dim.height)){ Dim = d; OffScr = createImage(d.width, d.height); OffGra = OffScr.getGraphics(); Coul = new Color[Iter+1]; for (int i = 0; i <= Iter; i++) Coul[i] = new Color((int)(Tr+i*(Fr-Tr)/Iter), (int)(Tv+i*(Fv-Tv)/Iter), (int)(Tb+i*(Fb-Tb)/Iter)); g.setColor(getBackground()); g.fillRect(0,0,d.width,d.height); OffGra.setColor(getBackground()); OffGra.fillRect(0,0,d.width,d.height); X1 = X2 = d.width >> 1; Y1 = size().height-1; Y2 = (int)(0.6*size().height); Fractal(g, X1, Y1, X2, Y2, 0, 0); Affiche = false; } else g.drawImage(OffScr, 0, 0, null); } } public class Arbre extends Applet { TextField tIter, tRap, tPos, tAng; Fractale Tree; public void init(){ setLayout(new BorderLayout()); Tree = new Fractale(this); add("Center", Tree); Panel p = new Panel(); add("South", p); String s; Tree.Iter=((s=getParameter("Iter" ))==null)? 12:Integer.parseInt(s); Tree.Pos=((s=getParameter("Pos" ))==null)? .5:Double.valueOf(s).doubleValue(); Tree.Rap=((s=getParameter("Rap" ))==null)? .8:Double.valueOf(s).doubleValue(); Tree.Ang=((s=getParameter("Ang" ))==null)? .6:Double.valueOf(s).doubleValue(); p.add(tIter=new TextField(Integer.toString(Tree.Iter),4)); p.add(tPos=new TextField(Double.toString(Tree.Pos),4)); p.add(tRap=new TextField(Double.toString(Tree.Rap),4)); p.add(tAng=new TextField(Double.toString(Tree.Ang),4)); p.add(new Button("Affiche" )); Tree.Tr=((s=getParameter("Tr" ))==null)? 128:Integer.parseInt(s); Tree.Tv=((s=getParameter("Tv" ))==null)? 64:Integer.parseInt(s); Tree.Tb=((s=getParameter("Tb" ))==null)? 0:Integer.parseInt(s); Tree.Fr=((s=getParameter("Fr" ))==null)? 64:Integer.parseInt(s); Tree.Fv=((s=getParameter("Fv" ))==null)? 192:Integer.parseInt(s); Tree.Fb=((s=getParameter("Fb" ))==null)? 0:Integer.parseInt(s); Tree.repaint(); } public boolean action(Event ev, Object arg){ if(ev.target instanceof Button){ String label=(String) arg; Tree.Iter=Integer.parseInt(tIter.getText().trim ()); Tree.Pos=Double.valueOf(tPos.getText().trim()). doubleValue(); Tree.Rap=Double.valueOf(tRap.getText().trim()). doubleValue(); Tree.Ang=Double.valueOf(tAng.getText().trim()). doubleValue(); if(Tree.Affiche=label.equals("Affiche" )) Tree.repaint(); return true; } return false; } } |
Marsh Posté le 25-02-2002 à 16:05:55
C'est assez simple et ca utilise un algo assez connu dont je ne parvient pas a retouver le nom.
En gros, à partir de chaque branche, on dessine 2 nouvelle branches en leur appliquant une rotation et un scale aléatoires.
C'est la méthode Fractale qui est recurssive qui se charge de ca.
Marsh Posté le 25-02-2002 à 16:10:13
IFS (Iterated Function System) c'est le nom de cet algo.
Un peu de doc à ce sujet : http://gjoly.free.fr/fractales-projet/IFS/ifs.html.
Marsh Posté le 25-02-2002 à 22:59:16
url marche po
bon bon etant donne ke je n'y connais absolument irne en java , kel site me conseillerez vous pour m permettre de decrypter vite fait ce prog plize
merci
Marsh Posté le 26-02-2002 à 10:45:47
leboss a écrit a écrit : url marche po bon bon etant donne ke je n'y connais absolument irne en java , kel site me conseillerez vous pour m permettre de decrypter vite fait ce prog plize merci |
Si tu commencais par ton cours de java ?
Ce prog n'a rien de particulier niveau syntaxe java.
C'est l'algoritme utilisé qui est interessant et c'est complètement indépendant du java.
Pour plus d'infos sur l'algo, fait une recherche sur arbre (ou tree) + ifs dans n'importe quel moteur.
[jfdsdjhfuetppo]--Message édité par JeromeV--[/jfdsdjhfuetppo]
Marsh Posté le 25-02-2002 à 15:52:16
Vouala c dans le cadre de mon tpe,j dois faire un prog pour generer un arbre en fractale ; alors la j'ai trouvé un code source en java mais bon je n'y connais absolument rien en java ( un peu en c ) et j'aimerais k'on m'explik un peu le code svp
paske en fait c po exactement ce ke je ve et ej voudrais ameliorer kelkes ptites choses .
Thanx
( si kelk'un a le temps de faireune explikation ligne par ligne ca s'rait tres sympa ; le prog est po tres long)
import java.awt.*;
import java.applet.Applet;
class Fractale extends Panel {
Arbre arbre;
boolean Affiche = false;
double Rap, Pos, Ang;
Color Coul[];
int X1, Y1, X2, Y2, Iter, Tr, Tv, Tb, Fr, Fv, Fb;
Image OffScr;
Dimension Dim;
Graphics OffGra;
Fractale(Arbre arbre) {
this.arbre = arbre;
}
void Fractal(Graphics g, int Ax, int Ay, int Bx, int By, double Angle, int I) {
g.setColor(Coul[I]);
OffGra.setColor(Coul[I]);
g.drawLine(Ax, Ay, Bx, By);
OffGra.drawLine(Ax, Ay, Bx, By);
if(I != Iter){
double Ag = Angle - Math.random() * Ang;
double Ad = Angle + Math.random() * Ang;
double Dist = Math.sqrt((Bx - Ax) * (Bx - Ax) + (By - Ay) * (By - Ay));
int Cx = (int) (Pos * Bx + (1 - Pos) * Ax);
int Cy = (int) (Pos * By + (1 - Pos) * Ay);
int Dx = (int) (Cx + Rap * Dist * Math.sin(Ag));
int Dy = (int) (Cy - Rap * Dist * Math.cos(Ag));
int Ex = (int) (Cx + Rap * Dist * Math.sin(Ad));
int Ey = (int) (Cy - Rap * Dist * Math.cos(Ad));
Fractal(g, Cx, Cy, Dx, Dy, Ag, I+1);
Fractal(g, Cx, Cy, Ex, Ey, Ad, I+1);
}
}
public void paint(Graphics g){
Dimension d = size();
if ((Affiche) || (OffScr == null) || (d.width != Dim.width) || (d.height != Dim.height)){
Dim = d;
OffScr = createImage(d.width, d.height);
OffGra = OffScr.getGraphics();
Coul = new Color[Iter+1];
for (int i = 0; i <= Iter; i++)
Coul[i] = new Color((int)(Tr+i*(Fr-Tr)/Iter),
(int)(Tv+i*(Fv-Tv)/Iter), (int)(Tb+i*(Fb-Tb)/Iter));
g.setColor(getBackground());
g.fillRect(0,0,d.width,d.height);
OffGra.setColor(getBackground());
OffGra.fillRect(0,0,d.width,d.height);
X1 = X2 = d.width >> 1;
Y1 = size().height-1;
Y2 = (int)(0.6*size().height);
Fractal(g, X1, Y1, X2, Y2, 0, 0);
Affiche = false;
} else
g.drawImage(OffScr, 0, 0, null);
}
}
public class Arbre extends Applet {
TextField tIter, tRap, tPos, tAng;
Fractale Tree;
public void init(){
setLayout(new BorderLayout());
Tree = new Fractale(this);
add("Center", Tree);
Panel p = new Panel();
add("South", p);
String s;
Tree.Iter=((s=getParameter("Iter" ))==null)?
12:Integer.parseInt(s);
Tree.Pos=((s=getParameter("Pos" ))==null)?
.5:Double.valueOf(s).doubleValue();
Tree.Rap=((s=getParameter("Rap" ))==null)?
.8:Double.valueOf(s).doubleValue();
Tree.Ang=((s=getParameter("Ang" ))==null)?
.6:Double.valueOf(s).doubleValue();
p.add(tIter=new TextField(Integer.toString(Tree.Iter),4));
p.add(tPos=new TextField(Double.toString(Tree.Pos),4));
p.add(tRap=new TextField(Double.toString(Tree.Rap),4));
p.add(tAng=new TextField(Double.toString(Tree.Ang),4));
p.add(new Button("Affiche" ));
Tree.Tr=((s=getParameter("Tr" ))==null)?
128:Integer.parseInt(s);
Tree.Tv=((s=getParameter("Tv" ))==null)?
64:Integer.parseInt(s);
Tree.Tb=((s=getParameter("Tb" ))==null)?
0:Integer.parseInt(s);
Tree.Fr=((s=getParameter("Fr" ))==null)?
64:Integer.parseInt(s);
Tree.Fv=((s=getParameter("Fv" ))==null)?
192:Integer.parseInt(s);
Tree.Fb=((s=getParameter("Fb" ))==null)?
0:Integer.parseInt(s);
Tree.repaint();
}
public boolean action(Event ev, Object arg){
if(ev.target instanceof Button){
String label=(String) arg;
Tree.Iter=Integer.parseInt(tIter.getText().trim
());
Tree.Pos=Double.valueOf(tPos.getText().trim()).
doubleValue();
Tree.Rap=Double.valueOf(tRap.getText().trim()).
doubleValue();
Tree.Ang=Double.valueOf(tAng.getText().trim()).
doubleValue();
if(Tree.Affiche=label.equals("Affiche" )) Tree.repaint();
return true;
}
return false;
}
}