PolygonMesh.cc

Go to the documentation of this file.
00001 #include <esg/mesh/PolygonMesh.h>
00002 
00003 using namespace esg;
00004 
00005 PolygonMesh::PolygonMesh(const Vertex3   val[],
00006                          const unsigned  index[],
00007                          int             nVert,
00008                          const Vertex3   normals[],
00009                          const unsigned  nindex[],
00010                          const Vector3&  normal,
00011                          float           dr)
00012 {
00013     Vert  *V1, *V2, *V;
00014     Plane *F;
00015     Edge  *E;
00016 
00017     if (nVert == 0) {
00018         fprintf(stderr,"PolygonMesh Error: Polygon without vertices\n");
00019         return;
00020     }
00021 
00022     F = MF(normal.x, normal.y, normal.z, -dr);
00023     V1 = MV(val[index[0]].x, val[index[0]].y, val[index[0]].z);
00024     if (normals && nindex)  // set vertex normal if any
00025         V1->normal.set(normals[nindex[0]]);
00026     else
00027         V1->normal.set(normal);
00028     pSolid = MVSF(F,V1);
00029     V = V1; // store first vertex
00030 
00031     for (register int i = 1; i < nVert; i++) {
00032         V2 = MV(val[index[i%nVert]].x,
00033                 val[index[i%nVert]].y,
00034                 val[index[i%nVert]].z);
00035         if (normals && nindex)   // set vertex normal if any
00036             V2->normal.set(normals[nindex[0]]);
00037         MEV(pSolid, V1, V2, &E, F);
00038         V1 = V2;
00039     }
00040     MEF(pSolid, V1, V, F, F, &E);
00041 }
00042 
00043 
00044 Mesh::Solid* PolygonMesh::cut(float ar, float br, float cr, float dr)
00045 {
00046   int pozit, negat;
00047   Solid* pRet;
00048 
00049   if (!pSolid) return NULL;
00050   Vertex_Plane_position(*pSolid, ar, br, cr, dr, pozit, negat);
00051   if (pozit == 0) return NULL;
00052   if (negat == 0) {
00053     pRet = pSolid;
00054     pSolid = NULL;
00055     return pRet;
00056   }
00057 
00058   pRet = new Solid;
00059   Copy_solid(pSolid, pRet);
00060 
00061   Edge* pEdgeA = pSolid->first_edge;
00062   Edge* pEdgeB = pRet->first_edge;
00063   Edge* pTmp;
00064   Vert* pNewV;
00065   Edge* pNewE;
00066 
00067   do {  // Add points of intersection to polygon
00068     if (pEdgeA->V2->fxyz < 0) {
00069       if (pEdgeA->V1->fxyz > 0) {
00070         pNewV = Vertex_of_cut(pEdgeA->V1, pEdgeA->V2);
00071         SEMV(pSolid, pEdgeA, pNewV, &pNewE);
00072         pEdgeA = pNewE;
00073         pNewV = Vertex_of_cut(pEdgeB->V1, pEdgeB->V2);
00074         SEMV(pRet, pEdgeB, pNewV, &pNewE);
00075         pEdgeB = pNewE;
00076       }
00077     }
00078     else if (pEdgeA->V2->fxyz > 0) { 
00079       if (pEdgeA->V1->fxyz < 0) {
00080         pNewV = Vertex_of_cut(pEdgeA->V1, pEdgeA->V2);
00081         SEMV(pSolid, pEdgeA, pNewV, &pNewE);
00082         pEdgeA = pNewE;
00083         pNewV = Vertex_of_cut(pEdgeB->V1, pEdgeB->V2);
00084         SEMV(pRet, pEdgeB, pNewV, &pNewE);
00085         pEdgeB = pNewE;
00086       }
00087     }
00088     
00089     pEdgeA = pEdgeA->next_edge;
00090     pEdgeB = pEdgeB->next_edge;
00091   } while (pEdgeA != pSolid->first_edge);
00092 
00093   pEdgeA = pSolid->first_edge;
00094   pEdgeB = pRet->first_edge;
00095 
00096   do { // Delete edges outside (inside) half-space
00097     if (pEdgeA->V1->fxyz >= 0 && pEdgeA->V2->fxyz >= 0) {
00098       pTmp = pEdgeA->next_edge;
00099       DeleteEdge(pSolid, pEdgeA);
00100       pEdgeA = pTmp;
00101     }
00102     else pEdgeA = pEdgeA->next_edge;
00103     
00104     if (pEdgeB->V1->fxyz <= 0 && pEdgeB->V2->fxyz <= 0) {
00105       pTmp = pEdgeB->next_edge;
00106       DeleteEdge(pRet, pEdgeB);
00107       pEdgeB = pTmp;
00108     }
00109     else pEdgeB = pEdgeB->next_edge;
00110   } while (pEdgeA != pSolid->first_edge);
00111 
00112   return pRet;
00113 }

Generated on Wed Jun 28 12:24:32 2006 for esg by  doxygen 1.4.6