/** * Returns a new quad (convex) from the merge of two triangles that share the * vertex index v. * @param faceI mesh triangle * @param faceJ mesh triangle * @param v vertex index shared by both triangles * @return a new convex quad if the merge is possible */ BOP_Face* BOP_Merge::createQuad(BOP_Face3 *faceI, BOP_Face3 *faceJ, BOP_Index v) { BOP_Face *faceK = NULL; // Get faces data BOP_Index prevI, nextI, prevJ, nextJ; faceI->getNeighbours(v,prevI,nextI); faceJ->getNeighbours(v,prevJ,nextJ); MT_Point3 vertex = m_mesh->getVertex(v)->getPoint(); MT_Point3 vPrevI = m_mesh->getVertex(prevI)->getPoint(); MT_Point3 vNextI = m_mesh->getVertex(nextI)->getPoint(); MT_Point3 vPrevJ = m_mesh->getVertex(prevJ)->getPoint(); MT_Point3 vNextJ = m_mesh->getVertex(nextJ)->getPoint(); // Quad test if (prevI == nextJ) { if (!BOP_collinear(vNextI,vertex,vPrevJ) && !BOP_collinear(vNextI,vPrevI,vPrevJ) && BOP_convex(vertex,vNextI,vPrevI,vPrevJ)) { faceK = new BOP_Face4(v,nextI,prevI,prevJ,faceI->getPlane(),faceI->getOriginalFace()); faceK->setTAG(faceI->getTAG()); } } else if (nextI == prevJ) { if (!BOP_collinear(vPrevI,vertex,vNextJ) && !BOP_collinear(vPrevI,vNextI,vNextJ) && BOP_convex(vertex,vNextJ,vNextI,vPrevI)) { faceK = new BOP_Face4(v,nextJ,nextI,prevI,faceI->getPlane(),faceI->getOriginalFace()); faceK->setTAG(faceI->getTAG()); } } return faceK; }
/** * Returns a new face (quad or triangle) from the merge of one quad and one * triangle that share the vertex v and come from the same original face. * @param faceI mesh quad * @param faceJ mesh triangle * @param pending vector with pending vertices (required to merge one quad * and one triangle into a new triangle; it supposes to remove two vertexs, * v and its neighbour, that will be a new pending vertex if it wasn't) * @param v vertex index shared by both faces * @return If the merge is possible, a new face without v */ BOP_Face* BOP_Merge::mergeFaces(BOP_Face4 *faceI, BOP_Face3 *faceJ, BOP_Indexs &pending, BOP_Index v) { BOP_Face *faceK = NULL; // Get faces data BOP_Index prevI, nextI, opp, prevJ, nextJ; faceI->getNeighbours(v,prevI,nextI,opp); faceJ->getNeighbours(v,prevJ,nextJ); MT_Point3 vertex = m_mesh->getVertex(v)->getPoint(); MT_Point3 vOpp = m_mesh->getVertex(opp)->getPoint(); MT_Point3 vPrevI = m_mesh->getVertex(prevI)->getPoint(); MT_Point3 vNextI = m_mesh->getVertex(nextI)->getPoint(); MT_Point3 vPrevJ = m_mesh->getVertex(prevJ)->getPoint(); MT_Point3 vNextJ = m_mesh->getVertex(nextJ)->getPoint(); // Merge test if (prevI == nextJ) { if (BOP_between(vertex,vNextI,vPrevJ)) { if (!BOP_collinear(vPrevJ,vPrevI,vOpp) && BOP_convex(vOpp,vPrevI,vPrevJ,vNextI)) { // The result is a new quad faceK = new BOP_Face4(opp,prevI,prevJ,nextI,faceI->getPlane(),faceI->getOriginalFace()); faceK->setTAG(faceI->getTAG()); } else if (BOP_between(vPrevI,vPrevJ,vOpp)) { // The result is a triangle (only if prevI can be merged) if (prevI < m_firstVertex) return NULL; // It can't be merged faceK = new BOP_Face3(nextI,opp,prevJ,faceI->getPlane(),faceI->getOriginalFace()); faceK->setTAG(faceI->getTAG()); if (!containsIndex(pending, prevI)) pending.push_back(prevI); } } } else if (nextI == prevJ) { if (BOP_between(vertex,vPrevI,vNextJ)) { if (!BOP_collinear(vNextJ,vNextI,vOpp) && BOP_convex(vOpp,vPrevI,vNextJ,vNextI)) { // The result is a new quad faceK = new BOP_Face4(opp,prevI,nextJ,nextI,faceI->getPlane(),faceI->getOriginalFace()); faceK->setTAG(faceI->getTAG()); } else if (BOP_between(vNextI,vOpp,vNextJ)) { // The result is a triangle (only if nextI can be merged) if (nextI < m_firstVertex) return NULL; faceK = new BOP_Face3(prevI,nextJ,opp,faceI->getPlane(),faceI->getOriginalFace()); faceK->setTAG(faceI->getTAG()); if (!containsIndex(pending, nextI)) pending.push_back(nextI); } } } return faceK; }
/** * Returns a new quad (convex) from the merge of two triangles that share the * vertex index v. * @param faceI mesh triangle * @param faceJ mesh triangle * @param v vertex index shared by both triangles * @return a new convex quad if the merge is possible */ BOP_Face* BOP_Merge2::createQuad(BOP_Face3 *faceI, BOP_Face3 *faceJ) { // Test if both triangles share a vertex index BOP_Index v; unsigned int i; for(i=0;i<3 ;i++) { v = faceI->getVertex(i); if( faceJ->containsVertex(v) ) break; } if (i == 3) return NULL; BOP_Face *faceK = NULL; // Get faces data BOP_Index prevI, nextI, prevJ, nextJ; faceI->getNeighbours(v,prevI,nextI); faceJ->getNeighbours(v,prevJ,nextJ); MT_Point3 vertex = m_mesh->getVertex(v)->getPoint(); MT_Point3 vPrevI = m_mesh->getVertex(prevI)->getPoint(); MT_Point3 vNextI = m_mesh->getVertex(nextI)->getPoint(); MT_Point3 vPrevJ = m_mesh->getVertex(prevJ)->getPoint(); MT_Point3 vNextJ = m_mesh->getVertex(nextJ)->getPoint(); // Quad test if (prevI == nextJ) { if (!BOP_collinear(vNextI,vertex,vPrevJ) && !BOP_collinear(vNextI,vPrevI,vPrevJ) && BOP_convex(vertex,vNextI,vPrevI,vPrevJ)) { faceK = new BOP_Face4(v,nextI,prevI,prevJ,faceI->getPlane(),faceI->getOriginalFace()); faceK->setTAG(faceI->getTAG()); BOP_Index edge; m_mesh->getIndexEdge(v,prevI,edge); m_mesh->getVertex(v)->removeEdge(edge); m_mesh->getVertex(prevI)->removeEdge(edge); } } else if (nextI == prevJ) { if (!BOP_collinear(vPrevI,vertex,vNextJ) && !BOP_collinear(vPrevI,vNextI,vNextJ) && BOP_convex(vertex,vNextJ,vNextI,vPrevI)) { faceK = new BOP_Face4(v,nextJ,nextI,prevI,faceI->getPlane(),faceI->getOriginalFace()); faceK->setTAG(faceI->getTAG()); BOP_Index edge; m_mesh->getIndexEdge(v,nextI,edge); m_mesh->getVertex(v)->removeEdge(edge); m_mesh->getVertex(nextI)->removeEdge(edge); } } return faceK; }