diff --git a/Numeric/DivideAndConquer.cpp b/Numeric/DivideAndConquer.cpp index 0fb8ed5c9c5206cb17092a138ffd9a9a7a626db7..12ff281e2a907062ff16048e59d71069c2ca5c47 100644 --- a/Numeric/DivideAndConquer.cpp +++ b/Numeric/DivideAndConquer.cpp @@ -21,7 +21,6 @@ #include "robustPredicates.h" #include "BackgroundMesh.h" -// FIXME: should not introduce dependencies to Geo/ code in Numeric! #include "GPoint.h" #include "GFace.h" #include "GEdgeCompound.h" @@ -167,16 +166,16 @@ int DocRecord::Qtest(PointNumero h, PointNumero i, PointNumero j, PointNumero k) "or Mesh.RandomFactor"); return 0; } - + double pa[2] = {(double)points[h].where.h, (double)points[h].where.v}; double pb[2] = {(double)points[i].where.h, (double)points[i].where.v}; double pc[2] = {(double)points[j].where.h, (double)points[j].where.v}; double pd[2] = {(double)points[k].where.h, (double)points[k].where.v}; - // we use robust predicates here - double result = robustPredicates::incircle(pa, pb, pc, pd) * + // we use robust predicates here + double result = robustPredicates::incircle(pa, pb, pc, pd) * robustPredicates::orient2d(pa, pb, pc); - + return (result < 0) ? 1 : 0; } @@ -516,20 +515,20 @@ void DocRecord::ConvertDListToVoronoiData() { if (_adjacencies){ for(int i = 0; i < numPoints; i++) - if (_adjacencies[i].t) + if (_adjacencies[i].t) delete [] _adjacencies[i].t; delete [] _adjacencies; - } + } if (_hull)delete [] _hull; _hullSize = CountPointsOnHull (); _hull = new PointNumero[_hullSize]; ConvexHull(); std::sort(_hull, _hull+_hullSize); _adjacencies = new STriangle[numPoints]; - - for(PointNumero i = 0; i < numPoints; i++) + + for(PointNumero i = 0; i < numPoints; i++) _adjacencies[i].t = ConvertDlistToArray(&points[i].adjacent, - &_adjacencies[i].t_length); + &_adjacencies[i].t_length); } void DocRecord::voronoiCell(PointNumero pt, std::vector<SPoint2> &pts) const @@ -552,16 +551,16 @@ void DocRecord::voronoiCell(PointNumero pt, std::vector<SPoint2> &pts) const /* Consider N points {X_1, \dots, X_N}. We want to find the point X_P that verifies - + min max | X_i - X_P | , i=1,\dots,N L2 norm - min \int_V || X - X_P||^2 dv + min \int_V || X - X_P||^2 dv - => 2 \int_V || X - X_P|| dv = 0 => X_P is the centroid + => 2 \int_V || X - X_P|| dv = 0 => X_P is the centroid - min \int_V || X - X_P||^{2m} dv + min \int_V || X - X_P||^{2m} dv => 2 \int_V || X - X_P||^{2m-1} dv = 0 => X_P is somewhere ... @@ -599,14 +598,14 @@ void DocRecord::makePosView(std::string fileName, GFace *gf) fprintf(f,"SP(%g,%g,%g) {%g};\n",pc[0],pc[1],0.0,-(double)i); } } - fprintf(f,"};\n"); + fprintf(f,"};\n"); } fclose(f); } void DocRecord::printMedialAxis(Octree *_octree, std::string fileName, GFace *gf, GEdge *ge) { - + FILE *f = fopen(fileName.c_str(),"w"); if (_adjacencies){ fprintf(f,"View \"medial axis\" {\n"); @@ -647,7 +646,7 @@ void DocRecord::printMedialAxis(Octree *_octree, std::string fileName, GFace *gf } } } - fprintf(f,"};\n"); + fprintf(f,"};\n"); } fclose(f); @@ -657,10 +656,10 @@ void centroidOfOrientedBox(std::vector<SPoint2> &pts, const double &angle, double &xc, double &yc, double &inertia, double &area) { const int N = pts.size(); - + double sina = sin(angle); double cosa = cos(angle); - + double xmin = cosa* pts[0].x()+ sina*pts[0].y(); double xmax = cosa* pts[0].x()+ sina*pts[0].y(); double ymin = -sina* pts[0].x()+ cosa*pts[0].y(); @@ -689,7 +688,7 @@ void centroidOfPolygon(SPoint2 &pc, std::vector<SPoint2> &pts, for (unsigned int j = 0; j < pts.size(); j++){ SPoint2 &pa = pts[j]; SPoint2 &pb = pts[(j+1)%pts.size()]; - const double area = triangle_area2d(pa,pb,pc); + const double area = triangle_area2d(pa,pb,pc); const double lc = bgm ? (*bgm)((pa.x()+pb.x()+pc.x())/3.0, (pa.y()+pb.y()+pc.y())/3.0, 0.0) : 1.0; @@ -703,16 +702,16 @@ void centroidOfPolygon(SPoint2 &pc, std::vector<SPoint2> &pts, for (unsigned int j = 0; j < pts.size(); j++){ SPoint2 &pa = pts[j]; SPoint2 &pb = pts[(j+1)%pts.size()]; - const double area = triangle_area2d(pa,pb,pc); - - const double b = sqrt ( (pa.x()-pb.x())*(pa.x()-pb.x()) + + const double area = triangle_area2d(pa,pb,pc); + + const double b = sqrt ( (pa.x()-pb.x())*(pa.x()-pb.x()) + (pa.y()-pb.y())*(pa.y()-pb.y()) ); const double h = 2.0 * area / b; const double a = fabs((pb.x()-pa.x())*(pc.x()-pa.x())* (pb.y()-pa.y())*(pc.y()-pa.y()))/b; - + const double j2 = (h*b*b*b + h*a*b*b + h*a*a*b + b*h*h*h) / 12.0; - + center = (pa+pb+pc) * (1.0/3.0); const SPoint2 dx = x - center; inertia += j2 + area*area*(dx.x()+dx.x()+dx.y()*dx.y()); @@ -728,19 +727,19 @@ double DocRecord::Lloyd(int type) for(PointNumero i = 0; i < numPoints; i++) { PointRecord &pt = points[i]; std::vector<SPoint2> pts; - voronoiCell (i,pts); + voronoiCell (i,pts); double E, A; - + if (!points[i].data){ SPoint2 p (pt.where.h,pt.where.v); - if (type == 0) - centroidOfPolygon (p,pts, cgs(i,0), cgs(i,1),E, A); - else - centroidOfOrientedBox (pts, 0.0, cgs(i,0),cgs(i,1),E, A); + if (type == 0) + centroidOfPolygon (p,pts, cgs(i,0), cgs(i,1),E, A); + else + centroidOfOrientedBox (pts, 0.0, cgs(i,0),cgs(i,1),E, A); } inertia_tot += E; - } - + } + for(PointNumero i = 0; i < numPoints; i++) { if (!points[i].data){ points[i].where.h = cgs(i,0); @@ -819,7 +818,7 @@ void DocRecord::RemoveAllDList() } } -DocRecord::DocRecord(int n) +DocRecord::DocRecord(int n) : _hullSize(0), _hull(NULL), _adjacencies(NULL), numPoints(n), points(NULL), numTriangles(0), triangles(NULL) { @@ -855,14 +854,14 @@ void DocRecord::Voronoi() } void DocRecord::setPoints(fullMatrix<double> *p) -{ +{ if (numPoints != p->size1())throw; for (int i = 0; i < p->size1(); i++){ x(i) = (*p)(i, 0); y(i) = (*p)(i, 1); data(i) = (*p)(i, 2) < 0 ? (void *) 1 : NULL; } -} +} void DocRecord::recur_tag_triangles(int iTriangle, std::set<int>& taggedTriangles, @@ -870,26 +869,26 @@ void DocRecord::recur_tag_triangles(int iTriangle, std::set<int>& taggedTriangle std::pair<int,int> > &edgesToTriangles) { if(taggedTriangles.find(iTriangle) != taggedTriangles.end()) return; - + taggedTriangles.insert(iTriangle); int a = triangles[iTriangle].a; int b = triangles[iTriangle].b; int c = triangles[iTriangle].c; PointRecord* p[3] = {&points[a], &points[b], &points[c]}; - + for(int j=0;j<3;j++){ if(!lookForBoundaryEdge(p[j]->data, p[(j + 1) % 3]->data)){ std::pair<void*,void*> ab = std::make_pair (std::min(p[j]->data, p[(j + 1) % 3]->data), std::max(p[j]->data, p[(j + 1) % 3]->data)); std::pair<int,int>& adj = (edgesToTriangles.find(ab))->second; - if(iTriangle == adj.first && adj.second != -1) + if(iTriangle == adj.first && adj.second != -1) recur_tag_triangles(adj.second, taggedTriangles, edgesToTriangles); else recur_tag_triangles(adj.first, taggedTriangles, edgesToTriangles); } - } + } } std::set<int> DocRecord::tagInterior(double x, double y) @@ -901,7 +900,7 @@ std::set<int> DocRecord::tagInterior(double x, double y) int b = triangles[i].b; int c = triangles[i].c; PointRecord* p[3] = {&points[a],&points[b],&points[c]}; - + //Weisstein, Eric W. "Triangle Interior." From MathWorld--A Wolfram Web Resource. double x0 = points[a].where.h; double y0 = points[a].where.v; @@ -909,14 +908,14 @@ std::set<int> DocRecord::tagInterior(double x, double y) double y1 = points[b].where.v - points[a].where.v; double x2 = points[c].where.h - points[a].where.h; double y2 = points[c].where.v - points[a].where.v; - double k1 = ((x*y2-x2*y)-(x0*y2-x2*y0))/(x1*y2-x2*y1); + double k1 = ((x*y2-x2*y)-(x0*y2-x2*y0))/(x1*y2-x2*y1); double k2 = -((x*y1-x1*y)-(x0*y1-x1*y0))/(x1*y2-x2*y1); if(k1>0.0 && k2>0.0 && k1+k2<1.0) iFirst = i; for(int j=0;j<3;j++){ std::pair<void*,void*> ab = std::make_pair - (std::min(p[j]->data, p[(j + 1) % 3]->data), + (std::min(p[j]->data, p[(j + 1) % 3]->data), std::max(p[j]->data, p[(j + 1) % 3]->data)); - std::map<std::pair<void*,void*>, std::pair<int,int> >::iterator it = + std::map<std::pair<void*,void*>, std::pair<int,int> >::iterator it = edgesToTriangles.find(ab); if(it == edgesToTriangles.end()){ edgesToTriangles[ab] = std::make_pair(i, -1); @@ -931,8 +930,8 @@ std::set<int> DocRecord::tagInterior(double x, double y) return taggedTriangles; } -void DocRecord::concave(double x,double y,GFace* gf){ - int i; +void DocRecord::concave(double x,double y,GFace* gf) +{ int index1; int index2; int index3; @@ -944,12 +943,12 @@ void DocRecord::concave(double x,double y,GFace* gf){ std::list<GEdge*>::iterator it1; std::set<int> set; std::set<int>::iterator it2; - + list = gf->edges(); replaceMeshCompound(gf,list); for(it1 = list.begin(); it1 != list.end(); it1++){ edge = *it1; - for(i=0;i<edge->getNumMeshElements();i++){ + for(unsigned int i = 0; i < edge->getNumMeshElements(); i++){ element = edge->getMeshElement(i); vertex1 = element->getVertex(0); vertex2 = element->getVertex(1); @@ -957,10 +956,10 @@ void DocRecord::concave(double x,double y,GFace* gf){ } } - for(i = 0;i < numPoints; i++){ + for(int i = 0; i < numPoints; i++){ points[i].vicinity.clear(); } - + MakeMeshWithPoints(); set = tagInterior(x,y); for(it2 = set.begin(); it2 != set.end(); it2++){ @@ -976,18 +975,18 @@ void DocRecord::concave(double x,double y,GFace* gf){ } } -bool DocRecord::contain(int index1,int index2,int index3){ - int i; +bool DocRecord::contain(int index1,int index2,int index3) +{ void* dataA; void* dataB; dataA = points[index2].data; dataB = points[index3].data; - for(i = 0; i < points[index1].vicinity.size() - 1; i = i+2){ - if(points[index1].vicinity[i] == dataA && + for(unsigned int i = 0; i < points[index1].vicinity.size() - 1; i = i+2){ + if(points[index1].vicinity[i] == dataA && points[index1].vicinity[i + 1] == dataB){ return 1; } - else if(points[index1].vicinity[i] == dataB && + else if(points[index1].vicinity[i] == dataB && points[index1].vicinity[i + 1] == dataA){ return 1; } @@ -995,20 +994,22 @@ bool DocRecord::contain(int index1,int index2,int index3){ return 0; } -void DocRecord::add(int index1,int index2){ +void DocRecord::add(int index1,int index2) +{ void* data; data = points[index2].data; points[index1].vicinity.push_back(data); } -void DocRecord::initialize(){ - int i; - for(i = 0; i < numPoints; i++){ +void DocRecord::initialize() +{ + for(int i = 0; i < numPoints; i++){ points[i].flag = 0; } } -bool DocRecord::remove_point(int index){ +bool DocRecord::remove_point(int index) +{ if(points[index].flag == 0){ points[index].flag = 1; return 1; @@ -1016,20 +1017,17 @@ bool DocRecord::remove_point(int index){ else return 0; } -void DocRecord::remove_all(){ - int i; - int index; - int numPoints2; - PointRecord* points2; - numPoints2 = 0; - for(i = 0; i < numPoints; i++){ +void DocRecord::remove_all() +{ + int numPoints2 = 0; + for(int i = 0; i < numPoints; i++){ if(points[i].flag == 0){ numPoints2++; } } - points2 = new PointRecord[numPoints2]; - index = 0; - for(i = 0; i < numPoints; i++){ + PointRecord *points2 = new PointRecord[numPoints2]; + int index = 0; + for(int i = 0; i < numPoints; i++){ if(points[i].flag == 0){ points2[index].where.h = points[i].where.h; points2[index].where.v = points[i].where.v; @@ -1044,60 +1042,47 @@ void DocRecord::remove_all(){ numPoints = numPoints2; } -void DocRecord::add_point(double x,double y,GFace*face){ +void DocRecord::add_point(double x,double y,GFace*face) +{ PointRecord point; point.where.h = x; - point.where.v = y; + point.where.v = y; point.data = new MVertex(x, y, 0.0, (GEntity*)face, 2); points[numPoints] = point; numPoints = numPoints + 1; } -void DocRecord::build_edges(){ - int i; - int j; - int num; - int index; - MVertex* vertex1; - MVertex* vertex2; - - for( i = 0; i < numPoints; i++){ - vertex1 = (MVertex*)points[i].data; - num = _adjacencies[i].t_length; - for(j = 0; j < num; j++){ - index = _adjacencies[i].t[j]; - vertex2 = (MVertex*)points[index].data; +void DocRecord::build_edges() +{ + for(int i = 0; i < numPoints; i++){ + MVertex *vertex1 = (MVertex*)points[i].data; + int num = _adjacencies[i].t_length; + for(int j = 0; j < num; j++){ + int index = _adjacencies[i].t[j]; + MVertex *vertex2 = (MVertex*)points[index].data; add_edge(vertex1, vertex2); } } } -void DocRecord::clear_edges(){ +void DocRecord::clear_edges() +{ mesh_edges.clear(); } -bool DocRecord::delaunay_conformity(GFace* gf){ - int i; - bool flag; - GEdge* edge; - MElement* element; - MVertex* vertex1; - MVertex* vertex2; - std::list<GEdge*> list; - std::list<GEdge*>::iterator it; - - list = gf->edges(); +bool DocRecord::delaunay_conformity(GFace* gf) +{ + std::list<GEdge*> list = gf->edges(); replaceMeshCompound(gf,list); - for(it = list.begin(); it!= list.end(); it++){ - edge = *it; - for(i = 0; i < edge->getNumMeshElements(); i++){ - element = edge->getMeshElement(i); - vertex1 = element->getVertex(0); - vertex2 = element->getVertex(1); - flag = find_edge(vertex1,vertex2); + for(std::list<GEdge*>::iterator it = list.begin(); it!= list.end(); it++){ + GEdge *edge = *it; + for(unsigned int i = 0; i < edge->getNumMeshElements(); i++){ + MElement *element = edge->getMeshElement(i); + MVertex *vertex1 = element->getVertex(0); + MVertex *vertex2 = element->getVertex(1); + bool flag = find_edge(vertex1,vertex2); if(!flag) return false; } } return 1; } - \ No newline at end of file diff --git a/Numeric/Numeric.cpp b/Numeric/Numeric.cpp index 1867dec2c35a502ab1db9fa0d8ae50ac963eab1a..5deca329eaf15e0c9b73a0ce19de5ef9a1b3e65c 100644 --- a/Numeric/Numeric.cpp +++ b/Numeric/Numeric.cpp @@ -1326,12 +1326,10 @@ void computeMeanPlaneSimple(const std::vector<SPoint3> &points, mean_plane &mean else{ meanPlane.z = meanPlane.d / meanPlane.c; } - - } +} void projectPointToPlane(const SPoint3 &pt, SPoint3 &ptProj, const mean_plane &meanPlane) { - double u = pt.x(); double v = pt.y(); double w = pt.z(); @@ -1344,33 +1342,30 @@ void projectPointToPlane(const SPoint3 &pt, SPoint3 &ptProj, const mean_plane &m ptProj[0] = u + a*t0; ptProj[1] = v + b*t0; ptProj[2] = w + c*t0; - } -void projectPointsToPlane(const std::vector<SPoint3> &pts, std::vector<SPoint3> &ptsProj, const mean_plane &meanPlane) +void projectPointsToPlane(const std::vector<SPoint3> &pts, std::vector<SPoint3> &ptsProj, + const mean_plane &meanPlane) { - ptsProj.resize(pts.size()); - for (int i= 0; i< pts.size(); i++){ + for (unsigned int i= 0; i< pts.size(); i++){ projectPointToPlane(pts[i],ptsProj[i], meanPlane); } - } -void transformPointsIntoOrthoBasis(const std::vector<SPoint3> &ptsProj, std::vector<SPoint3> &pointsUV, +void transformPointsIntoOrthoBasis(const std::vector<SPoint3> &ptsProj, + std::vector<SPoint3> &pointsUV, const SPoint3 &ptCG, const mean_plane &meanPlane) { - pointsUV.resize(ptsProj.size()); SVector3 normal(meanPlane.a, meanPlane.b, meanPlane.c); SVector3 tangent, binormal; buildOrthoBasis(normal, tangent, binormal); - for (int i= 0; i< ptsProj.size(); i++){ + for (unsigned int i= 0; i< ptsProj.size(); i++){ SVector3 pp(ptsProj[i][0]-ptCG[0],ptsProj[i][1]-ptCG[1],ptsProj[i][2]-ptCG[2]) ; pointsUV[i][0] = dot(pp, tangent); pointsUV[i][1] = dot(pp, binormal); pointsUV[i][2] = dot(pp, normal); } - }