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 "lowgeome.h"
00052 #include "vectorop.h"
00053 #include "sethmain.h"
00054 #include "splsplit.h"
00055
00056
00057 void MSD_lowSetOpGenerate(SPTYPE a, SPTYPE b)
00058 {
00059 DPTYPE da;
00060 DPTYPE db;
00061 EPTYPE e;
00062 BTYPE ebox;
00063 int i, j, k;
00064
00065 #ifdef TRACE_BOOLEAN
00066 fprintf(trace, "*************************************************\n");
00067 fprintf(trace, "* *\n");
00068 fprintf(trace, "* SETOPGENERATE *\n");
00069 fprintf(trace, "* *\n");
00070 fprintf(trace, "*************************************************\n");
00071 fprintf(trace, "\n");
00072 #endif
00073
00074 nvvtx = nvtxa = nvtxb = 0;
00075 if (MSD_lowBoxBoxIntersection(&(SolBox(a)), &(SolBox(b))))
00076 {
00077 for (AllShellsSolid(a, da))
00078 {
00079 if (MSD_lowBoxBoxIntersection(&(SheBox(da)), &(SolBox(b))))
00080 {
00081 for (AllEdgesShell(da, e))
00082 {
00083 MSD_lowEdgeBox(&ebox, e);
00084 if (MSD_lowBoxBoxIntersection(&ebox, &(SolBox(b))))
00085 {
00086 MSD_lowSetOpProcessEdge(e, SheSFaces(SolSShells(b)), SolSShells(b), 0);
00087 }
00088 }
00089 }
00090 }
00091 for (AllShellsSolid(b, db))
00092 {
00093 if (MSD_lowBoxBoxIntersection(&(SheBox(db)), &(SolBox(a))))
00094 {
00095 for (AllEdgesShell(db, e))
00096 {
00097 MSD_lowEdgeBox(&ebox, e);
00098 if (MSD_lowBoxBoxIntersection(&ebox, &(SolBox(a))))
00099 {
00100 MSD_lowSetOpProcessEdge(e, SheSFaces(SolSShells(a)), SolSShells(a), 1);
00101 }
00102 }
00103 }
00104 }
00105 }
00106
00107 for (i = 0; i < nvvtx; i++)
00108 {
00109 for (j = 0; j < nvtxa; j++)
00110 {
00111 if (SetVVva(i) == SetAVFv(j))
00112 {
00113 nvtxa--;
00114 j--;
00115 for (k = j + 1; k < nvtxa; k++)
00116 {
00117 SetAVFv(k) = SetAVFv(k + 1);
00118 SetAVFf(k) = SetAVFf(k + 1);
00119 fprintf(stderr, "*");
00120 }
00121 }
00122 }
00123 for (j = 0; j < nvtxb; j++)
00124 {
00125 if (SetVVvb(i) == SetBVFv(j))
00126 {
00127 nvtxb--;
00128 j--;
00129 for (k = j + 1; k < nvtxb; k++)
00130 {
00131 SetBVFv(k) = SetBVFv(k + 1);
00132 SetBVFf(k) = SetBVFf(k + 1);
00133 fprintf(stderr, "*");
00134 }
00135 }
00136 }
00137 }
00138
00139 #ifdef TRACE_BOOLEAN
00140 fprintf(trace, "*** setopgenerate *** - nvvtx = %3i\n", nvvtx);
00141 fprintf(trace, "*** setopgenerate *** - nvtxa = %3i\n", nvtxa);
00142 fprintf(trace, "*** setopgenerate *** - nvtxb = %3i\n", nvtxb);
00143 fprintf(trace, "*** estrutura sonvv ***\n");
00144 for (i = 0; i < nvvtx; i++)
00145 {
00146 trace_v(SetVVva(i));
00147 trace_v(SetVVvb(i));
00148 }
00149 fprintf(trace, "*** estrutura sonva ***\n");
00150 for (i = 0; i < nvtxa; i++)
00151 {
00152 trace_v(SetAVFv(i));
00153 trace_f(SetAVFf(i));
00154 }
00155 fprintf(trace, "*** estrutura sonvb ***\n");
00156 for (i = 0; i < nvtxb; i++)
00157 {
00158 trace_v(SetBVFv(i));
00159 trace_f(SetBVFf(i));
00160 }
00161 #endif
00162 }
00163
00164 void MSD_lowSetOpProcessEdge(EPTYPE e, FPTYPE fini, DPTYPE dini, int BvxA)
00165 {
00166 DPTYPE d;
00167 FPTYPE f;
00168 BTYPE ebox;
00169
00170 MSD_lowEdgeBox(&ebox, e);
00171 for (d = dini, f = fini; d != DNIL; d = SheNextD(d),
00172 f = d != DNIL ? SheSFaces(d) : FNIL)
00173 {
00174 if (MSD_lowBoxBoxIntersection(&ebox, &(SheBox(d))))
00175 {
00176 for ( ; f != FNIL; f = FacNextF(f))
00177 {
00178 if (MSD_lowBoxBoxIntersection(&ebox, &(FacBox(f))))
00179 {
00180 MSD_lowSetOpDoGenerate(e, f, BvxA);
00181 }
00182 }
00183 }
00184 }
00185 }
00186
00187
00188 void MSD_lowSetOpDoGenerate(EPTYPE e, FPTYPE f, int BvxA)
00189 {
00190 VPTYPE v1;
00191 VPTYPE v2;
00192 double d1, d2, t, x, y, z;
00193 int s1, s2, cont;
00194
00195 #ifdef TRACE_BOOLEAN1
00196 fprintf(trace, "\n");
00197 if (BvxA == 0)
00198 {
00199 fprintf(trace, "*** Aresta de Objeto A e Face de Objeto B\n");
00200 }
00201 if (BvxA == 1)
00202 {
00203 fprintf(trace, "*** Aresta de Objeto B e Face de Objeto A\n");
00204 }
00205 trace_e(e);
00206 trace_f(f);
00207 #endif
00208
00209 v1 = HalVtx(EdgHe1(e));
00210 v2 = HalVtx(EdgHe2(e));
00211 s1 = comp((d1 = MSD_lowDistancePlanePoint(FacFeq(f), v1)), 0.0, EPS);
00212 s2 = comp((d2 = MSD_lowDistancePlanePoint(FacFeq(f), v2)), 0.0, EPS);
00213 if (((s1 == -1) && (s2 == 1)) || ((s1 == 1) && (s2 == -1)))
00214 {
00215 t = d1 / (d1 - d2);
00216 x = VerVCoord(v1)[0] + t * (VerVCoord(v2)[0] - VerVCoord(v1)[0]);
00217 y = VerVCoord(v1)[1] + t * (VerVCoord(v2)[1] - VerVCoord(v1)[1]);
00218 z = VerVCoord(v1)[2] + t * (VerVCoord(v2)[2] - VerVCoord(v1)[2]);
00219 if (MSD_lowVertexInBox(&(FacBox(f)), x, y, z))
00220 {
00221 if ((cont = MSD_lowSetOpFacPntContainment(f, x, y, z)) > 0)
00222 {
00223 MSD_lowMEV(EdgHe1(e), HalNxt(EdgHe2(e)), maxv++, x, y, z);
00224
00225 #ifdef TRACE_BOOLEAN1
00226 if (cont == 1)
00227 {
00228 fprintf(trace, "*** Ocorre interseccao aresta-face\n");
00229 MSD_lowSetOpAddSOVF(HalVtx(EdgHe1(e)), f, BvxA);
00230 }
00231 #else
00232 if (cont == 1)
00233 {
00234 MSD_lowSetOpAddSOVF(HalVtx(EdgHe1(e)), f, BvxA);
00235 }
00236 #endif
00237
00238 if (cont == 2)
00239 {
00240 #ifdef TRACE_BOOLEAN1
00241 fprintf(trace, "*** Ocorre interseccao aresta-aresta\n");
00242 #endif
00243 MSD_lowMEV(hithe, HalNxt(mate(hithe)), maxv++, x, y, z);
00244 MSD_lowSetOpAddSOVV(HalVtx(EdgHe1(e)), HalVtx(hithe), BvxA);
00245 }
00246
00247 #ifdef TRACE_BOOLEAN1
00248 if (cont == 3)
00249 {
00250 fprintf(trace, "*** Ocorre interseccao aresta-vertice\n");
00251 MSD_lowSetOpAddSOVV(HalVtx(EdgHe1(e)), hitvertex, BvxA);
00252 }
00253 #else
00254 if (cont == 3)
00255 {
00256 MSD_lowSetOpAddSOVV(HalVtx(EdgHe1(e)), hitvertex, BvxA);
00257 }
00258 #endif
00259 MSD_lowSetOpProcessEdge(HalEdg(HalPrv(EdgHe1(e))), f, FacFShell(f), BvxA);
00260 }
00261
00262 #ifdef TRACE_BOOLEAN1
00263 if (cont == 0)
00264 {
00265 fprintf(trace, "*** Nao ocorre interseccao\n");
00266 }
00267 #endif
00268 }
00269 }
00270 else
00271 {
00272 if (s1 == 0)
00273 {
00274 MSD_lowSetOpDoVertexOnFace(v1, f, BvxA);
00275 }
00276 if (s2 == 0)
00277 {
00278 MSD_lowSetOpDoVertexOnFace(v2, f, BvxA);
00279 }
00280 #ifdef TRACE_BOOLEAN1
00281 if ((s1 != 0) && (s2 != 0))
00282 {
00283 fprintf(trace, "*** Nao ocorre interseccao\n");
00284 }
00285 #endif
00286 }
00287 }
00288
00289
00290 void MSD_lowSetOpDoVertexOnFace(VPTYPE v, FPTYPE f, int BvxA)
00291 {
00292 int cont;
00293
00294 if (MSD_lowVertexInBox(&(FacBox(f)), VerVCoord(v)[0],
00295 VerVCoord(v)[1],
00296 VerVCoord(v)[2]))
00297 {
00298 cont = MSD_lowFacVtxContainment(f, v);
00299 }
00300 else
00301 {
00302 cont = 0;
00303 }
00304
00305 #ifdef TRACE_BOOLEAN1
00306 if (cont == 1)
00307 {
00308 fprintf(trace, "*** Ocorre interseccao aresta-face\n");
00309 MSD_lowSetOpAddSOVF(v, f, BvxA);
00310 }
00311 #else
00312 if (cont == 1)
00313 {
00314 MSD_lowSetOpAddSOVF(v, f, BvxA);
00315 }
00316 #endif
00317
00318 if (cont == 2)
00319 {
00320 #ifdef TRACE_BOOLEAN1
00321 fprintf(trace, "*** Ocorre interseccao aresta-aresta\n");
00322 #endif
00323 MSD_lowMEV(hithe, HalNxt(mate(hithe)), maxv++,
00324 VerVCoord(v)[0],
00325 VerVCoord(v)[1],
00326 VerVCoord(v)[2]);
00327 MSD_lowSetOpAddSOVV(v, HalVtx(hithe), BvxA);
00328 }
00329
00330 #ifdef TRACE_BOOLEAN1
00331 if (cont == 3)
00332 {
00333 fprintf(trace, "*** Ocorre interseccao aresta-vertice\n");
00334 MSD_lowSetOpAddSOVV(v, hitvertex, BvxA);
00335 }
00336 #else
00337 if (cont == 3)
00338 {
00339 MSD_lowSetOpAddSOVV(v, hitvertex, BvxA);
00340 }
00341 #endif
00342
00343 #ifdef TRACE_BOOLEAN1
00344 if (cont == 0)
00345 {
00346 fprintf(trace, "*** Nao ocorre interseccao\n");
00347 }
00348 #endif
00349 }
00350
00351 void MSD_lowSetOpAddSOVF(VPTYPE v, FPTYPE f, int flag)
00352 {
00353 int i;
00354
00355 #ifdef TRACE_BOOLEAN1
00356 if (flag == 0)
00357 {
00358 fprintf(trace, "*** Vertice Objeto A e Face Objeto B\n");
00359 }
00360 if (flag == 1)
00361 {
00362 fprintf(trace, "*** Vertice Objeto B e Face Objeto A\n");
00363 }
00364 trace_v(v);
00365 trace_f(f);
00366 #endif
00367
00368 if (flag == 0)
00369 {
00370 for (i = 0; i < nvtxa; ++i)
00371
00372 #ifdef TRACE_BOOLEAN1
00373 {
00374 if ((SetAVFv(i) == v) && (SetAVFf(i) == f))
00375 {
00376 fprintf(trace,
00377 "*** Nao foi acrescentado a estrutura - (sonva) repetido\n");
00378 return;
00379 }
00380 }
00381 #else
00382 {
00383 if ((SetAVFv(i) == v) && (SetAVFf(i) == f))
00384 {
00385 return;
00386 }
00387 }
00388 #endif
00389
00390 SetAVFv(nvtxa) = v;
00391 SetAVFf(nvtxa) = f;
00392 nvtxa++;
00393
00394 #ifndef __VIRTUAL_MEM
00395 if (nvtxa == MAXONVERTICES)
00396 {
00397 fprintf(stderr, "sonva: falta memoria!\n");
00398 exit(1);
00399 }
00400 #endif
00401 }
00402 else
00403 {
00404 for (i = 0; i < nvtxb; ++i)
00405
00406 #ifdef TRACE_BOOLEAN1
00407 {
00408 if ((SetBVFv(i) == v) && (SetBVFf(i) == f))
00409 {
00410 fprintf(trace,
00411 "*** Nao foi acrescentado a estrutura - (sonvb) repetido\n");
00412 return;
00413 }
00414 }
00415 #else
00416 {
00417 if ((SetBVFv(i) == v) && (SetBVFf(i) == f))
00418 {
00419 return;
00420 }
00421 }
00422 #endif
00423
00424 SetBVFv(nvtxb) = v;
00425 SetBVFf(nvtxb) = f;
00426 nvtxb++;
00427
00428 #ifndef __VIRTUAL_MEM
00429 if (nvtxb == MAXONVERTICES)
00430 {
00431 fprintf(stderr, "sonvb: falta memoria!\n");
00432 exit(1);
00433 }
00434 #endif
00435 }
00436 }
00437
00438 void MSD_lowSetOpAddSOVV(VPTYPE v1, VPTYPE v2, int flag)
00439 {
00440 int i;
00441
00442 #ifdef TRACE_BOOLEAN1
00443 if (flag == 0)
00444 {
00445 fprintf(trace, "*** Vertice Objeto A e Vertice Objeto B\n");
00446 }
00447 if (flag == 1)
00448 {
00449 fprintf(trace, "*** Vertice Objeto B e Vertice Objeto A\n");
00450 }
00451 trace_v(v1);
00452 trace_v(v2);
00453 #endif
00454
00455 if (flag == 0)
00456 {
00457 for (i = 0; i < nvvtx; ++i)
00458
00459 #ifdef TRACE_BOOLEAN1
00460 {
00461 if ((SetVVva(i) == v1) && (SetVVvb(i) == v2))
00462 {
00463 fprintf(trace,
00464 "*** Nao foi acrescentado a estrutura - (sonvv) repetido\n");
00465 return;
00466 }
00467 }
00468 #else
00469 {
00470 if ((SetVVva(i) == v1) && (SetVVvb(i) == v2))
00471 {
00472 return;
00473 }
00474 }
00475 #endif
00476
00477 SetVVva(nvvtx) = v1;
00478 SetVVvb(nvvtx) = v2;
00479 nvvtx++;
00480
00481 #ifndef __VIRTUAL_MEM
00482 if (nvvtx == MAXONVERTICES)
00483 {
00484 fprintf(stderr, "sonvv: falta memoria!\n");
00485 exit(1);
00486 }
00487 #endif
00488 }
00489 else
00490 {
00491 for (i = 0; i < nvvtx; ++i)
00492
00493 #ifdef TRACE_BOOLEAN1
00494 {
00495 if ((SetVVva(i) == v2) && (SetVVvb(i) == v1))
00496 {
00497 fprintf(trace,
00498 "*** Nao foi acrescentado a estrutura - (sonvv) repetido\n");
00499 return;
00500 }
00501 }
00502 #else
00503 {
00504 if ((SetVVva(i) == v2) && (SetVVvb(i) == v1))
00505 {
00506 return;
00507 }
00508 }
00509 #endif
00510
00511 SetVVva(nvvtx) = v2;
00512 SetVVvb(nvvtx) = v1;
00513 nvvtx++;
00514
00515 #ifndef __VIRTUAL_MEM
00516 if (nvvtx == MAXONVERTICES)
00517 {
00518 fprintf(stderr, "sonvv: falta memoria!\n");
00519 exit(1);
00520 }
00521 #endif
00522 }
00523 }
00524
00525
00526
00527
00528 int MSD_lowSetOpFacPntContainment(FPTYPE f, real x, real y, real z)
00529 {
00530 #ifndef __VIRTUAL_MEM
00531 VTYPE v;
00532
00533 v.vcoord[0] = x;
00534 v.vcoord[1] = y;
00535 v.vcoord[2] = z;
00536 return(MSD_lowFacVtxContainment(f, &v));
00537
00538 #else
00539 VPTYPE v;
00540 int ip;
00541
00542 v = MSD_getMemVirtual(VERTEX);
00543
00544 VerVCoord(v)[0] = x;
00545 VerVCoord(v)[1] = y;
00546 VerVCoord(v)[2] = z;
00547 ip = MSD_lowFacVtxContainment(f, v);
00548
00549 MSD_putMemVirtual(v, VERTEX);
00550
00551 return(ip);
00552 #endif
00553
00554 }