diff --git a/Common/SmoothNormals.h b/Common/SmoothNormals.h index 0a3a30262850028133bd268507591e4e39fe88f8..726ef61a03b7247ffce105f4fd0c7833eda27d53 100644 --- a/Common/SmoothNormals.h +++ b/Common/SmoothNormals.h @@ -20,7 +20,6 @@ // // Please report all bugs and problems to <gmsh@geuz.org>. -#include <set> using namespace std; @@ -55,6 +54,7 @@ struct lessthanxyzv } }; +#include <set> typedef set < xyzv, lessthanxyzv > xyzcont; typedef xyzcont::const_iterator xyziter; diff --git a/Graphics/Entity.cpp b/Graphics/Entity.cpp index 234f6ff711aa51ac5e9cdf87ba9cd7e11ee2ce24..b233c8ccf0fea45697d1ea3876831b62ad9940c4 100644 --- a/Graphics/Entity.cpp +++ b/Graphics/Entity.cpp @@ -1,4 +1,4 @@ -// $Id: Entity.cpp,v 1.46 2004-08-16 17:52:59 remacle Exp $ +// $Id: Entity.cpp,v 1.47 2004-09-14 10:33:37 remacle Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -19,15 +19,106 @@ // // Please report all bugs and problems to <gmsh@geuz.org>. + +#include "Mesh.h" #include "Gmsh.h" #include "GmshUI.h" #include "Numeric.h" -#include "Mesh.h" #include "Draw.h" #include "Context.h" - extern Context_T CTX; +class point{ +public: + double x, y, z; + bool valid; + point() : x(0.), y(0.), z(0.), valid(false) {;}; + point(double xi, double yi, double zi) : + x(xi), y(yi), z(zi), valid(true) {;}; +}; + +class plane{ +private: + double _a, _b, _c, _d; +public: + plane(double a, double b, double c, double d) : + _a(a), _b(b), _c(c), _d(d) {;}; + double val(point &p){ + return _a*p.x + _b*p.y + _c*p.z + _d; + }; + point intersect(point &p1, point &p2){ + double v1 = val(p1), v2 = val(p2); + if(fabs(v1) < 1.e-12){ + if(fabs(v2) < 1.e-12) + return point(); + else + return point(p1.x, p1.y, p1.z); + } + else if(fabs(v2) < 1.e-12){ + return point(p2.x, p2.y, p2.z); + } + else if(v1 * v2 < 0.){ + double coef = - v1 / (v2 - v1); + return point(coef * (p2.x - p1.x) + p1.x, + coef * (p2.y - p1.y) + p1.y, + coef * (p2.z - p1.z) + p1.z); + } + else + return point(); + }; +}; + +void Draw_PlaneInBoundingBox(double xmin, double ymin, double zmin, + double xmax, double ymax, double zmax, + double a, double b, double c, double d) +{ + + plane pl(a, b, c, d); + point p1(xmin, ymin, zmin), p2(xmax, ymin, zmin); + point p3(xmax, ymax, zmin), p4(xmin, ymax, zmin); + point p5(xmin, ymin, zmax), p6(xmax, ymin, zmax); + point p7(xmax, ymax, zmax), p8(xmin, ymax, zmax); + + point edge[12]; + edge[0] = pl.intersect(p1, p2); + edge[1] = pl.intersect(p1, p4); + edge[2] = pl.intersect(p1, p5); + edge[3] = pl.intersect(p2, p3); + edge[4] = pl.intersect(p2, p6); + edge[5] = pl.intersect(p3, p4); + edge[6] = pl.intersect(p3, p7); + edge[7] = pl.intersect(p4, p8); + edge[8] = pl.intersect(p5, p6); + edge[9] = pl.intersect(p5, p8); + edge[10] = pl.intersect(p6, p7); + edge[11] = pl.intersect(p7, p8); + + int face[6][4] = { + {0, 2, 4, 8}, + {0, 1, 3, 5}, + {1, 2, 7, 9}, + {3, 4, 6, 10}, + {5, 6, 7, 11}, + {8, 9, 10, 11} + }; + + for(int i = 0; i < 6; i++){ + int nb = 0; + point p[4]; + for(int j = 0; j < 4; j++){ + if(edge[face[i][j]].valid == true) + p[nb++] = edge[face[i][j]]; + } + if(nb > 1){ + glColor3d(1.,0.,0.); + glBegin(GL_LINE_STRIP); + for(int j = 0; j < nb; j++) + glVertex3d(p[j].x, p[j].y, p[j].z); + glEnd(); + } + } +} + void Draw_Point(int type, double size, double *x, double *y, double *z, double Raise[3][8], int light) { @@ -63,6 +154,7 @@ void Draw_Sphere(double size, double x, double y, double z, int light) glDisable(GL_LIGHTING); } + void Draw_Disk(double size, double rint, double x, double y, double z, int light) { if(light) glEnable(GL_LIGHTING); @@ -290,6 +382,7 @@ void Draw_SimpleVector(int arrow, int fill, glDisable(GL_LIGHTING); } + void Draw_3DArrow(double relHeadRadius, double relStemLength, double relStemRadius, double x, double y, double z, double dx, double dy, double dz, double length, int light) @@ -386,92 +479,7 @@ void Draw_Vector(int Type, int Fill, } -void Draw_PlaneInBoundingBox(double xmin, double ymin, double zmin, - double xmax, double ymax, double zmax, - double a, double b, double c, double d) -{ - class point{ - public: - double x, y, z; - bool valid; - point() : x(0.), y(0.), z(0.), valid(false) {;}; - point(double xi, double yi, double zi) : - x(xi), y(yi), z(zi), valid(true) {;}; - }; - - class plane{ - private: - double _a, _b, _c, _d; - public: - plane(double a, double b, double c, double d) : - _a(a), _b(b), _c(c), _d(d) {;}; - double val(point &p){ - return _a*p.x + _b*p.y + _c*p.z + _d; - }; - point intersect(point &p1, point &p2){ - double v1 = val(p1), v2 = val(p2); - if(fabs(v1) < 1.e-12){ - if(fabs(v2) < 1.e-12) - return point(); - else - return point(p1.x, p1.y, p1.z); - } - else if(fabs(v2) < 1.e-12){ - return point(p2.x, p2.y, p2.z); - } - else if(v1 * v2 < 0.){ - double coef = - v1 / (v2 - v1); - return point(coef * (p2.x - p1.x) + p1.x, - coef * (p2.y - p1.y) + p1.y, - coef * (p2.z - p1.z) + p1.z); - } - else - return point(); - }; - }; - plane pl(a, b, c, d); - point p1(xmin, ymin, zmin), p2(xmax, ymin, zmin); - point p3(xmax, ymax, zmin), p4(xmin, ymax, zmin); - point p5(xmin, ymin, zmax), p6(xmax, ymin, zmax); - point p7(xmax, ymax, zmax), p8(xmin, ymax, zmax); - point edge[12]; - edge[0] = pl.intersect(p1, p2); - edge[1] = pl.intersect(p1, p4); - edge[2] = pl.intersect(p1, p5); - edge[3] = pl.intersect(p2, p3); - edge[4] = pl.intersect(p2, p6); - edge[5] = pl.intersect(p3, p4); - edge[6] = pl.intersect(p3, p7); - edge[7] = pl.intersect(p4, p8); - edge[8] = pl.intersect(p5, p6); - edge[9] = pl.intersect(p5, p8); - edge[10] = pl.intersect(p6, p7); - edge[11] = pl.intersect(p7, p8); - int face[6][4] = { - {0, 2, 4, 8}, - {0, 1, 3, 5}, - {1, 2, 7, 9}, - {3, 4, 6, 10}, - {5, 6, 7, 11}, - {8, 9, 10, 11} - }; - - for(int i = 0; i < 6; i++){ - int nb = 0; - point p[4]; - for(int j = 0; j < 4; j++){ - if(edge[face[i][j]].valid == true) - p[nb++] = edge[face[i][j]]; - } - if(nb > 1){ - glColor3d(1.,0.,0.); - glBegin(GL_LINE_STRIP); - for(int j = 0; j < nb; j++) - glVertex3d(p[j].x, p[j].y, p[j].z); - glEnd(); - } - } -} +