@@ -17,30 +17,27 @@ namespace Mgx3D {
1717/* ----------------------------------------------------------------------------*/
1818namespace Topo {
1919/* ----------------------------------------------------------------------------*/
20- #define _DEBUG_beta
21- /* ----------------------------------------------------------------------------*/ EdgeMeshingPropertyBeta::
22- EdgeMeshingPropertyBeta (int nb, double beta, bool isDirect, bool initWithFirstEdge, double meshingEdgeLength)
23- : CoEdgeMeshingProperty(nb, beta_resserrement, isDirect)
20+ // #define _DEBUG_beta
21+ /* ----------------------------------------------------------------------------*/
22+ EdgeMeshingPropertyBeta::
23+ EdgeMeshingPropertyBeta (int nbBras, double beta, bool isDirect,
24+ bool initWithFirstEdge, double meshingEdgeLength)
25+ : CoEdgeMeshingProperty(nbBras, beta_resserrement, isDirect)
2426, m_beta(beta)
2527, m_arm1(meshingEdgeLength)
2628, m_initWithArm1(initWithFirstEdge)
2729{
28- if (!m_initWithArm1 && m_beta<= 1.0 ){
30+ if (!m_initWithArm1 && ( m_beta<1.00001 || m_beta> 1.01 ) ){
2931 TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8);
30- messErr << " EdgeMeshingPropertyBeta, la valeur de beta doit être légèrement supérieur à 1 , actuellement : " <<m_beta;
32+ messErr << " EdgeMeshingPropertyBeta, la valeur de beta doit être comprise entre 1 et 1.01 , actuellement : " <<m_beta;
3133 throw TkUtil::Exception (messErr);
3234 }
33- if (!m_initWithArm1 && m_beta>2.0 ){
34- TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8);
35- messErr << " EdgeMeshingPropertyBeta, la longueur de beta n'a pas été testé jusque là " <<m_beta;
36- throw TkUtil::Exception (messErr);
37- }
3835 if (m_initWithArm1 && m_arm1 < 0 ){
3936 TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8);
4037 messErr << " EdgeMeshingPropertyGeometric, la longueur du premier bras ne doit pas être négative : " <<m_arm1;
4138 throw TkUtil::Exception (messErr);
4239 }
43- if (nb< 1 )
40+ if (nbBras < 1 )
4441 throw TkUtil::Exception (TkUtil::UTF8String (" EdgeMeshingPropertyBeta, le nombre de bras doit être au moins de 1" , TkUtil::Charset::UTF_8));
4542}
4643/* ----------------------------------------------------------------------------*/
@@ -82,63 +79,61 @@ bool EdgeMeshingPropertyBeta::operator == (const CoEdgeMeshingProperty& cedp) co
8279 return CoEdgeMeshingProperty::operator == (cedp);
8380}
8481/* ----------------------------------------------------------------------------*/
85-
82+ void EdgeMeshingPropertyBeta::setNbEdges (const int nb)
83+ {
84+ CoEdgeMeshingProperty::setNbEdges (nb);
85+ }
86+ /* ----------------------------------------------------------------------------*/
8687void EdgeMeshingPropertyBeta::initCoeff (double length)
8788{
88- // if (m_initWithArm1){
89- // c'est l'occasion de calculer la raison
90- computeBeta (0.0334298 );
91- // }
89+ if (m_initWithArm1){
90+ // on calcule le coefficient de resserement
91+ m_beta = computeBeta (m_arm1);
92+ }
93+ initCoeff ();
9294}
9395
94- double EdgeMeshingPropertyBeta::
95- nextCoeff ()
96+ void EdgeMeshingPropertyBeta::initCoeff ()
9697{
97- m_dernierIndice+= 1 ;
98-
99- // #ifdef _DEBUG
100- if (m_dernierIndice>m_nb_edges ){
98+ # ifdef _DEBUG_beta
99+ std::cout<< " EdgeMeshingPropertyBeta::initCoeff() " <<std::endl;
100+ # endif
101+ if (m_beta== 0.0 ){
101102 TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8);
102- messErr<<" EdgeMeshingPropertyBeta::nextCoeff est en dehors des limites: dernierIndice : "
103- <<(long )m_dernierIndice<<" , nb de bras : " <<(long )m_nb_edges;
103+ messErr << " Erreur interne: EdgeMeshingPropertyBeta, le coefficient de resserrement n'a pas été initialisé" ;
104104 throw TkUtil::Exception (messErr);
105105 }
106- // #endif
106+
107+ m_dernierIndice = 0 ;
108+ }
109+
110+ double EdgeMeshingPropertyBeta::
111+ nextCoeff ()
112+ {
113+ m_dernierIndice+=1 ;
107114
108115 double feta = 0.0 ;
109116 double eta = 0.0 ;
110117 if (m_sens){
111118 eta = ((double )m_dernierIndice)/((double )m_nb_edges);
112- std::cout << " eta = " << eta << std::endl;
113119 feta=resserre (eta, m_beta);
114- std::cout << " feta = " << feta << std::endl;
115120 }
116121 else {
117122 eta = ((double )m_nb_edges-m_dernierIndice)/((double )m_nb_edges);
118123 feta = 1.0 -resserre (eta, m_beta);
119124 }
120125
121- // #ifdef _DEBUG2
122- std::cout<<" EdgeMeshingPropertyBeta::nextCoeff (m_beta=" <<m_beta<<" ) return " <<feta<<" pour eta = " <<eta<<std::endl;
123- // #endif
126+ #ifdef _DEBUG_beta
127+ std::cout<<" EdgeMeshingPropertyBeta::nextCoeff (m_beta=" <<m_beta<<" ) return " <<feta<<std::endl;
128+ #endif
129+
124130 return feta;
125131}
126132/* ----------------------------------------------------------------------------*/
127133double EdgeMeshingPropertyBeta::resserre (double eta, double beta)
128134{
129- std::cout << " beta = " << beta << std::endl;
130- double ratio = (beta + 1.0 ) / (beta - 1.0 );
131- std::cout << " ratio = " << ratio << std::endl;
132- double zlog = std::log (ratio);
133- std::cout << " zlog = " << zlog << std::endl;
134- double puiss = zlog * (1.0 - eta);
135- puiss = std::exp (puiss);
136- std::cout << " puiss = " << puiss << std::endl;
137- double rapp = (1.0 - puiss) / (1.0 + puiss);
138- std::cout << " rapp = " << rapp << std::endl;
139- double feta = 1.0 + beta * rapp;
140- std::cout << " feta = " << feta << std::endl;
141- return feta;
135+ double p = std::log ((beta + 1.0 )/(beta - 1.0 )) * (1.0 - eta);
136+ return 1.0 + beta * (1.0 - std::exp (p)) / (1.0 + std::exp (p));
142137}
143138/* ----------------------------------------------------------------------------*/
144139TkUtil::UTF8String EdgeMeshingPropertyBeta::
@@ -187,18 +182,18 @@ computeBeta(const double lg)
187182 std::cout << " eta = " << eta << std::endl;
188183 }
189184
190-
191185 // on limite la recherche
192- double beta1 = 1.0000001 ;
193- double beta2 = 2.0 ;
186+ double beta1 = 1.00001 ;
187+ double beta2 = 1.01 ;
194188 double lg1 = resserre (eta, beta1);
195189 double lg2 = resserre (eta, beta2);
196190
191+ std::cout << " lg1 = " << lg1 << " , lg2 = " << lg2 << " , lg = " << lg << std::endl;
197192 if ((lg1<lg && lg2<lg) || (lg1>lg && lg2>lg)){
198193 TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8);
199194 messErr << " EdgeMeshingPropertyBeta, on ne peut pas trouver de beta pour lg "
200195 <<lg<<" et nombre de bras de " <<(short )m_nb_edges;
201- throw TkUtil::Exception (messErr);
196+ throw TkUtil::Exception (messErr);
202197 }
203198 uint iter = 0 ;
204199 bool sens = (lg1<lg2);
@@ -208,8 +203,8 @@ computeBeta(const double lg)
208203
209204 double lg_iter = resserre (eta, beta);
210205#ifdef _DEBUG_beta
211- std::cout<<" iter " <<iter<<std::endl;
212- std::cout<<" beta " <<beta<<" , lg_iter " <<lg_iter<<std::endl;
206+ // std::cout<<"iter "<<iter<<std::endl;
207+ // std::cout<<" beta "<<beta<<", lg_iter "<<lg_iter<<std::endl;
213208#endif
214209
215210 if (sens){
0 commit comments