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 <math.h>
00046 #include "memvirtu.h"
00047 #include "lowparam.h"
00048 #include "lowmacro.h"
00049 #include "lowsolid.h"
00050 #include "eulerops.h"
00051 #include "vectorop.h"
00052 #include "sethmain.h"
00053 #include "disdispl.h"
00054 #include "gphgraph.h"
00055
00056 int MSD_checkBoolean(void);
00057
00058 extern SPTYPE sola;
00059 extern SPTYPE solb;
00060
00061
00062 void MSD_lowSetOpConnect(void)
00063 {
00064 EPTYPE nextedgea;
00065 EPTYPE nextedgeb;
00066 HPTYPE h1a;
00067 HPTYPE h2a;
00068 HPTYPE h1b;
00069 HPTYPE h2b;
00070 int finished_ok = 0;
00071
00072 #ifdef TRACE_BOOLEAN
00073 vector feq;
00074 int i;
00075
00076 fprintf(trace, "\n\n\n");
00077 fprintf(trace, "*************************************************\n");
00078 fprintf(trace, "* *\n");
00079 fprintf(trace, "* SETOPCONNECT *\n");
00080 fprintf(trace, "* *\n");
00081 fprintf(trace, "*************************************************\n");
00082 fprintf(trace, "\n");
00083 #endif
00084
00085 nenda = nendb = 0;
00086 MSD_lowSetOpSortNullEdges();
00087 while (MSD_lowSetOpGetNextNullEdge(&nextedgea, &nextedgeb))
00088 {
00089 if (MSD_lowSetOpCanJoin(EdgHe1(nextedgea), EdgHe2(nextedgeb),
00090 &h1a, &h2b))
00091 {
00092 #ifdef TRACE_BOOLEAN3
00093 fprintf(trace, "*** Une as arestas do solido A ");
00094 #endif
00095 MSD_lowSetOpJoin(h1a, EdgHe1(nextedgea));
00096 if (!MSD_lowSetOpIsLooseA(mate(h1a)))
00097 {
00098 MSD_lowSetOpCutA(h1a);
00099 }
00100
00101 #ifdef TRACE_BOOLEAN3
00102 fprintf(trace, "*** Une as arestas do solido B ");
00103 #endif
00104
00105 MSD_lowSetOpJoin(h2b, EdgHe2(nextedgeb));
00106 if (!MSD_lowSetOpIsLooseB(mate(h2b)))
00107 {
00108 MSD_lowSetOpCutB(h2b);
00109 }
00110 }
00111 if (MSD_lowSetOpCanJoin(EdgHe2(nextedgea), EdgHe1(nextedgeb),
00112 &h2a, &h1b))
00113 {
00114 #ifdef TRACE_BOOLEAN3
00115 fprintf(trace, "*** Une as arestas do solid A");
00116 #endif
00117
00118 MSD_lowSetOpJoin(h2a, EdgHe2(nextedgea));
00119 if (!MSD_lowSetOpIsLooseA(mate(h2a)))
00120 {
00121 MSD_lowSetOpCutA(h2a);
00122 }
00123
00124 #ifdef TRACE_BOOLEAN3
00125 fprintf(trace, "*** Une as arestas do solid B");
00126 #endif
00127
00128 MSD_lowSetOpJoin(h1b, EdgHe1(nextedgeb));
00129 if (!MSD_lowSetOpIsLooseB(mate(h1b)))
00130 {
00131 MSD_lowSetOpCutB(h1b);
00132 }
00133 }
00134 if ((h1a != HNIL) && (h1b != HNIL) && (h2a != HNIL) && (h2b != HNIL))
00135 {
00136 MSD_lowSetOpCutA(EdgHe1(nextedgea));
00137 MSD_lowSetOpCutB(EdgHe1(nextedgeb));
00138 finished_ok = 1;
00139 }
00140 }
00141
00142 #ifdef TRACE_BOOLEAN
00143 fprintf(trace, "\n");
00144 fprintf(trace, "*** setopconnect *** - nfaca = %2i\n", nfaca);
00145 fprintf(trace, "*** setopconnect *** - nfacb = %2i\n", nfacb);
00146 fprintf(trace, "*** estrutura sonfa ***\n");
00147 for (i = 0; i < nfaca; i++)
00148 {
00149 MSD_lowFaceEq(FacFLOut(SetSonfa(i)), feq);
00150 veccopy(FacFeq(SetSonfa(i)), feq);
00151 trace_f(SetSonfa(i));
00152 MSD_lowListFace(trace, SetSonfa(i), 3);
00153 }
00154 fprintf(trace, "*** estrutura sonfb ***\n");
00155 for (i = 0; i < nfacb; i++)
00156 {
00157 MSD_lowFaceEq(FacFLOut(SetSonfb(i)), feq);
00158 veccopy(feq, FacFeq(SetSonfb(i)));
00159 trace_f(SetSonfb(i));
00160 MSD_lowListFace(trace, SetSonfb(i), 3);
00161 }
00162 #endif
00163
00164 if (finished_ok == 0 )
00165 {
00166 fprintf(stderr, "!!");
00167
00168 #ifdef TRACE_BOOLEAN
00169 fclose(trace);
00170 #endif
00171
00172 exit(1);
00173 }
00174 }
00175
00176
00177 void MSD_lowSetOpJoin(HPTYPE h1, HPTYPE h2)
00178 {
00179 FPTYPE oldf;
00180 FPTYPE newf;
00181
00182 #ifdef TRACE_BOOLEAN3
00183 int flag;
00184 flag = 0;
00185 #endif
00186
00187 oldf = LooLFace(HalWLoop(h1));
00188 newf = FNIL;
00189 if (HalWLoop(h1) == HalWLoop(h2))
00190 {
00191 #ifdef TRACE_BOOLEAN3
00192 if (HalPrv(HalPrv(h1)) != h2)
00193 {
00194 if ((HalWLoop(h1) != FacFLOut(LooLFace(HalWLoop(h1)))) &&
00195 (h1 == EdgHe1(HalEdg(h1))))
00196 {
00197 fprintf(trace, " (MEF) *** case a\n");
00198 trace_he(HalNxt(h2));
00199 trace_he(h1);
00200 newf = MSD_lowMEF(HalNxt(h2), h1, maxf++);
00201 }
00202 else
00203 {
00204 fprintf(trace, " (MEF) *** case b\n");
00205 trace_he(h1);
00206 trace_he(HalNxt(h2));
00207 newf = MSD_lowMEF(h1, HalNxt(h2), maxf++);
00208 }
00209 flag = 1;
00210 }
00211 #else
00212 if (HalPrv(HalPrv(h1)) != h2)
00213 {
00214 if ((HalWLoop(h1) != FacFLOut(LooLFace(HalWLoop(h1)))) &&
00215 (h1 == EdgHe1(HalEdg(h1))))
00216 {
00217 newf = MSD_lowMEF(HalNxt(h2), h1, maxf++);
00218 }
00219 else
00220 {
00221 newf = MSD_lowMEF(h1, HalNxt(h2), maxf++);
00222 }
00223 }
00224 #endif
00225 }
00226
00227 #ifdef TRACE_BOOLEAN3
00228 else
00229 {
00230 fprintf(trace, " (MEKR) ***\n");
00231 trace_he(h1);
00232 trace_he(HalNxt(h2));
00233 MSD_lowMEKR(h1, HalNxt(h2));
00234 flag = 1;
00235 }
00236 #else
00237 else
00238 {
00239 MSD_lowMEKR(h1, HalNxt(h2));
00240 }
00241 #endif
00242
00243 if (HalNxt(HalNxt(h1)) != h2)
00244 {
00245 #ifdef TRACE_BOOLEAN3
00246 if (flag == 1)
00247 {
00248 fprintf(trace, "*** Une as arestas novamente ");
00249 }
00250 fprintf(trace, " (MEF) *** caso c\n");
00251 trace_he(h2);
00252 trace_he(HalNxt(h1));
00253 #endif
00254 MSD_lowMEF(h2, HalNxt(h1), maxf++);
00255
00256 #ifdef TRACE_BOOLEAN3
00257 if ((newf != FNIL) && (LooNextL(FacFLoops(oldf)) != LNIL))
00258 {
00259 fprintf(trace, "*** Operador (LARINGMV) \n");
00260 MSD_lowAllRingMove(oldf, newf);
00261 }
00262 #else
00263 if ((newf != FNIL) && (LooNextL(FacFLoops(oldf)) != LNIL))
00264 {
00265 MSD_lowAllRingMove(oldf, newf);
00266 }
00267 #endif
00268 }
00269 }
00270
00271
00272 int MSD_lowSetOpCanJoin(HPTYPE hea, HPTYPE heb, HPTYPE *reta, HPTYPE *retb)
00273 {
00274 int i, j;
00275
00276 #ifdef TRACE_BOOLEAN3
00277 fprintf(trace, "*** -------------------------------------------------\n");
00278 fprintf(trace, "*** scanjoin\n");
00279 trace_he(hea);
00280 trace_he(heb);
00281 #endif
00282
00283 for (i = 0; i < nenda; ++i)
00284 {
00285 if (MSD_lowSetOpNeighbor(hea, SetEndsa(i)) &&
00286 MSD_lowSetOpNeighbor(heb, SetEndsb(i)))
00287 {
00288 *reta = SetEndsa(i);
00289 *retb = SetEndsb(i);
00290 for (j = i + 1; j < nenda; ++j)
00291 {
00292 SetEndsa(j - 1) = SetEndsa(j);
00293 SetEndsb(j - 1) = SetEndsb(j);
00294 }
00295 nenda--;
00296 nendb--;
00297
00298 #ifdef TRACE_BOOLEAN3
00299 fprintf(trace, "*** scanjoin - OK - join is possible\n");
00300 trace_he(*reta);
00301 trace_he(*retb);
00302 fprintf(trace, "*** -------------------------------------------------\n\n");
00303 #endif
00304
00305 return(1);
00306 }
00307 }
00308 SetEndsa(nenda) = hea;
00309 SetEndsb(nendb) = heb;
00310 nenda++;
00311 nendb++;
00312
00313 #ifndef __VIRTUAL_MEM
00314 if (nenda == MAXENDS)
00315 {
00316 fprintf(stderr, "ends: falta memoria!\n");
00317 exit(1);
00318 }
00319 #endif
00320
00321 *reta = HNIL;
00322 *retb = HNIL;
00323
00324 #ifdef TRACE_BOOLEAN3
00325 fprintf(trace, "*** scanjoin - join is not possible\n");
00326 fprintf(trace, "*** -------------------------------------------------\n\n");
00327 #endif
00328
00329 return(0);
00330 }
00331
00332 void MSD_lowSetOpSortNullEdges(void)
00333 {
00334 register int i, j;
00335
00336 null_pnta = null_pntb = 0;
00337
00338
00339
00340
00341
00342 if (nedga < 5)
00343 {
00344 return;
00345 }
00346 for (i = j = 0; i < nedga; i++)
00347 {
00348 for (j = i + 1; j < nedga; j++)
00349 {
00350 if (MSD_lowSetOpGreater(i, j))
00351 {
00352 MSD_lowSetOpSwap(i, j);
00353 }
00354 }
00355 }
00356 }
00357
00358 int MSD_lowSetOpGreater(int i, int j)
00359 {
00360 VPTYPE v1;
00361 VPTYPE v2;
00362 int com;
00363
00364 v1 = HalVtx(EdgHe1(SetSonea(i)));
00365 v2 = HalVtx(EdgHe1(SetSonea(j)));
00366 if ((com = comp(VerVCoord(v1)[0], VerVCoord(v2)[0], EPS)) == -1)
00367 {
00368 return(0);
00369 }
00370 if (com == 0)
00371 {
00372 if ((com = comp(VerVCoord(v1)[1], VerVCoord(v2)[1], EPS)) == -1)
00373 {
00374 return(0);
00375 }
00376 if (com == 0)
00377 {
00378 if ((com = comp(VerVCoord(v1)[2], VerVCoord(v2)[2], EPS)) == -1)
00379 {
00380 return(0);
00381 }
00382 }
00383 }
00384 return(1);
00385 }
00386
00387 void MSD_lowSetOpSwap(int i, int j)
00388 {
00389 EPTYPE temp;
00390
00391 temp = SetSonea(i);
00392 SetSonea(i) = SetSonea(j);
00393 SetSonea(j) = temp;
00394 temp = SetSoneb(i);
00395 SetSoneb(i) = SetSoneb(j);
00396 SetSoneb(j) = temp;
00397 }
00398
00399 int MSD_lowSetOpIsLooseA(HPTYPE he)
00400 {
00401 int i;
00402
00403 for (i = 0; i < nenda; ++i)
00404 {
00405 if (SetEndsa(i) == he)
00406 {
00407 return(1);
00408 }
00409 }
00410 return(0);
00411 }
00412
00413 int MSD_lowSetOpIsLooseB(HPTYPE he)
00414 {
00415 int i;
00416
00417 for (i = 0; i < nendb; ++i)
00418 {
00419 if (SetEndsb(i) == he)
00420 {
00421 return(1);
00422 }
00423 }
00424 return(0);
00425 }
00426
00427 void MSD_lowSetOpCutA(HPTYPE he)
00428 {
00429 if (HalWLoop(EdgHe1(HalEdg(he))) == HalWLoop(EdgHe2(HalEdg(he))))
00430 {
00431 #ifdef TRACE_BOOLEAN3
00432 fprintf(trace, "*** Corta Solido A (KEMR) ***\n");
00433 trace_he(EdgHe2(HalEdg(he)));
00434 fprintf(trace, "*** Acrescenta Face Solido A (sonfa)\n");
00435 trace_f(LooLFace(HalWLoop(he)));
00436 #endif
00437
00438 SetSonfa(nfaca) = LooLFace(HalWLoop(he));
00439 nfaca++;
00440
00441 #ifndef __VIRTUAL_MEM
00442 if (nfaca == MAXNULLFACES)
00443 {
00444 fprintf(stderr, "sonfa: falta memoria!\n");
00445 exit(1);
00446 }
00447 #endif
00448
00449 MSD_lowKEMR(EdgHe2(HalEdg(he)), EdgHe1(HalEdg(he)));
00450 }
00451
00452 #ifdef TRACE_BOOLEAN3
00453 else
00454 {
00455 fprintf(trace, "*** Corta Solido A (KEF) ***\n");
00456 trace_he(EdgHe1(HalEdg(he)));
00457 MSD_lowKEF(EdgHe1(HalEdg(he)), EdgHe2(HalEdg(he)));
00458 }
00459 #else
00460 else
00461 {
00462 MSD_lowKEF(EdgHe1(HalEdg(he)), EdgHe2(HalEdg(he)));
00463 }
00464 #endif
00465 }
00466
00467 void MSD_lowSetOpCutB(HPTYPE he)
00468 {
00469 if (HalWLoop(EdgHe1(HalEdg(he))) == HalWLoop(EdgHe2(HalEdg(he))))
00470 {
00471 #ifdef TRACE_BOOLEAN3
00472 fprintf(trace, "*** Corta Solido B (KEMR) ***\n");
00473 trace_he(EdgHe2(HalEdg(he)));
00474 fprintf(trace, "*** Acrescenta Face Solido B (sonfb)\n");
00475 trace_f(LooLFace(HalWLoop(he)));
00476 #endif
00477
00478 SetSonfb(nfacb) = LooLFace(HalWLoop(he));
00479 nfacb++;
00480
00481 #ifndef __VIRTUAL_MEM
00482 if (nfacb == MAXNULLFACES)
00483 {
00484 fprintf(stderr, "sonfb: falta memoria!\n");
00485 exit(1);
00486 }
00487 #endif
00488
00489 MSD_lowKEMR(EdgHe2(HalEdg(he)), EdgHe1(HalEdg(he)));
00490 }
00491
00492 #ifdef TRACE_BOOLEAN3
00493 else
00494 {
00495 fprintf(trace, "*** Corta Solido B (KEF) ***\n");
00496 trace_he(EdgHe1(HalEdg(he)));
00497 MSD_lowKEF(EdgHe1(HalEdg(he)), EdgHe2(HalEdg(he)));
00498 }
00499 #else
00500 else
00501 {
00502 MSD_lowKEF(EdgHe1(HalEdg(he)), EdgHe2(HalEdg(he)));
00503 }
00504 #endif
00505 }
00506
00507 int MSD_lowSetOpGetNextNullEdge(EPTYPE *nexta, EPTYPE *nextb)
00508 {
00509 #ifdef TRACE_BOOLEAN3
00510 fprintf(trace, "\n*** sgetnextnulledge\n");
00511 #endif
00512
00513 *nexta = null_pnta < nedga ? SetSonea(null_pnta) : ENIL;
00514 *nextb = null_pntb < nedgb ? SetSoneb(null_pntb) : ENIL;
00515 null_pnta++;
00516 null_pntb++;
00517 if ((*nextb == ENIL) && (*nexta == ENIL))
00518 {
00519 return(FALSE);
00520 }
00521
00522 #ifdef TRACE_BOOLEAN3
00523 trace_he(EdgHe1(*nexta));
00524 trace_he(EdgHe1(*nextb));
00525 #endif
00526
00527 return(TRUE);
00528 }
00529
00530 int MSD_lowSetOpNeighbor(HPTYPE h1, HPTYPE h2)
00531 {
00532 if (HalVtx(h1) == HalVtx(h2))
00533 {
00534 return(FALSE);
00535 }
00536 if (HalVtx(h1) == HalVtx(mate(h2)))
00537 {
00538 return(FALSE);
00539 }
00540 if (HalVtx(mate(h1)) == HalVtx(h2))
00541 {
00542 return(FALSE);
00543 }
00544 if (HalVtx(mate(h1)) == HalVtx(mate(h2)))
00545 {
00546 return(FALSE);
00547 }
00548 return(LooLFace(HalWLoop(h1)) == LooLFace(HalWLoop(h2)) &&
00549 ((h1 == EdgHe1(HalEdg(h1)) && h2 == EdgHe2(HalEdg(h2))) ||
00550 (h1 == EdgHe2(HalEdg(h1)) && h2 == EdgHe1(HalEdg(h2)))));
00551 }