diff --git a/Mesh/meshGFaceLloyd.cpp b/Mesh/meshGFaceLloyd.cpp index 7c2297ddd5edd21c04a4bf883391967e925898c4..7c5a351033ef1122c0b080b498c6c68c750c292c 100644 --- a/Mesh/meshGFaceLloyd.cpp +++ b/Mesh/meshGFaceLloyd.cpp @@ -90,10 +90,9 @@ void callback(const alglib::real_1d_array& x,double& func,alglib::real_1d_array& if(!error3){ val = obj.seed(*pointer,gf); pointer->concave(val.x(),val.y(),gf); - obj.compute_metrics(*pointer); obj.clip_cells(*pointer,gf); obj.swap(); - obj.compute_parameters(p); + obj.compute_parameters(gf,p); obj.get_gauss(); obj.eval(*pointer,gradients,energy,p); func = energy; @@ -200,78 +199,6 @@ void smoothing::optimize_face(GFace* gf){ triangulator.data(i++) = (*it); } - triangulator.Voronoi(); - triangulator.initialize(); - int index,number,count,max; - bool flag; - number = 0; - count = 0; - max = 1000; - for(int i=0;i<max;i++) - { - if(count>=number) break; - index = (int)((triangulator.numPoints-1)*((double)rand()/(double)RAND_MAX)); - PointRecord& pt = triangulator.points[index]; - MVertex* v = (MVertex*)pt.data; - if(v->onWhat()==gf && !triangulator.onHull(index)){ - flag = triangulator.remove_point(index); - if(flag) count++; - } - } - triangulator.remove_all(); - - triangulator.Voronoi(); - double delta; - delta = 0.01; - for(int i=0;i<triangulator.numPoints;i++){ - PointRecord& pt = triangulator.points[i]; - MVertex* v = (MVertex*)pt.data; - if(v->onWhat()==gf && !triangulator.onHull(i)){ - //triangulator.points[i].where.h = delta + (1.0-2.0*delta)*((double)rand()/(double)RAND_MAX); - //triangulator.points[i].where.v = delta + (1.0-2.0*delta)*((double)rand()/(double)RAND_MAX); - } - } - - int index1 = -1; - int index2 = -1; - int index3 = -1; - int index4 = -1; - int index5 = -1; - int index6 = -1; - int index7 = -1; - int index8 = -1; - for(int i=0;i<triangulator.numPoints;i++){ - PointRecord& pt = triangulator.points[i]; - MVertex* v = (MVertex*)pt.data; - if(v->onWhat()==gf && !triangulator.onHull(i)){ - if(index1==-1) index1 = i; - else if(index2==-1) index2 = i; - else if(index3==-1) index3 = i; - else if(index4==-1) index4 = i; - else if(index5==-1) index5 = i; - else if(index6==-1) index6 = i; - else if(index7==-1) index7 = i; - else if(index8==-1) index8 = i; - - } - } - /*triangulator.points[index1].where.h = 0.01; - triangulator.points[index1].where.v = 0.01; - triangulator.points[index2].where.h = 0.01; - triangulator.points[index2].where.v = 0.99; - triangulator.points[index3].where.h = 0.99; - triangulator.points[index3].where.v = 0.01; - triangulator.points[index4].where.h = 0.99; - triangulator.points[index4].where.v = 0.99;*/ - /*triangulator.points[index5].where.h = 0.500; - triangulator.points[index5].where.v = 0.002; - triangulator.points[index6].where.h = 0.510; - triangulator.points[index6].where.v = 0.001; - triangulator.points[index7].where.h = 0.520; - triangulator.points[index7].where.v = 0.003; - triangulator.points[index8].where.h = 0.530; - triangulator.points[index8].where.v = 0.004;*/ - // compute the Voronoi diagram triangulator.Voronoi(); //printf("hullSize = %d\n",triangulator.hullSize()); @@ -280,6 +207,7 @@ void smoothing::optimize_face(GFace* gf){ int exponent; int num_interior; + int index; double epsg; double epsf; double epsx; @@ -335,10 +263,9 @@ void smoothing::optimize_face(GFace* gf){ /*lpcvt obj2; SPoint2 val = obj2.seed(triangulator,gf); triangulator.concave(val.x(),val.y(),gf); - obj2.compute_metrics(triangulator); obj2.clip_cells(triangulator,gf); obj2.swap(); - obj2.compute_parameters(exponent); + obj2.compute_parameters(gf,exponent); obj2.get_gauss(); obj2.write(triangulator,gf,6);*/ @@ -352,18 +279,6 @@ void smoothing::optimize_face(GFace* gf){ } triangulator.Voronoi(); - //lpcvt obj; - //SPoint2 val = obj.seed(triangulator,gf); - //triangulator.concave(val.x(),val.y(),gf); - //obj.clip_cells(triangulator,gf); - //obj.print_voronoi1(); - //obj.print_voronoi2(); - //obj.print_delaunay(triangulator); - //test = obj.total_area(); - //obj.swap(); - //obj.get_gauss(); - //obj.write(triangulator,gf,6); - // now create the vertices std::vector<MVertex*> mesh_vertices; for (int i=0; i<triangulator.numPoints;i++){ @@ -647,9 +562,7 @@ SPoint2 lpcvt::seed(DocRecord& triangulator,GFace* gf){ int index2; double x,y; SPoint2 x0,x1,x2; - - work_around = gf; - + for(i=0;i<triangulator.numPoints;i++){ if(interior(triangulator,gf,i)){ num = triangulator._adjacencies[i].t_length; @@ -1009,7 +922,6 @@ void lpcvt::clear(){ borders.clear(); angles.clear(); temp.clear(); - metrics.clear(); } double lpcvt::total_area(){ @@ -1099,36 +1011,17 @@ void lpcvt::print_segment(SPoint2 p1,SPoint2 p2,std::ofstream& file){ << "10, 20};\n"; } -void lpcvt::compute_metrics(DocRecord& triangulator){ - int i; - double x; - double y; - double angle; - double cosinus; - double sinus; - SPoint2 point; - metric m; - - metrics.resize(triangulator.numPoints); - - for(i=0;i<triangulator.numPoints;i++){ - point = convert(triangulator,i); - x = point.x(); - y = point.y(); - angle = -backgroundMesh::current()->getAngle(x,y,0.0); //-myatan2(y,x); - cosinus = cos(angle); - sinus = sin(angle); - m = metric(cosinus,-sinus,sinus,cosinus); - metrics[i] = m; - } -} - -void lpcvt::compute_parameters(int p){ +void lpcvt::compute_parameters(GFace* gf,int p){ double h1,h2,h3; double k; double ratio; - SPoint2 center,p1,p2,p3; + double angle; + double cosinus; + double sinus; + SPoint2 center; + SPoint2 p1,p2,p3; voronoi_vertex v1,v2,v3; + metric m; std::list<voronoi_element>::iterator it; k = 1.0; @@ -1140,10 +1033,14 @@ void lpcvt::compute_parameters(int p){ p2 = v2.get_point(); p3 = v3.get_point(); center = SPoint2((p1.x()+p2.x()+p3.x())/3.0,(p1.y()+p2.y()+p3.y())/3.0); - ratio = get_ratio(center); + ratio = get_ratio(gf,center); h1 = k*backgroundMesh::current()->operator()(p1.x(),p1.y(),0.0)*ratio; h2 = k*backgroundMesh::current()->operator()(p2.x(),p2.y(),0.0)*ratio; h3 = k*backgroundMesh::current()->operator()(p3.x(),p3.y(),0.0)*ratio; + angle = -backgroundMesh::current()->getAngle(p1.x(),p1.y(),0.0); + cosinus = cos(angle); + sinus = sin(angle); + m = metric(cosinus,-sinus,sinus,cosinus); v1.set_h(h1); v2.set_h(h2); v3.set_h(h3); @@ -1151,19 +1048,19 @@ void lpcvt::compute_parameters(int p){ it->set_v2(v2); it->set_v3(v3); it->deriv_rho(p); - //printf("%f %f %f\n",h1,h2,h3); + it->set_metric(m); } } -double lpcvt::get_ratio(SPoint2 point){ +double lpcvt::get_ratio(GFace* gf,SPoint2 point){ double val; double uv[2]; - double metric[3]; + double tab[3]; uv[0] = point.x(); uv[1] = point.y(); - buildMetric(work_around,uv,metric); - val = 1.0/pow(metric[0]*metric[2]-metric[1]*metric[1],0.25); + buildMetric(gf,uv,tab); + val = 1.0/pow(tab[0]*tab[2]-tab[1]*tab[1],0.25); return val; } @@ -1214,10 +1111,10 @@ void lpcvt::eval(DocRecord& triangulator,std::vector<SVector3>& gradients,double C1 = v2.get_point(); C2 = v3.get_point(); index = v1.get_index1(); - energy = energy + F(*it,p,index); - gradients[index] = gradients[index] + simple(*it,p,index); - grad1 = dF_dC1(*it,p,index); - grad2 = dF_dC2(*it,p,index); + energy = energy + F(*it,p); + gradients[index] = gradients[index] + simple(*it,p); + grad1 = dF_dC1(*it,p); + grad2 = dF_dC2(*it,p); if(v2.get_index3()!=-1){ index1 = v2.get_index1(); index2 = v2.get_index2(); @@ -1265,9 +1162,11 @@ void lpcvt::swap(){ voronoi_vertex vertex; std::list<voronoi_element>::iterator it; for(it=clipped.begin();it!=clipped.end();it++){ - vertex = it->get_v3(); - it->set_v3(it->get_v2()); - it->set_v2(vertex); + if(J(it->get_v1().get_point(),it->get_v2().get_point(),it->get_v3().get_point())<0.0){ + vertex = it->get_v3(); + it->set_v3(it->get_v2()); + it->set_v2(vertex); + } } } @@ -1278,7 +1177,7 @@ void lpcvt::get_gauss(){ gauss_num = gauss_points.size1(); } -double lpcvt::F(voronoi_element element,int p,int index){ +double lpcvt::F(voronoi_element element,int p){ int i; double u; double v; @@ -1289,6 +1188,7 @@ double lpcvt::F(voronoi_element element,int p,int index){ double rho; SPoint2 point,generator,C1,C2; voronoi_vertex v1,v2,v3; + metric m; v1 = element.get_v1(); v2 = element.get_v2(); @@ -1297,6 +1197,7 @@ double lpcvt::F(voronoi_element element,int p,int index){ C1 = v2.get_point(); C2 = v3.get_point(); energy = 0.0; + m = element.get_metric(); for(i=0;i<gauss_num;i++){ u = gauss_points(i,0); @@ -1306,13 +1207,13 @@ double lpcvt::F(voronoi_element element,int p,int index){ point = SPoint2(x,y); weight = gauss_weights(i,0); rho = element.get_rho(u,v,p); - energy = energy + weight*rho*f(generator,point,p,index); + energy = energy + weight*rho*f(generator,point,m,p); } energy = J(generator,C1,C2)*energy; return energy; } -SVector3 lpcvt::simple(voronoi_element element,int p,int index){ +SVector3 lpcvt::simple(voronoi_element element,int p){ int i; double u; double v; @@ -1325,6 +1226,7 @@ SVector3 lpcvt::simple(voronoi_element element,int p,int index){ double jacobian; SPoint2 point,generator,C1,C2; voronoi_vertex v1,v2,v3; + metric m; v1 = element.get_v1(); v2 = element.get_v2(); @@ -1335,6 +1237,7 @@ SVector3 lpcvt::simple(voronoi_element element,int p,int index){ comp_x = 0.0; comp_y = 0.0; jacobian = J(generator,C1,C2); + m = element.get_metric(); for(i=0;i<gauss_num;i++){ u = gauss_points(i,0); @@ -1344,15 +1247,15 @@ SVector3 lpcvt::simple(voronoi_element element,int p,int index){ point = SPoint2(x,y); weight = gauss_weights(i,0); rho = element.get_rho(u,v,p); - comp_x = comp_x + weight*rho*df_dx(generator,point,p,index); - comp_y = comp_y + weight*rho*df_dy(generator,point,p,index); + comp_x = comp_x + weight*rho*df_dx(generator,point,m,p); + comp_y = comp_y + weight*rho*df_dy(generator,point,m,p); } comp_x = jacobian*comp_x; comp_y = jacobian*comp_y; return SVector3(comp_x,comp_y,0.0); } -SVector3 lpcvt::dF_dC1(voronoi_element element,int p,int index){ +SVector3 lpcvt::dF_dC1(voronoi_element element,int p){ int i; double u; double v; @@ -1367,6 +1270,7 @@ SVector3 lpcvt::dF_dC1(voronoi_element element,int p,int index){ double jacobian; SPoint2 point,generator,C1,C2; voronoi_vertex v1,v2,v3; + metric m; v1 = element.get_v1(); v2 = element.get_v2(); @@ -1377,6 +1281,7 @@ SVector3 lpcvt::dF_dC1(voronoi_element element,int p,int index){ comp_x = 0.0; comp_y = 0.0; jacobian = J(generator,C1,C2); + m = element.get_metric(); for(i=0;i<gauss_num;i++){ u = gauss_points(i,0); @@ -1388,17 +1293,17 @@ SVector3 lpcvt::dF_dC1(voronoi_element element,int p,int index){ rho = element.get_rho(u,v,p); drho_dx = element.get_drho_dx(); drho_dy = element.get_drho_dy(); - comp_x = comp_x + weight*rho*df_dx(point,generator,p,index)*u*jacobian; - comp_x = comp_x + weight*rho*f(point,generator,p,index)*(C2.y()-generator.y()); - comp_x = comp_x + weight*drho_dx*u*f(point,generator,p,index)*jacobian; - comp_y = comp_y + weight*rho*df_dy(point,generator,p,index)*u*jacobian; - comp_y = comp_y + weight*rho*f(point,generator,p,index)*(generator.x()-C2.x()); - comp_y = comp_y + weight*drho_dy*u*f(point,generator,p,index)*jacobian; + comp_x = comp_x + weight*rho*df_dx(point,generator,m,p)*u*jacobian; + comp_x = comp_x + weight*rho*f(point,generator,m,p)*(C2.y()-generator.y()); + comp_x = comp_x + weight*drho_dx*u*f(point,generator,m,p)*jacobian; + comp_y = comp_y + weight*rho*df_dy(point,generator,m,p)*u*jacobian; + comp_y = comp_y + weight*rho*f(point,generator,m,p)*(generator.x()-C2.x()); + comp_y = comp_y + weight*drho_dy*u*f(point,generator,m,p)*jacobian; } return SVector3(comp_x,comp_y,0.0); } -SVector3 lpcvt::dF_dC2(voronoi_element element,int p,int index){ +SVector3 lpcvt::dF_dC2(voronoi_element element,int p){ int i; double u; double v; @@ -1413,6 +1318,7 @@ SVector3 lpcvt::dF_dC2(voronoi_element element,int p,int index){ double jacobian; SPoint2 point,generator,C1,C2; voronoi_vertex v1,v2,v3; + metric m; v1 = element.get_v1(); v2 = element.get_v2(); @@ -1423,6 +1329,7 @@ SVector3 lpcvt::dF_dC2(voronoi_element element,int p,int index){ comp_x = 0.0; comp_y = 0.0; jacobian = J(generator,C1,C2); + m = element.get_metric(); for(i=0;i<gauss_num;i++){ u = gauss_points(i,0); @@ -1434,17 +1341,17 @@ SVector3 lpcvt::dF_dC2(voronoi_element element,int p,int index){ rho = element.get_rho(u,v,p); drho_dx = element.get_drho_dx(); drho_dy = element.get_drho_dy(); - comp_x = comp_x + weight*rho*df_dx(point,generator,p,index)*v*jacobian; - comp_x = comp_x + weight*rho*f(point,generator,p,index)*(generator.y()-C1.y()); - comp_x = comp_x + weight*drho_dx*v*f(point,generator,p,index)*jacobian; - comp_y = comp_y + weight*rho*df_dy(point,generator,p,index)*v*jacobian; - comp_y = comp_y + weight*rho*f(point,generator,p,index)*(C1.x()-generator.x()); - comp_y = comp_y + weight*drho_dy*v*f(point,generator,p,index)*jacobian; + comp_x = comp_x + weight*rho*df_dx(point,generator,m,p)*v*jacobian; + comp_x = comp_x + weight*rho*f(point,generator,m,p)*(generator.y()-C1.y()); + comp_x = comp_x + weight*drho_dx*v*f(point,generator,m,p)*jacobian; + comp_y = comp_y + weight*rho*df_dy(point,generator,m,p)*v*jacobian; + comp_y = comp_y + weight*rho*f(point,generator,m,p)*(C1.x()-generator.x()); + comp_y = comp_y + weight*drho_dy*v*f(point,generator,m,p)*jacobian; } return SVector3(comp_x,comp_y,0.0); } -double lpcvt::f(SPoint2 p1,SPoint2 p2,int p,int index){ +double lpcvt::f(SPoint2 p1,SPoint2 p2,metric m,int p){ double x1; double y1; double x2; @@ -1456,13 +1363,11 @@ double lpcvt::f(SPoint2 p1,SPoint2 p2,int p,int index){ double b; double c; double d; - metric m; x1 = p1.x(); y1 = p1.y(); x2 = p2.x(); y2 = p2.y(); - m = metrics[index]; a = m.get_a(); b = m.get_b(); c = m.get_c(); @@ -1473,7 +1378,7 @@ double lpcvt::f(SPoint2 p1,SPoint2 p2,int p,int index){ return val; } -double lpcvt::df_dx(SPoint2 p1,SPoint2 p2,int p,int index){ +double lpcvt::df_dx(SPoint2 p1,SPoint2 p2,metric m,int p){ double x1; double y1; double x2; @@ -1485,13 +1390,11 @@ double lpcvt::df_dx(SPoint2 p1,SPoint2 p2,int p,int index){ double b; double c; double d; - metric m; x1 = p1.x(); y1 = p1.y(); x2 = p2.x(); y2 = p2.y(); - m = metrics[index]; a = m.get_a(); b = m.get_b(); c = m.get_c(); @@ -1502,7 +1405,7 @@ double lpcvt::df_dx(SPoint2 p1,SPoint2 p2,int p,int index){ return val; } -double lpcvt::df_dy(SPoint2 p1,SPoint2 p2,int p,int index){ +double lpcvt::df_dy(SPoint2 p1,SPoint2 p2,metric m,int p){ double x1; double y1; double x2; @@ -1514,13 +1417,11 @@ double lpcvt::df_dy(SPoint2 p1,SPoint2 p2,int p,int index){ double b; double c; double d; - metric m; x1 = p1.x(); y1 = p1.y(); x2 = p2.x(); y2 = p2.y(); - m = metrics[index]; a = m.get_a(); b = m.get_b(); c = m.get_c(); @@ -1594,6 +1495,53 @@ SVector3 lpcvt::boundary_dFdx0(SVector3 dFdC,SPoint2 C,SPoint2 x0,SPoint2 x1,SVe +/****************class metric****************/ + +metric::metric(double new_a,double new_b,double new_c,double new_d){ + a = new_a; + b = new_b; + c = new_c; + d = new_d; +} + +metric::metric(){} + +metric::~metric(){} + +void metric::set_a(double new_a){ + a = new_a; +} + +void metric::set_b(double new_b){ + b = new_b; +} + +void metric::set_c(double new_c){ + c = new_c; +} + +void metric::set_d(double new_d){ + d = new_d; +} + +double metric::get_a(){ + return a; +} + +double metric::get_b(){ + return b; +} + +double metric::get_c(){ + return c; +} + +double metric::get_d(){ + return d; +} + + + /****************class voronoi_vertex****************/ voronoi_vertex::voronoi_vertex(SPoint2 new_point){ @@ -1714,6 +1662,10 @@ double voronoi_element::get_drho_dy(){ return drho_dy; } +metric voronoi_element::get_metric(){ + return m; +} + void voronoi_element::set_v1(voronoi_vertex new_v1){ v1 = new_v1; } @@ -1726,6 +1678,10 @@ void voronoi_element::set_v3(voronoi_vertex new_v3){ v3 = new_v3; } +void voronoi_element::set_metric(metric new_m){ + m = new_m; +} + void voronoi_element::deriv_rho(int p){ double h1; double h2; @@ -1881,53 +1837,6 @@ bool segment_list::add_segment(segment s){ -/****************class metric****************/ - -metric::metric(double new_a,double new_b,double new_c,double new_d){ - a = new_a; - b = new_b; - c = new_c; - d = new_d; -} - -metric::metric(){} - -metric::~metric(){} - -void metric::set_a(double new_a){ - a = new_a; -} - -void metric::set_b(double new_b){ - b = new_b; -} - -void metric::set_c(double new_c){ - c = new_c; -} - -void metric::set_d(double new_d){ - d = new_d; -} - -double metric::get_a(){ - return a; -} - -double metric::get_b(){ - return b; -} - -double metric::get_c(){ - return c; -} - -double metric::get_d(){ - return d; -} - - - /****************class wrapper****************/ wrapper::wrapper(){ diff --git a/Mesh/meshGFaceLloyd.h b/Mesh/meshGFaceLloyd.h index 18959a2566c2400c6af94be67e9e67ec425a15e4..2c8d6ee49b6308b0f7677f0cd8a51f26331c2091 100644 --- a/Mesh/meshGFaceLloyd.h +++ b/Mesh/meshGFaceLloyd.h @@ -44,9 +44,7 @@ class lpcvt{ std::vector<voronoi_cell> temp; fullMatrix<double> gauss_points; fullMatrix<double> gauss_weights; - std::vector<metric> metrics; int gauss_num; - GFace* work_around; public : lpcvt(); ~lpcvt(); @@ -78,20 +76,19 @@ class lpcvt{ void print_delaunay(DocRecord&); void print_segment(SPoint2,SPoint2,std::ofstream&); - void compute_metrics(DocRecord&); - void compute_parameters(int); - double get_ratio(SPoint2); + void compute_parameters(GFace*,int); + double get_ratio(GFace*,SPoint2); void write(DocRecord&,GFace*,int); void eval(DocRecord&,std::vector<SVector3>&,double&,int); void swap(); void get_gauss(); - double F(voronoi_element,int,int); - SVector3 simple(voronoi_element,int,int); - SVector3 dF_dC1(voronoi_element,int,int); - SVector3 dF_dC2(voronoi_element,int,int); - double f(SPoint2,SPoint2,int,int); - double df_dx(SPoint2,SPoint2,int,int); - double df_dy(SPoint2,SPoint2,int,int); + double F(voronoi_element,int); + SVector3 simple(voronoi_element,int); + SVector3 dF_dC1(voronoi_element,int); + SVector3 dF_dC2(voronoi_element,int); + double f(SPoint2,SPoint2,metric,int); + double df_dx(SPoint2,SPoint2,metric,int); + double df_dy(SPoint2,SPoint2,metric,int); double Tx(double,double,SPoint2,SPoint2,SPoint2); double Ty(double,double,SPoint2,SPoint2,SPoint2); double J(SPoint2,SPoint2,SPoint2); @@ -99,6 +96,23 @@ class lpcvt{ SVector3 boundary_dFdx0(SVector3,SPoint2,SPoint2,SPoint2,SVector3); }; +class metric{ + private : + double a,b,c,d; + public : + metric(double,double,double,double); + metric(); + ~metric(); + void set_a(double); + void set_b(double); + void set_c(double); + void set_d(double); + double get_a(); + double get_b(); + double get_c(); + double get_d(); +}; + class voronoi_vertex{ private : SPoint2 point; @@ -135,6 +149,7 @@ class voronoi_element{ voronoi_vertex v3; double drho_dx; double drho_dy; + metric m; public : voronoi_element(voronoi_vertex,voronoi_vertex,voronoi_vertex); voronoi_element(); @@ -145,9 +160,11 @@ class voronoi_element{ double get_rho(double,double,int); double get_drho_dx(); double get_drho_dy(); + metric get_metric(); void set_v1(voronoi_vertex); void set_v2(voronoi_vertex); void set_v3(voronoi_vertex); + void set_metric(metric); void deriv_rho(int); double compute_rho(double,int); }; @@ -194,23 +211,6 @@ class segment_list{ bool add_segment(segment); }; -class metric{ - private : - double a,b,c,d; - public : - metric(double,double,double,double); - metric(); - ~metric(); - void set_a(double); - void set_b(double); - void set_c(double); - void set_d(double); - double get_a(); - double get_b(); - double get_c(); - double get_d(); -}; - class wrapper{ private : int p; diff --git a/benchmarks/stl/mobilette.geo b/benchmarks/stl/mobilette.geo index 815b8b0f585d8e49fd8c37464c56406d4eb3a57b..b5242b188bdd69fea7ec7dfb159b2e8ad2425335 100644 --- a/benchmarks/stl/mobilette.geo +++ b/benchmarks/stl/mobilette.geo @@ -1,9 +1,10 @@ //Mesh.Algorithm = 8; //(1=MeshAdapt, 2=Automatic, 5=Delaunay, 6=Frontal, 7=bamg) -Mesh.CharacteristicLengthMin=1.5/2; -Mesh.CharacteristicLengthMax=2.5/2; +Mesh.CharacteristicLengthMin=1.5; +Mesh.CharacteristicLengthMax=2.5; Mesh.RemeshAlgorithm=1; Mesh.RemeshParametrization=1;//(0) harmonic (1) conformal - +Mesh.RecombinationAlgorithm=1; +Mesh.RecombineAll=1; // merge reclassified STL Merge "mobilette-class.msh";