Mesh.cpp

Aller à la documentation de ce fichier.
00001 /*
00002  * Mesh.cpp : Maillage 
00003  * Copyright (C) 2007 Florence Zara, LIRIS
00004  *               florence.zara@liris.univ-lyon1.fr
00005  *               http://liris.cnrs.fr/florence.zara/
00006  *
00007  *
00008  * This program is free software; you can redistribute it and/or modify
00009  * it under the terms of the GNU Lesser General Public License as published
00010  * by the Free Software Foundation; either version 2.1 of the License, or
00011  * (at your option) any later version.
00012  *
00013  * This program is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  * GNU Lesser General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU Lesser General Public License
00019  * along with this program; if not, write to the Free Software
00020  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021  */
00022 
00023 
00031 #include <stdio.h>
00032 #include <fstream>
00033 #include <math.h> 
00034 
00036 #include "Noeuds.h"
00037 #include "Mesh.h"
00038 #include "Donnees.h"
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00049 void Ressort::SetLrepos() 
00050 {
00051         // Variables intermediaires
00052         float var0, var1, var2, var3;
00053         
00054         // Calcul de la longueur du ressort entre les deux particules
00055         Coord a = GetParticuleA()->GetPosition();
00056         Coord b = GetParticuleB()->GetPosition();
00057         
00058         var1 = a.getX() - b.getX();
00059         var2 = a.getY() - b.getY();
00060         var3 = a.getZ() - b.getZ();
00061         
00062         var0 = (var1 * var1) + (var2 * var2) + (var3 * var3);
00063         
00064         // l(A,B) = sqrt( (xA-xB)≤ + (yA-yB)≤ + (zA-zB)≤ )        
00065         _Spring->_L0 = sqrt(var0);
00066         
00067 }
00068 
00069 
00073 void Mesh::MakeFace(Particule *p1, Particule *p2, Particule *p3, Spring *R)
00074 {
00075         /* Une face est constituee de trois aretes */
00076         // Construction de l arete entre p1 et p2
00077         MakeEdge(p1, p2, R);
00078         
00079         // Construction de l arete entre p2 et p3
00080         MakeEdge(p2, p3, R);
00081         
00082         // Construction de l arete entre p3 et p1
00083         MakeEdge(p3, p1, R);
00084 }
00085 
00086 
00090 void Mesh::MakeEdge(Particule *p1, Particule *p2, Spring *R)
00091 {
00092         // Verification que le ressort entre ces deux particules n existe pas deja
00093         bool exist = false;
00094         
00095         // Liste des ressorts relies a p1
00096         std::vector<Ressort *> ressortList = p1->GetRessortList();
00097         
00098         // Parcours de la liste des ressorts de p1
00099         for(int i=0; i<ressortList.size(); ++i)
00100     {
00101                 // Regarde si il existe un ressort relie a p1 et p2
00102                 if ( ((ressortList[i])->GetParticuleA() == p2) || ((ressortList[i])->GetParticuleB() == p2))
00103                 {
00104                         // Le ressort existe deja entre p1 et p2
00105                         exist = true;
00106                         
00107                         // Arret du parcours 
00108                         break;
00109                 }
00110                 
00111     }
00112         
00113         // Ajout d un nouveau ressort dans le maillage
00114         if (!exist)
00115     {
00116                 // Construction d un ressort entre les particules p1 et p2
00117                 Ressort *res = new Ressort(p1, p2, R);
00118                 
00119                 // Ajout du ressort res dans la liste des ressorts de p1
00120                 p1->AddRessort(res);
00121                 
00122                 // Ajout du ressort res dans la liste des ressorts de p2
00123                 p2->AddRessort(res);
00124                 
00125                 // Ajout du ressort res dans la liste des ressorts du maillage
00126                 this->AddRessort(res);
00127     }
00128         
00129 }
00130 
00131 
00135 void Mesh::AfficheMesh()
00136 {
00137         std::cout << " ____________________________________" << std::endl << std::endl;
00138         
00139         Coord tmp;
00140         
00141         // Affichage des particules
00142         for(int i=0; i<_ParticuleList.size(); ++i)
00143     {
00144                 std::cout << "Particule numero " << GetParticule(i)->GetId() << std::endl;
00145                 
00146                 // Coordonnees de la particule i 
00147                 tmp = GetParticule(i)->GetPosition();
00148                 std::cout << "Position de la particule " << tmp.getX() << " " << tmp.getY() << " " << tmp.getZ() << std::endl;
00149                 
00150                 std::cout << "Nombre de voisins de la particules " << GetParticule(i)->GetNbVoisins() << std::endl << std::endl;
00151                 std::cout << "Voisins de la particule " << std::endl;
00152                 
00153                 // Recuperation de la liste des ressorts reliees a la particule
00154                 std::vector<Ressort *> ListeRessort = GetParticule(i)->GetRessortList();
00155                 
00156                 // Affichage des ressorts
00157                 for(int j=0; j<ListeRessort.size(); ++j)
00158                 {
00159                         // Affichage du voisin
00160                         std::cout << "           " << "Numero de la particule voisine " ;         
00161                         
00162                         // Regarde si la voisine c est la particule A ou B du ressort
00163                         if ( (ListeRessort[j]->GetParticuleA())->GetId() == GetParticule(i)->GetId() )
00164                                 std::cout << (ListeRessort[j]->GetParticuleB())->GetId() << std::endl;
00165                         else
00166                                 std::cout << (ListeRessort[j]->GetParticuleA())->GetId() << std::endl;
00167                         
00168                         // Affichage des caracteristiques du ressort
00169                         //std::cout << "           " << "Numero du ressort " << ListeRessort[j]->GetId() << std::endl;
00170                         std::cout << "           " << "Raideur du ressort " << ListeRessort[j]->GetRaideur() << std::endl;
00171                         std::cout << "           " << "Amortissement du ressort " << ListeRessort[j]->GetAmortissement() << std::endl;
00172                         std::cout << "           " << "Facteur d amortissement du ressort " << ListeRessort[j]->GetFactAmorti() << std::endl;
00173                         std::cout << "           " << "Longueur au repos " << ListeRessort[j]->GetLrepos() << std::endl << std::endl;
00174                         
00175                 }//for_j
00176                 
00177                 // Particule suivante du maillage
00178                 std::cout << " ____________________________________" << std::endl << std::endl;
00179                 
00180     }//for_i
00181 }

Généré le Thu Jan 24 19:11:42 2008 pour Animation 3D par  doxygen 1.5.1