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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
import java.util.List;
import java.util.Vector;
import mathematiques.primitives.pointstiti.Point;
import mathematiques.primitives.pointstiti.Point3DF;
import mathematiques.primitives.pointstiti.PointI;
/**
* <p>Description : Cette classe effectue le calcul du flocon de Von Koch pour un nombre d'itérations donnees.</p>
* <p>Package necessaires : affichage, mathematiques.</p>
* <p>Dernieres modifications :<br>
* 23 Avril 2009 => Un petit lifting pour effacer les erreurs de jeunesse.<br>
* Durant mes debuts en Java => Creation.</p>
* <p>Copyright : Copyright (c) 2007.</p>
* <p>Laboratoire : LSIS.</p>
* <p>Equipe : Image et Modele, I&M (ex LXAO).</p>
*
* @author Guillaume THIBAULT
* @version 1.0
*/
public class VonKoch implements Affichable
{
/** Est ce que le calcul a deja ete fait ?*/
protected boolean Effectue = false ;
/** La liste des points formant le flocon.*/
protected List<Point> Liste = new Vector<Point>() ;
public VonKoch()
{
}
/** Methode qui lance le calcul.
* @param ListeIn La liste des trois premiers points. Le sens des points determine la forme du flocon.
* @param nbIterations Le nombre d'iteration a effectuer.*/
public void Compute(List<Point> ListeIn, int nbIterations)
{
int i ;
if ( Effectue ) return ;
for (i=0 ; i < ListeIn.size() ; i++)
Liste.add(new Point3DF(ListeIn.get(i))) ;
Calculs(nbIterations) ;
}
/** Methode qui lance le calcul a partir d'une liste contenant des points en coordonnees entieres.
* @param ListeIn La liste des trois premiers points. Le sens des points determine la forme du flocon.
* @param nbIterations Le nombre d'iteration a effectuer.*/
public void ComputeI(List<PointI> ListeIn, int nbIterations)
{
if ( Effectue ) return ;
for (int i=0 ; i < ListeIn.size() ; i++)
Liste.add(new Point3DF(ListeIn.get(i).getX(), ListeIn.get(i).getY())) ;
Calculs(nbIterations) ;
}
/** Methode qui effectue les calculs.
* @param nbIterations Le nombre d'iteration a effectuer.*/
protected void Calculs(int nbIterations)
{
int i, n ;
Point p1, p2, p3 ;
Point Inter = new Point3DF() ;
for (n=0 ; n < nbIterations ; n++)
for (i=0 ; i < Liste.size()-1 ; )
{
p1 = new Point3DF() ;
p2 = new Point3DF() ;
p3 = new Point3DF() ;
p1.setX( Liste.get(i).getX() + (Liste.get(i+1).getX()-Liste.get(i).getX()) / 3.0 ) ;
p1.setY( Liste.get(i).getY() + (Liste.get(i+1).getY()-Liste.get(i).getY()) / 3.0 ) ;
p3.setX( Liste.get(i).getX() + 2.0*(Liste.get(i+1).getX()-Liste.get(i).getX()) / 3.0 ) ;
p3.setY( Liste.get(i).getY() + 2.0*(Liste.get(i+1).getY()-Liste.get(i).getY()) / 3.0 ) ;
Inter.setX(p3.getX()-p1.getX()) ;
Inter.setY(p3.getY()-p1.getY()) ;
p2.setX(Inter.getX()*Math.cos(Math.PI/3.0) + Inter.getY()*Math.sin(Math.PI/3.0)) ;
p2.setY(-Inter.getX()*Math.sin(Math.PI/3.0) + Inter.getY()*Math.cos(Math.PI/3.0)) ;
p2.setX(p1.getX()+p2.getX()) ;
p2.setY(p1.getY()+p2.getY()) ;
Liste.add(i+1, p1) ;
Liste.add(i+2, p2) ;
Liste.add(i+3, p3) ;
i += 4 ;
}
Effectue = true ;
}
/* ----------------------------------------------------- Les getters & autres ----------------------------------------------------- */
/** Methode qui retourne la liste des points formant le flocon.
* @return Une List contenant les points.*/
public List<Point> getListe()
{
return Liste ;
}
/** Methode qui vide la liste.*/
public void Reset()
{
Liste.clear() ;
Effectue = false ;
}
} |
Partager