ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/dly_segment.cpp
Revision: 285
Committed: Sat Oct 8 00:28:41 2011 UTC (13 years, 7 months ago) by francois
File size: 4955 byte(s)
Log Message:
mailleur de delaunay non contraint par les frontieres d'une carte de taille a priori 

File Contents

# User Rev Content
1 francois 285 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�partement
8     // de g�nie m�canique de l'Universit� du Qu�bec �
9     // Trois Rivi�res
10     // Les librairies ne peuvent �tre utilis�es sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // m3d_noeud.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 � 11H23
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26    
27     //#pragma hdrstop
28    
29     #include "dly_noeud.h"
30     #include "dly_segment.h"
31     #include "dly_tetra.h"
32     #include "ot_mathematique.h"
33     #include "fct_taille.h"
34     #include <math.h>
35     //---------------------------------------------------------------------------
36    
37     //#pragma package(smart_init)
38     #define NPAS 5
39    
40     DLY_SEGMENT::DLY_SEGMENT(class DLY_NOEUD *no1,class DLY_NOEUD *no2):noeud1(no1),noeud2(no2)
41     {
42     }
43     DLY_SEGMENT::DLY_SEGMENT(DLY_SEGMENT& mdd):noeud1(mdd.noeud1),noeud2(mdd.noeud2),longueur(mdd.longueur)
44     {
45     }
46     DLY_SEGMENT::~DLY_SEGMENT()
47     {
48     }
49    
50     DLY_NOEUD* DLY_SEGMENT::get_noeud1(void)
51     {
52     return noeud1;
53     }
54     DLY_NOEUD* DLY_SEGMENT::get_noeud2(void)
55     {
56     return noeud2;
57     }
58    
59     void DLY_SEGMENT::insere_lien_tetra(DLY_TETRA* tet)
60     {
61     lsttet.push_back(tet);
62     }
63    
64    
65     int DLY_SEGMENT::tet_est_present(DLY_TETRA* tet)
66     {
67     for (std::vector<DLY_TETRA*>::iterator it=lsttet.begin();it!=lsttet.end();it++)
68     if ((*it)==tet) return 1;return 0;
69     }
70    
71     int DLY_SEGMENT::get_nb_tetra(void)
72     {
73     return lsttet.size();
74     }
75    
76     DLY_TETRA* DLY_SEGMENT::get_tetra(int i)
77     {
78     return lsttet[i];
79     }
80    
81     DLY_TETRA* DLY_SEGMENT::get_tetra_feuille(void)
82     {
83     int i=0;
84     int ok=0;
85     while (ok==0)
86     {
87     if (lsttet[i]->get_feuille()==1) ok=1;
88     else i++;
89     if (i>=lsttet.size()) return NULL;
90     }
91     return lsttet[i];
92     }
93    
94     double DLY_SEGMENT::get_longueur(void)
95     {
96     return longueur;
97     }
98    
99     double DLY_SEGMENT::calcul_longueur(class FCT_TAILLE *metrique,int conserve)
100     {
101     double l;
102     double xyz1[3],xyz2[3];
103     noeud1->get_coord(xyz1);
104     noeud2->get_coord(xyz2);
105     OT_VECTEUR_3D vec1(xyz1,xyz2);
106     if (metrique==NULL)
107     {
108     l=vec1.get_longueur();
109     if (conserve) {longueur=l;t_demilongueur=0.5;}
110     return l;
111     }
112     l=0.;
113     double dxyz[3];
114     dxyz[0]=xyz2[0]-xyz1[0];
115     dxyz[1]=xyz2[1]-xyz1[1];
116     dxyz[2]=xyz2[2]-xyz1[2];
117     double tab[NPAS+1],t[NPAS+1];
118     for (int i=0;i<NPAS;i++)
119     {
120     double ti=1.0*i/NPAS;
121     double tii=1.0*(i+1)/NPAS;
122     t[i]=ti;
123     t[i+1]=tii;
124     double tgauss1=0.7886751345*tii+0.2113248654*ti;
125     double xyz[3];
126     xyz[0]=xyz1[0]+tgauss1*(xyz2[0]-xyz1[0]);
127     xyz[1]=xyz1[1]+tgauss1*(xyz2[1]-xyz1[1]);
128     xyz[2]=xyz1[2]+tgauss1*(xyz2[2]-xyz1[2]);
129     double tenseur[9];
130     metrique->evaluer(xyz,tenseur);
131     double val1= sqrt(dxyz[0]*dxyz[0]*tenseur[0]+dxyz[0]*dxyz[1]*tenseur[3]+dxyz[0]*dxyz[2]*tenseur[6]+dxyz[1]*dxyz[0]*tenseur[1]+dxyz[1]*dxyz[1]*tenseur[4]+dxyz[1]*dxyz[2]*tenseur[7]+dxyz[2]*dxyz[0]*tenseur[2]+dxyz[2]*dxyz[1]*tenseur[5]+dxyz[2]*dxyz[2]*tenseur[8]);
132     double tgauss2=0.7886751345*ti+0.2113248654*tii;
133     xyz[0]=xyz1[0]+tgauss2*(xyz2[0]-xyz1[0]);
134     xyz[1]=xyz1[1]+tgauss2*(xyz2[1]-xyz1[1]);
135     xyz[2]=xyz1[2]+tgauss2*(xyz2[2]-xyz1[2]);
136     metrique->evaluer(xyz,tenseur);
137     double val2= sqrt(dxyz[0]*dxyz[0]*tenseur[0]+dxyz[0]*dxyz[1]*tenseur[3]+dxyz[0]*dxyz[2]*tenseur[6]+dxyz[1]*dxyz[0]*tenseur[1]+dxyz[1]*dxyz[1]*tenseur[4]+dxyz[1]*dxyz[2]*tenseur[7]+dxyz[2]*dxyz[0]*tenseur[2]+dxyz[2]*dxyz[1]*tenseur[5]+dxyz[2]*dxyz[2]*tenseur[8]);
138     tab[i]=l;
139     l=l+0.5*(tii-ti)*(val1+val2);
140     tab[i+1]=l;
141     }
142     if (conserve)
143     {
144     longueur=l;
145     int i;
146     for(i=0;tab[i]<l/2.;i++);
147     t_demilongueur=t[i]+(t[i+1]-t[i])/(tab[i+1]-tab[i])*(l/2.-tab[i]);
148     }
149     return l;
150     }
151     double DLY_SEGMENT::get_critere(void)
152     {
153     return critere;
154     }
155    
156     void DLY_SEGMENT::change_critere(double crit)
157     {
158     critere=crit;
159     }
160    
161    
162    
163     void DLY_SEGMENT::decoupe_noeud(std::vector<double> &lstpt) // a adapter pour taille variable
164     {
165     double xyz1[3],xyz2[3],x,y,z;
166     noeud1->get_coord(xyz1);
167     noeud2->get_coord(xyz2);
168     x=xyz1[0]+t_demilongueur*(xyz2[0]-xyz1[0]);
169     y=xyz1[1]+t_demilongueur*(xyz2[1]-xyz1[1]);
170     z=xyz1[2]+t_demilongueur*(xyz2[2]-xyz1[2]);
171     lstpt.push_back(x);
172     lstpt.push_back(y);
173     lstpt.push_back(z);
174     }