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
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
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;
00083 Vert *First_vertex,*Previous_vertex,*New_vertex,*First_null_vertex;
00084 Vert *New_null_vertex,*Previous_null_vertex;
00085
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;
00093 if (Negativ == 0)
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
00104 NE=NS->first_edge;
00105 Last_edge_before_cut=NS->first_edge;
00106
00107 do {
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))))
00112 {
00113 if ((NE->V1->fxyz == 0) && (NE->V2->fxyz == 0)) {
00114
00115 fprintf(stderr,"BoxMesh::cut(): unimplemented case\n");
00116 return NULL;
00117 }
00118
00119
00120
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
00126 SEMV(NS,NE,First_vertex,&SE);
00127 if (NE->V1->fxyz > 0 || NE->V2->fxyz > 0)
00128 {
00129 SEMV(NS,NE,First_null_vertex,&TempEdge);
00130 Lin=First_vertex ; Lout=SE->V2; FE=SE;
00131 SE->druh_hrany=TELESOVA;
00132 NE->druh_hrany=ODPADOVA;
00133 TempEdge->druh_hrany=NULOVA;
00134 }
00135 else
00136 {
00137 SEMV(NS,SE,First_null_vertex,&TempEdge);
00138 Lin=First_vertex ; 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 {
00148
00149 LE->druh_hrany=TELESOVA;
00150
00151
00152 if ((Lout->fxyz>0))
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 {
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 {
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
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
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
00206
00207
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
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
00222 } while (CNE->druh_hrany==NULOVA);
00223 }
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
00238 ClasifyEdges(NS);
00239 ClasifyEdges(Odpad);
00240
00241 return Odpad;
00242 }