00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include <stdio.h>
00042 #ifndef __UNIX_
00043 #include <stdlib.h>
00044 #endif
00045 #include "memvirtu.h"
00046 #include "lowparam.h"
00047 #include "lowmacro.h"
00048 #include "lowsolid.h"
00049
00050 void MSD_execTrace(void)
00051 {
00052 if (TraceBoundaryStructure())
00053 {
00054 fprintf(stderr, "Ocorreu Erro - trace\n");
00055 }
00056 }
00057
00058 int TraceBoundaryStructure(void)
00059 {
00060 SPTYPE s;
00061
00062 if (error == TRUE)
00063 {
00064 return(TRUE);
00065 }
00066 for (AllSolids(s))
00067 {
00068 if (TraceSolid(s) == TRUE)
00069 {
00070 return(TRUE);
00071 }
00072 }
00073 return(FALSE);
00074 }
00075
00076 int TraceSolid(SPTYPE s)
00077 {
00078 if (checkf(s) == ERROR)
00079 {
00080 return(TRUE);
00081 }
00082 if (checke(s) == ERROR)
00083 {
00084 return(TRUE);
00085 }
00086 if (checkv(s) == ERROR)
00087 {
00088 return(TRUE);
00089 }
00090 return(FALSE);
00091 }
00092
00093 int checkShell(FPTYPE f, DPTYPE d)
00094 {
00095 FPTYPE f2;
00096 LPTYPE l;
00097 HPTYPE he;
00098
00099 if (FacFShell(f) != d)
00100 {
00101 return(1);
00102 }
00103 SetFaceBitOK1(f);
00104 for (AllLoopsFace(f, l))
00105 {
00106 he = LooLEdg(l);
00107 if (HalEdg(he) == ENIL)
00108 {
00109 continue;
00110 }
00111 do
00112 {
00113 f2 = LooLFace(HalWLoop(mate(he)));
00114 if (FaceBitNOK1(f2))
00115 {
00116 if (checkShell(f2, d) == 1)
00117 {
00118 return(1);
00119 }
00120 }
00121 } while ((he = HalNxt(he)) != LooLEdg(l));
00122 }
00123 return(0);
00124 }
00125
00126 int checkf(SPTYPE s)
00127 {
00128 DPTYPE dd;
00129 DPTYPE d;
00130 FPTYPE f;
00131 LPTYPE l;
00132 LPTYPE out;
00133 HPTYPE he;
00134
00135 #ifdef __VIRTUAL_MEM
00136 MSD_checkSolid(s);
00137 #endif
00138
00139 assert(s != SNIL);
00140 assert(SolSShells(s) != DNIL);
00141
00142 #ifdef __VIRTUAL_MEM
00143 MSD_checkShell(SolSShells(s));
00144 #endif
00145
00146 for (AllShellsSolid(s, d))
00147 {
00148 #ifdef __VIRTUAL_MEM
00149 MSD_checkShell(d);
00150 #endif
00151
00152 assert(SheSSolids(d) == s);
00153 assert(SheSFaces(d) != FNIL);
00154
00155 #ifdef __VIRTUAL_MEM
00156 MSD_checkFace(SheSFaces(d));
00157 #endif
00158
00159 for (AllShellsSolid(s, dd))
00160 {
00161 for (AllFacesShell(dd, f))
00162 {
00163 SetFaceBitNOK1(f);
00164 }
00165 }
00166 assert(checkShell(SheSFaces(d), d) == 0);
00167
00168 for (AllFacesShell(d, f))
00169 {
00170 #ifdef __VIRTUAL_MEM
00171 MSD_checkFace(f);
00172 MSD_checkLoop(FacFLoops(f));
00173 MSD_checkLoop(FacFLOut(f));
00174 #endif
00175
00176 assert(FacFLoops(f) != LNIL);
00177 assert(FacFLOut(f) != LNIL);
00178 assert(FacFShell(f) == d);
00179 out = LNIL;
00180 for (AllLoopsFace(f, l))
00181 {
00182 #ifdef __VIRTUAL_MEM
00183 MSD_checkLoop(l);
00184 MSD_checkHalfedge(LooLEdg(l));
00185 #endif
00186
00187 assert(LooLFace(l) == f);
00188 assert(LooLEdg(l) != HNIL);
00189 he = LooLEdg(l);
00190 do
00191 {
00192 #ifdef __VIRTUAL_MEM
00193 MSD_checkLoop(HalWLoop(he));
00194 MSD_checkHalfedge(HalPrv(he));
00195 MSD_checkHalfedge(HalNxt(he));
00196
00197 #endif
00198
00199 assert(HalWLoop(he) == l);
00200 assert(HalPrv(he) != HNIL);
00201 assert(HalNxt(he) != HNIL);
00202 assert(findv(d, HalVtx(he)) == 1);
00203 if (HalEdg(he) != ENIL)
00204 {
00205 assert(findes(d, HalEdg(he)) == 1);
00206
00207 #ifdef __VIRTUAL_MEM
00208 MSD_checkVertex(HalVtx(he));
00209 MSD_checkHalfedge(EdgHe1(HalEdg(he)));
00210 MSD_checkHalfedge(EdgHe2(HalEdg(he)));
00211 #endif
00212
00213 assert(VerVEdge(HalVtx(he)) != HNIL);
00214 assert(findhes(d, VerVEdge(HalVtx(he))) == 1);
00215 assert(EdgHe1(HalEdg(he)) != HNIL);
00216 assert(EdgHe2(HalEdg(he)) != HNIL);
00217 assert(he == EdgHe1(HalEdg(he)) || he == EdgHe2(HalEdg(he)));
00218 assert(findhes(d, mate(he)) == 1);
00219 }
00220 } while ((he = HalNxt(he)) != LooLEdg(l));
00221 if (l == FacFLOut(f))
00222 {
00223 out = l;
00224 }
00225 }
00226 assert(out != LNIL);
00227 }
00228 }
00229 return(SUCCESS);
00230 }
00231
00232 int findhes(DPTYPE d, HPTYPE he)
00233 {
00234 FPTYPE f;
00235 LPTYPE l;
00236 HPTYPE h;
00237 int v1, v2;
00238
00239 #ifdef __VIRTUAL_MEM
00240 MSD_checkHalfedge(he);
00241 MSD_checkShell(d);
00242 MSD_checkLoop(HalWLoop(he));
00243 MSD_checkFace(LooLFace(HalWLoop(he)));
00244 #endif
00245
00246 assert((l = HalWLoop(he)) != LNIL);
00247 assert((f = LooLFace(l)) != FNIL);
00248 assert(FacFShell(f) == d);
00249
00250 for (AllFacesShell(d, f))
00251 {
00252 for (AllLoopsFace(f, l))
00253 {
00254 h = LooLEdg(l);
00255 do
00256 {
00257 if (h == he)
00258 {
00259 return(1);
00260 }
00261 } while ((h = HalNxt(h)) != LooLEdg(l));
00262 }
00263 }
00264
00265 #ifdef __VIRTUAL_MEM
00266 MSD_checkHalfedge(he);
00267 MSD_checkHalfedge(HalNxt(he));
00268 MSD_checkVertex(HalVtx(he));
00269 MSD_checkVertex(HalVtx(HalNxt(he)));
00270 #endif
00271
00272 v1 = VerVertexNo(HalVtx(he));
00273 v2 = VerVertexNo(HalVtx(HalNxt(he)));
00274 fprintf(stderr, "checkf: halfedge <%d %d> not found!\n", v1, v2);
00275 MSD_lowListSolid(stdout, SheSSolids(d), 3);
00276 return(0);
00277 }
00278
00279 int checke(SPTYPE s)
00280 {
00281 DPTYPE d;
00282 DPTYPE d1;
00283 EPTYPE e;
00284 HPTYPE he1;
00285 HPTYPE he2;
00286 LPTYPE l1;
00287 LPTYPE l2;
00288 FPTYPE f1;
00289 FPTYPE f2;
00290 VPTYPE v1;
00291 VPTYPE v2;
00292
00293 assert(s != SNIL);
00294 assert(SolSShells(s) != DNIL);
00295 for (AllShellsSolid(s, d))
00296 {
00297 assert(SheSSolids(d) == s);
00298 for (AllEdgesShell(d, e))
00299 {
00300 assert((he1 = EdgHe1(e)) != HNIL);
00301 assert((he2 = EdgHe2(e)) != HNIL);
00302 assert(he1 != he2);
00303 assert(HalEdg(he1) == e);
00304 assert(HalEdg(he2) == e);
00305 assert(HalNxt(he1) != HNIL);
00306 assert(HalPrv(he1) != HNIL);
00307 assert(HalNxt(he2) != HNIL);
00308 assert(HalPrv(he2) != HNIL);
00309 assert(HalNxt(HalPrv(he2)) == he2);
00310 assert(HalPrv(HalNxt(he2)) == he2);
00311 assert(HalNxt(HalPrv(he1)) == he1);
00312 assert(HalPrv(HalNxt(he1)) == he1);
00313
00314 assert((l1 = HalWLoop(he1)) != LNIL);
00315 assert((l2 = HalWLoop(he2)) != LNIL);
00316 assert(findhe(he1, l1) == 1);
00317 assert(findhe(he2, l2) == 1);
00318
00319 assert((f1 = LooLFace(l1)) != FNIL);
00320 assert((f2 = LooLFace(l2)) != FNIL);
00321 assert(findl(l1, f1) == 1);
00322 assert(findl(l2, f2) == 1);
00323 assert(findf(d, f1) == 1);
00324 assert(findf(d, f2) == 1);
00325
00326 assert((d1 = FacFShell(f1)) != DNIL);
00327 assert(findd(s, d1) == 1);
00328
00329 assert((v1 = HalVtx(he1)) != VNIL);
00330 assert((v2 = HalVtx(he2)) != VNIL);
00331 assert(findv(d, v1) == 1);
00332 assert(findv(d, v2) == 1);
00333 assert(VerVEdge(v1) != HNIL);
00334 assert(VerVEdge(v2) != HNIL);
00335 assert(finde(v1, he1) == 1);
00336 assert(finde(v2, he2) == 1);
00337 }
00338 }
00339 return(SUCCESS);
00340 }
00341
00342 int findhe(HPTYPE he, LPTYPE l)
00343 {
00344 HPTYPE h;
00345
00346 assert(l != LNIL);
00347
00348 h = LooLEdg(l);
00349 do
00350 {
00351 if (h == he)
00352 {
00353 return(1);
00354 }
00355 } while ((h = HalNxt(h)) != LooLEdg(l));
00356
00357 fprintf(stderr, "checke: wrong back ptr in halfedge <%d %d>\n",
00358 VerVertexNo(HalVtx(he)), VerVertexNo(HalVtx(HalNxt(he))));
00359 MSD_lowListFace(stdout, LooLFace(l), 3);
00360 return(0);
00361 }
00362
00363 int findes(DPTYPE d, EPTYPE e)
00364 {
00365 EPTYPE edg;
00366
00367 assert(d != DNIL);
00368 assert(SheSEdges(d) != ENIL);
00369
00370 for (AllEdgesShell(d, edg))
00371 {
00372 if (edg == e)
00373 {
00374 return(1);
00375 }
00376 }
00377 fprintf(stderr, "checkf: edge <%d %d> not found\n",
00378 VerVertexNo(HalVtx(EdgHe1(e))), VerVertexNo(HalVtx(EdgHe2(e))));
00379 MSD_lowListSolid(stdout, SheSSolids(d), 3);
00380 return(0);
00381 }
00382
00383 int findl(LPTYPE l, FPTYPE f)
00384 {
00385 LPTYPE lp;
00386
00387 for (AllLoopsFace(f, lp))
00388 {
00389 if (lp == l)
00390 {
00391 return(1);
00392 }
00393 }
00394
00395 fprintf(stderr, "checke: wrong back ptr in loop <%d %d>\n",
00396 VerVertexNo(HalVtx(LooLEdg(l))),
00397 VerVertexNo(HalVtx(HalNxt(LooLEdg(l)))));
00398 MSD_lowListFace(stdout, LooLFace(l), 3);
00399 return(0);
00400 }
00401
00402 int finde(VPTYPE v, HPTYPE he)
00403 {
00404 HPTYPE h;
00405
00406 h = VerVEdge(v);
00407 do
00408 {
00409 if (h == he)
00410 {
00411 return(1);
00412 }
00413 } while ((h = HalNxt(mate(h))) != VerVEdge(v));
00414
00415 fprintf(stderr, "checke: wrong vertex ptr in halfedge <%d %d>\n",
00416 VerVertexNo(HalVtx(he)), VerVertexNo(HalVtx(HalNxt(he))));
00417 MSD_lowListFace(stdout, LooLFace(HalWLoop(he)), 3);
00418 return(0);
00419 }
00420
00421 int findf(DPTYPE d, FPTYPE f)
00422 {
00423 FPTYPE ff;
00424
00425 assert(d != DNIL);
00426 assert(SheSFaces(d) != FNIL);
00427
00428 for (AllFacesShell(d, ff))
00429 {
00430 if (ff == f)
00431 {
00432 return(1);
00433 }
00434 }
00435 fprintf(stderr, "checke: face %d not found!\n", FacFaceNo(f));
00436 MSD_lowListFace(stdout, f, 3);
00437 MSD_lowListSolid(stdout, SheSSolids(d), 3);
00438 return(0);
00439 }
00440
00441 int findd(SPTYPE s, DPTYPE d)
00442 {
00443 DPTYPE dd;
00444
00445 assert(s != SNIL);
00446 assert(SolSShells(s) != DNIL);
00447
00448 for (AllShellsSolid(s, dd))
00449 {
00450 if (dd == d)
00451 {
00452 return(1);
00453 }
00454 }
00455 fprintf(stderr, "checke: shell %d not found!\n", SheShellNo(d));
00456 MSD_lowListSolid(stdout, s, 101);
00457 return(0);
00458 }
00459
00460 int findv(DPTYPE d, VPTYPE v)
00461 {
00462 VPTYPE vtx;
00463
00464 #ifdef __VIRTUAL_MEM
00465 MSD_checkVertex(v);
00466 MSD_checkShell(d);
00467 #endif
00468
00469 assert(d != DNIL);
00470 assert(SheSVerts(d) != VNIL);
00471
00472 for (AllVerticesShell(d, vtx))
00473 {
00474 if (vtx == v)
00475 {
00476 return(1);
00477 }
00478 }
00479 fprintf(stderr, "checke: vertex %d not found in shell %d!\n",
00480 VerVertexNo(v), SheShellNo(d));
00481 MSD_lowListSolid(stdout, SheSSolids(d), 3);
00482 return(0);
00483 }
00484
00485 int checkv(SPTYPE s)
00486 {
00487 DPTYPE d;
00488 VPTYPE v;
00489 HPTYPE he;
00490 int maxtry;
00491
00492 #ifdef __VIRTUAL_MEM
00493 MSD_checkSolid(s);
00494 #endif
00495
00496 assert(s != SNIL);
00497 assert(SolSShells(s) != DNIL);
00498 assert(SheSVerts(SolSShells(s)) != VNIL);
00499
00500 for (AllShellsSolid(s, d))
00501 {
00502 assert(SheSSolids(d) == s);
00503 for (AllVerticesShell(d, v))
00504 {
00505 if ((he = VerVEdge(v)) != HNIL)
00506 {
00507 maxtry = 100;
00508 do
00509 {
00510 assert(HalEdg(he) != ENIL);
00511 assert(HalVtx(he) == v);
00512 assert(maxtry-- > 0);
00513 } while ((he = HalNxt(mate(he))) != VerVEdge(v));
00514 }
00515 }
00516 }
00517 return(SUCCESS);
00518 }