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)
00025 V1->normal.set(normals[nindex[0]]);
00026 else
00027 V1->normal.set(normal);
00028 pSolid = MVSF(F,V1);
00029 V = V1;
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)
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 {
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 {
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 }