43 #pragma package(smart_init)
83 if (t[0]==v||t[1]==v||t[2]==v)
continue;
95 return Swap(__segment,
false);
231 MG_NOEUD* tris[2][2][3]={{{no[2],no[3],no[0]},{no[0],no[1],no[2]}},
232 {{no[3],no[1],no[2]},{no[1],no[3],no[0]}}};
236 if (testOverlapTriangles)
return -1;
241 for (
int k=0;k<2;k++)
242 for (
int i=0;i<2;i++)
245 MCFace * face = (
MCFace *)triangle[i]->get_lien_topologie();
246 for (
int j=0;j<3;j++)
247 ((
MCNode*)tris[k][i][j])->NormalMCFace(face,normal[j]);
248 normal[3] = .3333*(normal[0]+normal[1]+normal[2]);
253 for (
int j=0;j<3;j++)
256 tpProjNodes[j] = trf*p;
258 tpProjNodes[j][2] = 0;
263 double crit1=std::min(crit[0][0],crit[0][1]);
264 double crit2=std::min(crit[1][0],crit[1][1]);
268 double critGeomAccuracy[2];
280 AB->
evaluer_geo(((area[1][0]*wA+area[1][1]*wB)/(area[1][0]+area[1][1])),&Pgeo);
283 double P_Euclid[2][3];
284 for (
int i=0;i<3;i++) {
285 P_Euclid[1][i]=((area[0][0]*no[1]->
get_coord()[i]+area[0][1]*no[3]->
get_coord()[i])/(area[0][0]+area[0][1]));
286 P_Euclid[0][i]=((area[1][0]*no[0]->
get_coord()[i]+area[1][1]*no[2]->
get_coord()[i])/(area[1][0]+area[1][1]));
288 double distP[2],segLength[2];
289 for (
int i=0;i<2;i++)
291 for (
int i=0;i<2;i++)
293 double maxDistP=.5*std::max(segLength[0],segLength[1]);
294 for (
int i=0;i<2;i++)
295 if ( distP[i] < maxDistP )
296 critGeomAccuracy[i] = 1-distP[i]/maxDistP;
298 critGeomAccuracy[i] = 0;
301 crit1 += critGeomAccuracy[0];
302 crit2 += critGeomAccuracy[1];
304 if (__execute && crit2 > crit1 )
309 return (crit2>crit1)?crit2:-1;
319 for (
int i=0; i<3; i++)
338 for (
int i=0; i<3; i++)
352 for (
int i=0; i<3; i++)
366 for (
int i=0; i<3; i++)
374 LISTE_MG_SEGMENT::iterator itSeg;
375 LISTE_MG_NOEUD::iterator itNo;
376 LISTE_MG_TRIANGLE::iterator itTri;
380 if (tri->get_lien_topologie()->get_dimension()==3)
385 if (seg->get_lien_topologie()->get_dimension()==3)
390 if (no->get_lien_topologie()->get_dimension()==3)
398 LISTE_MG_SEGMENT::iterator itSeg;
400 std::map<double, MG_SEGMENT*> lst;
402 for (
int j=0;j<3;j++)
405 int tmpnbSwap = nbSwap;
409 if (__face != NULL && topo != __face)
416 for (std::map<double, MG_SEGMENT*>::reverse_iterator i=lst.rbegin();i!=lst.rend();i++)
418 double score1 = i->first;
430 if (nbSwap-tmpnbSwap==0)
virtual void change_qualite(double val)
FMap & GetRefFaceMapping()
void evaluer_geo(double __t, MCNode *__result, double *tangent=0, double *curvature=0)
double SwapScore(MG_SEGMENT *__segment)
MG_NOEUD * GetNodeBefore(MG_TRIANGLE *__t, MG_NOEUD *__n)
int CheckOverlapTriangle(MG_NOEUD *__tri[2][3])
double Swap(MG_SEGMENT *, bool)
double SwapSegment(MG_SEGMENT *__segment)
MG_SEGMENT * GetSegmentAfter(MG_TRIANGLE *, MG_SEGMENT *)
MG_NOEUD * GetStartNode(MG_TRIANGLE *__t, MG_SEGMENT *__s)
MG_SEGMENT * GetSegmentBefore(MG_TRIANGLE *, MG_SEGMENT *)
OptimizeEdgeSwap(MG_MAILLAGE *)
MG_NOEUD * GetNodeAfter(MG_TRIANGLE *__t, MG_NOEUD *__n)
MG_NOEUD * GetOppositeNode(MG_TRIANGLE *__t, MG_SEGMENT *__s)
int Optimize(MG_FACE *__face)
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
virtual int get_dimension(void)=0
int supprimer_mg_noeudid(unsigned long num)
MG_SEGMENT * get_premier_segment(LISTE_MG_SEGMENT::iterator &)
MG_TRIANGLE * get_premier_triangle(LISTE_MG_TRIANGLE::iterator &it)
MG_TRIANGLE * get_suivant_triangle(LISTE_MG_TRIANGLE::iterator &it)
int supprimer_mg_triangleid(unsigned long num)
MG_TRIANGLE * ajouter_mg_triangle(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, class MG_NOEUD *mgnoeud3, int origine, unsigned long num=0)
MG_NOEUD * get_premier_noeud(LISTE_MG_NOEUD::iterator &it)
MG_SEGMENT * get_suivant_segment(LISTE_MG_SEGMENT::iterator &)
MG_NOEUD * get_suivant_noeud(LISTE_MG_NOEUD::iterator &it)
MG_SEGMENT * get_mg_segment(unsigned int num)
MG_SEGMENT * ajouter_mg_segment(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, int origine, double longue=0.0, unsigned long num=0)
int supprimer_mg_segmentid(unsigned long num)
void supprimer_tout_mg_tetra(void)
virtual double * get_coord(void)
virtual MG_NOEUD * get_noeud1(void)
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_NOEUD * get_noeud3(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_SEGMENT * get_segment2(void)
virtual MG_SEGMENT * get_segment3(void)
virtual MG_SEGMENT * get_segment1(void)
static double qualite_triangle(double *noeud1, double *noeud2, double *noeud3)
static int project_PointTriangle(double P0[3], double TV0[3], double TV1[3], double TV2[3], double I[3], double *IT=0)
static double VEC3_DISTANCE_VEC3(double a[3], double b[3])
static double Area_Triangle(double TV0[3], double TV1[3], double TV2[3])
void transpose(OT_MATRICE_3D &res) const