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 #include <string.h>
00043 #include "memvirtu.h"
00044 #include "lowparam.h"
00045 #include "lowmacro.h"
00046 #include "lowsolid.h"
00047 #include "eulerops.h"
00048 #include "vectorop.h"
00049 #include "shpshape.h"
00050 #include "splsplit.h"
00051
00052
00053 void MSD_lowSplitConnect(void)
00054 {
00055 EPTYPE nextedge;
00056 HPTYPE h1;
00057 HPTYPE h2;
00058
00059 #ifdef TRACE_SPLIT
00060 int i;
00061
00062 fprintf(trace, "\n\n\n");
00063 fprintf(trace, "*************************************************\n");
00064 fprintf(trace, "* *\n");
00065 fprintf(trace, "* SETSPLITCONNECT *\n");
00066 fprintf(trace, "* *\n");
00067 fprintf(trace, "*************************************************\n");
00068 fprintf(trace, "\n");
00069 #endif
00070
00071 spl_null_edge_pointer = spl_nend = spl_nfac = 0;
00072 MSD_lowSortNullEdge();
00073 while ((nextedge = MSD_lowGetNextNullEdge()) != ENIL)
00074 {
00075 if ((h1 = MSD_lowCanJoin(EdgHe1(nextedge))) != HNIL)
00076 {
00077 #ifdef TRACE_SPLIT3
00078 fprintf(trace, "*** Une as arestas do solido ");
00079 #endif
00080 MSD_lowJoin(h1, EdgHe1(nextedge));
00081 if (!MSD_lowIsLoose(mate(h1)))
00082 {
00083 MSD_lowCut(h1);
00084 }
00085 }
00086 if ((h2 = MSD_lowCanJoin(EdgHe2(nextedge))) != HNIL)
00087 {
00088 #ifdef TRACE_SPLIT3
00089 fprintf(trace, "*** Une as arestas do solido ");
00090 #endif
00091 MSD_lowJoin(h2, EdgHe2(nextedge));
00092 if (!MSD_lowIsLoose(mate(h2)))
00093 {
00094 MSD_lowCut(h2);
00095 }
00096 }
00097 if ((h1 != HNIL) && (h2 != HNIL))
00098 {
00099 MSD_lowCut(EdgHe1(nextedge));
00100 }
00101 }
00102
00103 #ifdef TRACE_SPLIT
00104 fprintf(trace, "\n");
00105 fprintf(trace, "*** setsplitconnect *** - nfac = %2i\n", spl_nfac);
00106 fprintf(trace, "*** estrutura sonf ***\n");
00107 for (i = 0; i < spl_nfac; i++)
00108 {
00109 trace_f(SplSonf(i));
00110 }
00111 #endif
00112 }
00113
00114 HPTYPE MSD_lowCanJoin(HPTYPE he)
00115 {
00116 HPTYPE ret;
00117 int i, j;
00118
00119 #ifdef TRACE_SPLIT3
00120 fprintf(trace, "*** canjoin\n");
00121 trace_he(he);
00122 #endif
00123
00124 for (i = 0; i < spl_nend; ++i)
00125 {
00126 if (MSD_lowNeighbor(he, SplEnds(i)))
00127 {
00128 ret = SplEnds(i);
00129 for (j = i + 1; j < spl_nend; ++j)
00130 {
00131 SplEnds(j - 1) = SplEnds(j);
00132 }
00133 spl_nend--;
00134 #ifdef TRACE_BOOLEAN3
00135 fprintf(trace, "*** canjoin - OK - join is possible\n");
00136 trace_he(ret);
00137 #endif
00138 return(ret);
00139 }
00140 }
00141 SplEnds(spl_nend) = he;
00142 spl_nend++;
00143 #ifdef TRACE_BOOLEAN3
00144 fprintf(trace, "*** canjoin - join is not possible\n");
00145 #endif
00146 return(HNIL);
00147 }
00148
00149
00150 void MSD_lowJoin(HPTYPE h1, HPTYPE h2)
00151 {
00152 FPTYPE oldf;
00153 FPTYPE newf;
00154
00155 #ifdef TRACE_SPLIT3
00156 int flag;
00157 flag = 0;
00158 #endif
00159
00160 oldf = LooLFace(HalWLoop(h1));
00161 newf = FNIL;
00162 if (HalWLoop(h1) == HalWLoop(h2))
00163 {
00164 #ifdef TRACE_SPLIT3
00165 if (HalPrv(HalPrv(h1)) != h2)
00166 {
00167 fprintf(trace, " (MEF) ***\n");
00168 trace_he(h1);
00169 trace_he(HalNxt(h2));
00170 newf = MSD_lowMEF(h1, HalNxt(h2), maxf++);
00171 flag = 1;
00172 }
00173 #else
00174 if (HalPrv(HalPrv(h1)) != h2)
00175 {
00176 newf = MSD_lowMEF(h1, HalNxt(h2), maxf++);
00177 }
00178 #endif
00179 }
00180 #ifdef TRACE_SPLIT3
00181 else
00182 {
00183 fprintf(trace, " (MEKR) ***\n");
00184 trace_he(h1);
00185 trace_he(HalNxt(h2));
00186 MSD_lowMEKR(h1, HalNxt(h2));
00187 flag = 1;
00188 }
00189 #else
00190 else
00191 {
00192 MSD_lowMEKR(h1, HalNxt(h2));
00193 }
00194 #endif
00195
00196 if (HalNxt(HalNxt(h1)) != h2)
00197 {
00198 #ifdef TRACE_SPLIT3
00199 if (flag == 1)
00200 {
00201 fprintf(trace, "*** Une as arestas novamente ");
00202 }
00203 fprintf(trace, " (MEF) \n");
00204 trace_he(h2);
00205 trace_he(HalNxt(h1));
00206 #endif
00207 MSD_lowMEF(h2, HalNxt(h1), maxf++);
00208
00209 #ifdef TRACE_SPLIT3
00210 if ((newf != FNIL) && (LooNextL(FacFLoops(oldf)) != LNIL))
00211 {
00212 fprintf(trace, "*** Operador (LARINGMV) \n");
00213 MSD_lowAllRingMove(oldf, newf);
00214 }
00215 #else
00216 if ((newf != FNIL) && (LooNextL(FacFLoops(oldf)) != LNIL))
00217 {
00218 MSD_lowAllRingMove(oldf, newf);
00219 }
00220 #endif
00221 }
00222 }
00223
00224 void MSD_lowCut(HPTYPE he)
00225 {
00226 if (HalWLoop(EdgHe1(HalEdg(he))) == HalWLoop(EdgHe2(HalEdg(he))))
00227 {
00228 #ifdef TRACE_SPLIT3
00229 fprintf(trace, "*** Corta Solido (KEMR) ***\n");
00230 trace_he(EdgHe1(HalEdg(he)));
00231 fprintf(trace, "*** Acrescenta Face Solido A (sonfa)\n");
00232 trace_f(LooLFace(HalWLoop(he)));
00233 #endif
00234 SplSonf(spl_nfac) = LooLFace(HalWLoop(he));
00235 spl_nfac++;
00236 MSD_lowKEMR(EdgHe1(HalEdg(he)), EdgHe2(HalEdg(he)));
00237 }
00238
00239 #ifdef TRACE_SPLIT3
00240 else
00241 {
00242 fprintf(trace, "*** Corta Solido (KEF) ***\n");
00243 trace_he(EdgHe1(HalEdg(he)));
00244 MSD_lowKEF(EdgHe1(HalEdg(he)), EdgHe2(HalEdg(he)));
00245 }
00246 #else
00247 else
00248 {
00249 MSD_lowKEF(EdgHe1(HalEdg(he)), EdgHe2(HalEdg(he)));
00250 }
00251 #endif
00252 }
00253
00254
00255 int MSD_lowNeighbor(HPTYPE he1, HPTYPE he2)
00256 {
00257 return(LooLFace(HalWLoop(he1)) == LooLFace(HalWLoop(he2)) &&
00258 ((he1 == EdgHe1(HalEdg(he1)) && he2 == EdgHe2(HalEdg(he2))) ||
00259 (he1 == EdgHe2(HalEdg(he1)) && he2 == EdgHe1(HalEdg(he2)))));
00260 }
00261
00262 int MSD_lowIsLoose(HPTYPE he)
00263 {
00264 int i;
00265
00266 for (i = 0; i < spl_nend; i++)
00267 {
00268 if (SplEnds(i) == he)
00269 {
00270 return(TRUE);
00271 }
00272 }
00273 return(FALSE);
00274 }
00275
00276 void MSD_lowSortNullEdge(void)
00277 {
00278 register int i, j;
00279
00280 if (spl_nedge < 5)
00281 {
00282 return;
00283 }
00284 for (i = 0; i < spl_nedge; i++)
00285 {
00286 for (j = i + 1; j < spl_nedge; j++)
00287 {
00288 if (MSD_lowGreater(i, j))
00289 {
00290 MSD_lowSwap(i, j);
00291 }
00292 }
00293 }
00294 }
00295
00296 int MSD_lowGreater(int i, int j)
00297 {
00298 vector v1, v2;
00299 register int com;
00300
00301 veccopy(v1, VerVCoord(HalVtx(EdgHe1(SplSone(i)))));
00302 veccopy(v2, VerVCoord(HalVtx(EdgHe2(SplSone(j)))));
00303 if ((com = comp(v1[0], v2[0], EPS)) == -1)
00304 {
00305 return(0);
00306 }
00307 if (com == 0)
00308 {
00309 if ((com = comp(v1[1], v2[1], EPS)) == -1)
00310 {
00311 return(0);
00312 }
00313 if (com == 0)
00314 {
00315 if (comp(v1[2], v2[2], EPS) == -1)
00316 {
00317 return(0);
00318 }
00319 }
00320 }
00321 return(1);
00322 }
00323
00324 void MSD_lowSwap(int i, int j)
00325 {
00326 register EPTYPE tmp;
00327
00328 tmp = SplSone(i);
00329 SplSone(i) = SplSone(j);
00330 SplSone(j) = tmp;
00331 }
00332
00333 EPTYPE MSD_lowGetNextNullEdge(void)
00334 {
00335 EPTYPE e;
00336
00337 if (spl_null_edge_pointer < spl_nedge)
00338 {
00339 e = SplSone(spl_null_edge_pointer);
00340 spl_null_edge_pointer++;
00341 return(e);
00342 }
00343 else
00344 {
00345 return(ENIL);
00346 }
00347 }