BoxMesh.cc

Go to the documentation of this file.
00001 #include <esg/mesh/BoxMesh.h>
00002 
00003 using namespace esg;
00004 
00005 BoxMesh::BoxMesh(float a, float b, float c)
00006 {
00007   Vert   *V1, *V2, *V3, *V4, *V5, *V6, *V7, *V8;
00008   Plane  *F1, *F2, *F3, *F4, *F5, *F6;
00009   Edge   *E1, *E2, *E3, *E4, *E5, *E6, *E7, *E8, *E9, *E10, *E11, *E12;
00010 
00011   /* geometry */
00012   V1=MV(0.0,0.0,0.0);  V2=MV(0.0,b,0.0);
00013   V3=MV(a,b,0.0);      V4=MV(a,0.0,0.0);
00014   V5=MV(0.0,0.0,c);    V6=MV(0.0,b,c);
00015   V7=MV(a,b,c);        V8=MV(a,0.0,c);
00016 
00017   F1=MF(0,0,-1,0);     F4=MF(0,0,1,c);
00018   F2=MF(-1,0,0,0);     F5=MF(1,0,0,a);
00019   F3=MF(0,-1,0,0);     F6=MF(0,1,0,b);
00020 
00021   /* topology */
00022   pSolid=MVSF(F1,V1);
00023 
00024   AppendVertex(pSolid, V2);
00025   AppendVertex(pSolid, V3);
00026   AppendVertex(pSolid, V4);
00027   AppendVertex(pSolid, V5);
00028   AppendVertex(pSolid, V6);
00029   AppendVertex(pSolid, V7);
00030   AppendVertex(pSolid, V8);
00031   AppendFace(pSolid, F2);
00032   AppendFace(pSolid, F3);
00033   AppendFace(pSolid, F4);
00034   AppendFace(pSolid, F5);
00035   AppendFace(pSolid, F6);
00036 
00037   E1  = NewEdge(pSolid, V1, V2, F1, F2);
00038   E2  = NewEdge(pSolid, V2, V3, F1, F6);
00039   E3  = NewEdge(pSolid, V3, V4, F1, F5);
00040   E4  = NewEdge(pSolid, V4, V1, F1, F3);
00041 
00042   E5  = NewEdge(pSolid, V1, V5, F2, F3);
00043   E6  = NewEdge(pSolid, V2, V6, F6, F2);
00044   E7  = NewEdge(pSolid, V3, V7, F5, F6);
00045   E8  = NewEdge(pSolid, V4, V8, F3, F5);
00046   
00047   E9  = NewEdge(pSolid, V5, V6, F2, F4);
00048   E10 = NewEdge(pSolid, V6, V7, F6, F4);
00049   E11 = NewEdge(pSolid, V7, V8, F5, F4);
00050   E12 = NewEdge(pSolid, V8, V5, F3, F4);
00051 
00052   E1->LeftIn  = E4; E1->RightIn  = E6; E1->LeftOut  = E2; E1->RightOut  = E5;
00053   E2->LeftIn  = E1; E2->RightIn  = E7; E2->LeftOut  = E3; E2->RightOut  = E6;
00054   E3->LeftIn  = E2; E3->RightIn  = E8; E3->LeftOut  = E4; E3->RightOut  = E7;
00055   E4->LeftIn  = E3; E4->RightIn  = E5; E4->LeftOut  = E1; E4->RightOut  = E8;
00056 
00057   E5->LeftIn  = E1; E5->RightIn  = E12; E5->LeftOut = E9;  E5->RightOut = E4;
00058   E6->LeftIn  = E2; E6->RightIn  = E9;  E6->LeftOut = E10; E6->RightOut = E1;
00059   E7->LeftIn  = E3; E7->RightIn  = E10; E7->LeftOut = E11; E7->RightOut = E2;
00060   E8->LeftIn  = E4; E8->RightIn  = E11; E8->LeftOut = E12; E8->RightOut = E3;
00061   
00062   E9->LeftIn  = E5; E9->RightIn  = E10; E9->LeftOut  = E6; E9->RightOut  = E12;
00063   E10->LeftIn = E6; E10->RightIn = E11; E10->LeftOut = E7; E10->RightOut = E9;
00064   E11->LeftIn = E7; E11->RightIn = E12; E11->LeftOut = E8; E11->RightOut = E10;
00065   E12->LeftIn = E8; E12->RightIn = E9;  E12->LeftOut = E5; E12->RightOut = E11;
00066 
00067   F1->any_edge = E1;
00068   F2->any_edge = E5;
00069   F3->any_edge = E8;
00070   F4->any_edge = E12;
00071   F5->any_edge = E7;
00072   F6->any_edge = E6;
00073 
00074 
00075   ClasifyEdges(pSolid);
00076 };
00077 
00078 Mesh::Solid* BoxMesh::cut(float ar, float br, float cr, float dr)
00079 {
00080   Plane  *NP,*OP,*CutPlane,*ComplementCutPlane;
00081   Edge   *FE,*NE,*SE,*LE,*Last_edge_before_cut,*TempEdge,*CNE;
00082   Vert   *Lin,*Lout,*Lpom; /* vstupni a vystupni vrchol na hrane ve smycce */
00083   Vert   *First_vertex,*Previous_vertex,*New_vertex,*First_null_vertex;
00084   Vert   *New_null_vertex,*Previous_null_vertex; /* pocatecni a koncovy bod
00085                                                      rezove hrany*/
00086   Solid* NS = pSolid;
00087   Solid* Odpad;
00088   int Pozitiv,Negativ;
00089   
00090   if (NS == NULL) return NULL;;
00091   Vertex_Plane_position(*NS,ar,br,cr,dr,Pozitiv,Negativ);
00092   if (Pozitiv == 0) return NULL; // Zadny odpad
00093   if (Negativ == 0) // Cele teleso je odpad
00094   {
00095       Odpad = pSolid;
00096       pSolid = NULL;
00097       return pSolid;
00098   }
00099 
00100   CutPlane=MF(ar,br,cr,dr);
00101   ComplementCutPlane=MF(-ar,-br,-cr,-dr);
00102 
00103   /* existuje rez */
00104   NE=NS->first_edge;
00105   Last_edge_before_cut=NS->first_edge;
00106                    /* hlidam puvodni konec hranoveho seznamu */
00107   do {  // for all edges of solid
00108       if (((NE->druh_hrany!=ODPADOVA) && (NE->druh_hrany!=NULOVA) &&
00109            (NE->druh_hrany!=TELESOVA)) &&
00110           (((NE->V1->fxyz<=0)&&(NE->V2->fxyz>=0)) ||
00111            ((NE->V1->fxyz>=0)&&(NE->V2->fxyz<=0)))) /* cisty prusecik */
00112       {
00113           if ((NE->V1->fxyz == 0) && (NE->V2->fxyz == 0)) {
00114               // to do
00115               fprintf(stderr,"BoxMesh::cut(): unimplemented case\n");
00116               return NULL;
00117           }
00118               
00119 
00120           // allocate two new vertices inthe point of intersection
00121           First_vertex=Vertex_of_cut(NE->V1,NE->V2);
00122           First_null_vertex=Vertex_of_cut(NE->V1,NE->V2);
00123           New_vertex=First_vertex;
00124           New_null_vertex=First_null_vertex;
00125           // split edge
00126           SEMV(NS,NE,First_vertex,&SE);
00127           if (NE->V1->fxyz > 0 || NE->V2->fxyz > 0)
00128           {  /* po rezu je NE vne, SE je uvnitr */
00129               SEMV(NS,NE,First_null_vertex,&TempEdge);
00130               Lin=First_vertex /* ==SE->V1 */; Lout=SE->V2; FE=SE;
00131               SE->druh_hrany=TELESOVA;
00132               NE->druh_hrany=ODPADOVA;
00133               TempEdge->druh_hrany=NULOVA;
00134           }
00135           else
00136           {  /* NE je uvnitr, SE je vne */
00137               SEMV(NS,SE,First_null_vertex,&TempEdge);
00138               Lin=First_vertex /* ==NE->V2 */; Lout=NE->V1; FE=NE;
00139               NE->druh_hrany=TELESOVA;
00140               SE->druh_hrany=NULOVA;
00141               TempEdge->druh_hrany=ODPADOVA;
00142           }
00143 
00144           LE=Next_Edge_in_loop(FE,&Lin,&Lout);
00145           NP=This_loop(LE,Lin);
00146 
00147           do { // for all edges of one plane
00148               /* nalezni nejblizsi z pruseciku v leve plose */
00149               LE->druh_hrany=TELESOVA;
00150               /* pri hledani nejblizsiho pruseciku nebude platit !!! */
00151 
00152               if ((Lout->fxyz>0))/* cisty prusecik */
00153               {
00154                   Previous_vertex=New_vertex;
00155                   Previous_null_vertex=New_null_vertex;
00156                   New_vertex=Vertex_of_cut(Lin,Lout);
00157                   New_null_vertex=Vertex_of_cut(Lin,Lout);
00158                   
00159                   SEMV(NS,LE,New_vertex,&SE);
00160 
00161                   if (LE->V1==Lout)
00162                   {  /* po rezu je LE vne, SE je uvnitr */
00163                       SEMV(NS,LE,New_null_vertex,&TempEdge);
00164                       Lin=New_vertex; Lout=SE->V2;
00165                       SE->druh_hrany=TELESOVA;
00166                       LE->druh_hrany=ODPADOVA;
00167                       TempEdge->druh_hrany=NULOVA;
00168                       LE=SE;
00169                   }
00170                   else
00171                   {  /* LE je uvnitr, SE je vne */
00172                       SEMV(NS,SE,New_null_vertex,&TempEdge);
00173                       Lin=New_vertex; Lout=LE->V1;
00174                       LE->druh_hrany=TELESOVA;
00175                       TempEdge->druh_hrany=ODPADOVA;
00176                       SE->druh_hrany=NULOVA;
00177                   }
00178 
00179                   // split the actual plane by cutting edge
00180                   OP=MF(NP->a,NP->b,NP->c,NP->d);
00181                   MEF(NS,Previous_null_vertex,New_null_vertex,NP,
00182                       OP, &TempEdge);
00183 
00184                   TempEdge->druh_hrany=ODPADOVA;
00185 
00186                   MEnotF(NS,Previous_vertex,New_vertex,NP,
00187                          CutPlane, &TempEdge);
00188                   TempEdge->druh_hrany=TELESOVA;
00189 
00190                   /* prechod do dalsi plosky */
00191                   NP=This_loop(LE,Lin);
00192               }
00193 
00194               LE=Next_Edge_in_loop(LE,&Lin,&Lout);
00195           } while (LE!=FE);
00196 
00197          OP=MF(NP->a,NP->b,NP->c,NP->d);
00198          MEF(NS,New_null_vertex,First_null_vertex,NP,
00199              OP, &TempEdge);
00200          TempEdge->druh_hrany=ODPADOVA;
00201          MEF(NS,New_vertex,First_vertex,NP,
00202              CutPlane, &TempEdge);
00203          TempEdge->druh_hrany=TELESOVA;
00204 
00205          /* parcialni rez je hotovy, oddeleni ve smycce nulovych hran */
00206 
00207          /* ComplementCutPlane ... do seznamu rovin !!! */
00208 
00209          AppendFace(NS,ComplementCutPlane);
00210          CNE=TempEdge;
00211          Lin=CNE->V1; Lout=CNE->V2;
00212          CNE=Next_Edge_in_loop(CNE,&Lin,&Lout);
00213 
00214          do {
00215              /* hrany v odpadove casti rezu */
00216              KE(CNE,Lin,CutPlane,ComplementCutPlane);
00217              Lpom=Lin; Lin=Lout; Lout=Lpom;
00218              CNE=Next_Edge_in_loop(CNE,&Lin,&Lout);
00219              CNE=Next_Edge_in_loop(CNE,&Lin,&Lout);
00220 
00221              /* po prepojeni vazeb zrus nulovou hranu */
00222          } while (CNE->druh_hrany==NULOVA);
00223       } // if (((NE->druh_hrany!=ODPADOVA) && ...
00224 
00225       if ((NE->druh_hrany!=NULOVA)&&(NE->druh_hrany!=TELESOVA)&&
00226           (NE->druh_hrany!=ODPADOVA))
00227       {
00228           if (NE->V1->fxyz>0) NE->druh_hrany=ODPADOVA;
00229           else NE->druh_hrany=TELESOVA;
00230 
00231       }
00232       NE=NE->next_edge;
00233     
00234   } while (NE!=Last_edge_before_cut);
00235 
00236   SeparateSolids(&NS, &Odpad);
00237   /*  DeleteGarbage(NS);*/
00238   ClasifyEdges(NS);
00239   ClasifyEdges(Odpad);
00240 
00241   return Odpad;
00242 }

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