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 "lowmacro.h"
00045 #include "lowparam.h"
00046 #include "lowsolid.h"
00047 #include "eulerops.h"
00048 #include "vectorop.h"
00049 #include "mancommd.h"
00050 #include "rndround.h"
00051
00052 int GenerationCurved_edges(SPTYPE s)
00053 {
00054 EdgesAttachedOriginal_vertex(s);
00055 EdgeAttached_vertexfase1(s);
00056 return(SUCCESS);
00057 }
00058
00059 int EdgesAttachedOriginal_vertex(SPTYPE s)
00060 {
00061 DPTYPE d;
00062 VPTYPE v;
00063 VPTYPE v1;
00064 EPTYPE e;
00065 int n0, nt, n1, flag;
00066
00067 for (AllShellsSolid(s, d))
00068 {
00069 for (AllEdgesShell(d, e))
00070 {
00071 if ((EdgFgRound(e) != 1) || (EdgFgMake(e) == 3))
00072 {
00073 EdgFgRound(e) = 0;
00074 }
00075 }
00076 }
00077
00078 for (AllShellsSolid(s, d))
00079 {
00080 for (v = SheSVerts(d); v != VNIL;)
00081 {
00082 if (VerFgMake(v) == 0)
00083 {
00084 flag = 0;
00085 nt = GetEdges(v, -1);
00086 n0 = GetEdges(v, 0);
00087 n1 = GetEdges(v, 1);
00088
00089
00090 printf("v = (%f,%f,%f) n0=%d n1=%d nt=%d\n", VerVCoord(v)[0],
00091 VerVCoord(v)[1],
00092 VerVCoord(v)[2], n0, n1, nt);
00093
00094
00095 if (n0 == nt)
00096 {
00097 v1 = v;
00098 v = VerNextV(v);
00099 flag = 1;
00100 if (edv1(v1) == v)
00101 {
00102 v = VerNextV(v1);
00103 }
00104 }
00105 if ((n0 == 1) && (nt > 3))
00106 {
00107 v1 = v;
00108 v = VerNextV(v);
00109 flag = 1;
00110 edv3(s, v1);
00111 }
00112 if (n1 == 2)
00113 {
00114 v1 = v;
00115 v = VerNextV(v);
00116 flag = 1;
00117 if (edv2(s, v1) == v)
00118 {
00119 v = VerNextV(v1);
00120 }
00121 }
00122 if ((nt == 3) && (n0 == 2) && (n1 == 1))
00123 {
00124 v1 = v;
00125 v = VerNextV(v);
00126 flag = 1;
00127 edv4(s, v1);
00128 }
00129 if (flag == 0)
00130 {
00131 v = VerNextV(v);
00132 }
00133 }
00134 else
00135 {
00136 v = VerNextV(v);
00137 }
00138 }
00139 }
00140 printf("[saiu]");
00141 return(SUCCESS);
00142 }
00143
00144 VPTYPE edv1(VPTYPE v)
00145 {
00146 HPTYPE he;
00147 HPTYPE he1;
00148 HPTYPE heaux;
00149
00150 #ifdef __TRACE_ROUND__
00151 printf("iedv1\n");
00152 #endif
00153
00154 he = heaux = VerVEdge(v);
00155 do
00156 {
00157 if (he != heaux)
00158 {
00159 he1 = HalNxt(mate(he));
00160 MSD_lowKEF(he, mate(he));
00161 he = he1;
00162 }
00163 else
00164 {
00165 he = HalNxt(mate(he));
00166 }
00167 } while (he != heaux);
00168
00169 MSD_lowKEV(he, mate(he));
00170 return(v);
00171 }
00172
00173 VPTYPE edv2(SPTYPE s, VPTYPE v)
00174 {
00175 HPTYPE he;
00176 HPTYPE he2;
00177 HPTYPE he1;
00178 VPTYPE v1;
00179 vector p, vaux;
00180
00181 #ifdef __TRACE_ROUND__
00182 printf("iedv2\n");
00183 #endif
00184
00185 he = he2 = VerVEdge(v);
00186 do
00187 {
00188 if (EdgFgRound(HalEdg(he)) == 1)
00189 {
00190 he2 = he;
00191 break;
00192 }
00193 } while ((he = HalNxt(mate(he))) != VerVEdge(v));
00194
00195 he = he2;
00196 do
00197 {
00198 printf("!");
00199 if (EdgFgRound(HalEdg(he)) == 0)
00200 {
00201 he1 = HalNxt(mate(he));
00202 MSD_lowKEF(he, mate(he));
00203 he = he1;
00204 }
00205 else
00206 {
00207 he = HalNxt(mate(he));
00208 }
00209 } while (he != he2);
00210
00211 veccopy(p, VerVCoord(HalVtx(he)));
00212 VerFgMake(HalVtx(he)) = 3;
00213 he2 = HalPrv(he);
00214 MSD_lowNewVertexLocation(s, HalVtx(he), VerVCoord(HalVtx(he2))[0],
00215 VerVCoord(HalVtx(he2))[1],
00216 VerVCoord(HalVtx(he2))[2]);
00217
00218 v1 = HalVtx(he2);
00219 MSD_lowKEV(he2, mate(he2));
00220 veccopy(vaux, VerVCoord(HalVtx(he)));
00221 CLC(s, he, vaux, VerVCoord(HalVtx(mate(he))), p);
00222
00223 return(v1);
00224 }
00225
00226 VPTYPE edv3(SPTYPE s, VPTYPE v)
00227 {
00228 HPTYPE he;
00229 HPTYPE heaux;
00230 HPTYPE he1;
00231 HPTYPE he2;
00232 vector vaux, vau1;
00233
00234 #ifdef __TRACE_ROUND__
00235 printf("iedv3\n");
00236 #endif
00237
00238 maxf = MSD_getMaxFaceId(s);
00239 heaux = VerVEdge(v);
00240 he = heaux;
00241 do
00242 {
00243 if (EdgFgRound(HalEdg(he)) == 0)
00244 {
00245 heaux = he;
00246 he = VerVEdge(v);
00247 }
00248 else
00249 {
00250 he = HalNxt(mate(he));
00251 }
00252 } while (he != VerVEdge(v));
00253 he1 = HalPrv(heaux);
00254 MSD_lowKEF(heaux, mate(heaux));
00255 he2 = HalNxt(HalNxt(he1));
00256 MSD_lowMEF(he1, he2, ++maxf);
00257 veccopy(vaux, VerVCoord(HalVtx(he1)));
00258 veccopy(vau1, VerVCoord(HalVtx(HalPrv(he1))));
00259 CLC(s, HalPrv(he1), vaux, vau1, VerVCoord(HalVtx(HalNxt(he1))));
00260
00261 return(v);
00262 }
00263
00264 VPTYPE edv4(SPTYPE s, VPTYPE v)
00265 {
00266 HPTYPE he;
00267 HPTYPE he1;
00268 HPTYPE he2;
00269 vector vaux, vau1;
00270
00271 #ifdef __TRACE_ROUND__
00272 printf("iedv4\n");
00273 #endif
00274
00275 he = he1 = VerVEdge(v);
00276 do
00277 {
00278 if (EdgFgRound(HalEdg(he)) == 1)
00279 {
00280 he1 = he;
00281 break;
00282 }
00283 } while ((he = HalNxt(mate(he))) != VerVEdge(v));
00284
00285 he2 = HalPrv(mate(he1));
00286 he = he1;
00287 he1 = HalNxt(HalNxt(he1));
00288 MSD_lowKEF(he, mate(he));
00289 MSD_lowMEF(he2, he1, ++maxf);
00290 veccopy(vaux, VerVCoord(HalVtx(he2)));
00291 veccopy(vau1, VerVCoord(HalVtx(HalPrv(he2))));
00292 CLC(s, HalPrv(he1), vaux, vau1, VerVCoord(HalVtx(HalNxt(he2))));
00293 he = VerVEdge(v);
00294 MSD_lowKEF(HalNxt(mate(he)), mate(HalNxt(mate(he))));
00295 MSD_lowKEV(VerVEdge(v), mate(VerVEdge(v)));
00296 return(v);
00297 }
00298
00299 int EdgeAttached_vertexfase1(SPTYPE s)
00300 {
00301 DPTYPE d;
00302 EPTYPE e;
00303 EPTYPE eb;
00304 VPTYPE v;
00305 VPTYPE vb;
00306 vector p, p_aux, vaux, paux;
00307
00308 for (AllShellsSolid(s, d))
00309 {
00310 for (e = SheSEdges(d); e != ENIL;)
00311 {
00312 printf("[");
00313 if ((VerFgMake(HalVtx(EdgHe1(e))) == 1) &&
00314 (VerFgMake(HalVtx(EdgHe2(e))) == 1) &&
00315 ((EdgFgMake(e) == 0) || (EdgFgMake(e) == 1)) &&
00316 (EdgFgRound(e) != 1))
00317 {
00318 eb = e;
00319 e = EdgNextE(e);
00320 MSD_lowKEF(EdgHe1(eb), EdgHe2(eb));
00321 }
00322 else
00323 {
00324 e = EdgNextE(e);
00325 }
00326 }
00327 }
00328
00329 for (AllShellsSolid(s, d))
00330 {
00331 for (v = SheSVerts(d); v != VNIL;)
00332 {
00333 printf("(");
00334 if ((VerFgMake(v) == 1) && (GetEdges(v, -1) == 2))
00335 {
00336 veccopy(p, VerVCoord(v));
00337 veccopy(p_aux, VerVCoord(HalVtx(HalNxt(VerVEdge(v)))));
00338 MSD_lowNewVertexLocation(s, v, p_aux[0], p_aux[1], p_aux[2]);
00339 veccopy(vaux, VerVCoord(v));
00340 veccopy(paux, VerVCoord(HalVtx(HalPrv(VerVEdge(v)))));
00341 CLC(s, HalPrv(VerVEdge(v)), vaux, paux, p);
00342 vb = v;
00343 v = VerNextV(v);
00344 MSD_lowKEV(VerVEdge(vb), mate(VerVEdge(vb)));
00345 }
00346 else
00347 {
00348 v = VerNextV(v);
00349 }
00350 }
00351 }
00352
00353 for (AllShellsSolid(s, d))
00354 {
00355 for (v = SheSVerts(d); v != VNIL;)
00356 {
00357 printf("{");
00358 if (GetEdges(v, -1) == 2)
00359 {
00360 veccopy(p, VerVCoord(v));
00361 veccopy(p_aux, VerVCoord(HalVtx(HalNxt(VerVEdge(v)))));
00362 MSD_lowNewVertexLocation(s, v, p_aux[0], p_aux[1], p_aux[2]);
00363 veccopy(vaux, VerVCoord(v));
00364 veccopy(paux, VerVCoord(HalVtx(HalPrv(VerVEdge(v)))));
00365 CLC(s, HalPrv(VerVEdge(v)), vaux, paux, p);
00366 vb = v;
00367 v = VerNextV(v);
00368 printf("ke");
00369 MSD_lowKEV(VerVEdge(vb), mate(VerVEdge(vb)));
00370 printf("v");
00371 }
00372 else
00373 {
00374 v = VerNextV(v);
00375 }
00376 }
00377 }
00378 return(SUCCESS);
00379 }