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 "memvirtu.h"
00043 #include "lowparam.h"
00044 #include "lowmacro.h"
00045 #include "lowsolid.h"
00046 #include "vectorop.h"
00047 #include "disdispl.h"
00048
00049
00050 void MSD_lowSolidBoxFromBoxes(SPTYPE s, BTYPE *b)
00051 {
00052 DPTYPE d;
00053 FPTYPE f;
00054 int i;
00055
00056 for (i = 0; i < 3; i++)
00057 {
00058 b->max[i] = INF;
00059 b->min[i] = -INF;
00060 }
00061 for (AllShellsSolid(s, d))
00062 {
00063 for (AllFacesShell(d, f))
00064 {
00065 MSD_lowUpdateBox(&(FacBox(f)), b);
00066 }
00067 }
00068 }
00069
00070 int MSD_lowVertexInBox(BTYPE *b, real x, real y, real z)
00071 {
00072 if ((x < b->min[0]) || (x > b->max[0]))
00073 {
00074 return(FALSE);
00075 }
00076 if ((y < b->min[1]) || (y > b->max[1]))
00077 {
00078 return(FALSE);
00079 }
00080 if ((z < b->min[2]) || (z > b->max[2]))
00081 {
00082 return(FALSE);
00083 }
00084 return(TRUE);
00085 }
00086
00087
00088 int MSD_lowEdgeBoxIntersection(BTYPE *b, EPTYPE e)
00089 {
00090 int i;
00091 VPTYPE v1;
00092 VPTYPE v2;
00093
00094 v1 = HalVtx(EdgHe1(e));
00095 v2 = HalVtx(EdgHe2(e));
00096 for (i = 0; i < 3; i++)
00097 {
00098 if (MSD_lowEdgeBoxIntersectionAux(VerVCoord(v1)[i], VerVCoord(v2)[i],
00099 b->min[i], b->max[i]) == 0)
00100 {
00101 return(0);
00102 }
00103 }
00104 return(1);
00105 }
00106
00107 static int MSD_lowEdgeBoxIntersectionAux(real x1, real x2, real bx1, real bx2)
00108 {
00109 if (x1 > x2)
00110 {
00111 if (x1 < bx1)
00112 {
00113 return(0);
00114 }
00115 if (x2 > bx2)
00116 {
00117 return(0);
00118 }
00119 }
00120 else
00121 {
00122 if (x2 < bx1)
00123 {
00124 return(0);
00125 }
00126 if (x1 < bx2)
00127 {
00128 return(0);
00129 }
00130 }
00131 return(1);
00132 }
00133
00134
00135 int MSD_lowBoxBoxIntersection(BTYPE *b1, BTYPE *b2)
00136 {
00137 int i;
00138
00139 for (i = 0; i < 3; i++)
00140 {
00141 if (b1->min[i] > b2->max[i])
00142 {
00143 return(0);
00144 }
00145 if (b1->max[i] < b2->min[i])
00146 {
00147 return(0);
00148 }
00149 }
00150 return(1);
00151 }
00152
00153
00154 void MSD_lowSolidBox(SPTYPE s, BTYPE *bx)
00155 {
00156 DPTYPE d;
00157 VPTYPE v;
00158 int i;
00159
00160 v = SheSVerts(SolSShells(s));
00161 veccopy(bx->min, VerVCoord(v));
00162 veccopy(bx->max, VerVCoord(v));
00163 for (AllShellsSolid(s, d))
00164 {
00165 for (AllVerticesShell(d, v))
00166 {
00167 for (i = 0; i < 3; i++)
00168 {
00169 if (VerVCoord(v)[i] < bx->min[i])
00170 {
00171 bx->min[i] = VerVCoord(v)[i];
00172 }
00173 if (VerVCoord(v)[i] > bx->max[i])
00174 {
00175 bx->max[i] = VerVCoord(v)[i];
00176 }
00177 }
00178 }
00179 }
00180 MSD_lowWidenBox(bx, CONTBVEPS);
00181 }
00182
00183 void MSD_lowShellBox(DPTYPE d)
00184 {
00185 VPTYPE v;
00186 BTYPE *b;
00187 int i;
00188
00189 SetShellBoxOK(d);
00190 v = SheSVerts(d);
00191 b = &(SheBox(d));
00192 veccopy(b->min, VerVCoord(v));
00193 veccopy(b->max, VerVCoord(v));
00194 for (AllVerticesShell(d, v))
00195 {
00196 for (i = 0; i < 3; i++)
00197 {
00198 if (VerVCoord(v)[i] < b->min[i])
00199 {
00200 b->min[i] = VerVCoord(v)[i];
00201 }
00202 if (VerVCoord(v)[i] > b->max[i])
00203 {
00204 b->max[i] = VerVCoord(v)[i];
00205 }
00206 }
00207 }
00208 MSD_lowWidenBox(b, CONTBVEPS);
00209 }
00210
00211
00212 void MSD_lowFaceBox(FPTYPE f)
00213 {
00214 BTYPE *b;
00215 VPTYPE v;
00216 LPTYPE l;
00217 HPTYPE he;
00218 int i;
00219
00220 SetFaceBoxOK(f);
00221 b = &(FacBox(f));
00222 veccopy(b->min, VerVCoord(HalVtx(LooLEdg(FacFLOut(f)))));
00223 veccopy(b->max, VerVCoord(HalVtx(LooLEdg(FacFLOut(f)))));
00224 for (AllLoopsFace(f, l))
00225 {
00226 he = LooLEdg(l);
00227 do
00228 {
00229 v = HalVtx(he);
00230 for (i = 0; i < 3; i++)
00231 {
00232 if (VerVCoord(v)[i] < b->min[i])
00233 {
00234 b->min[i] = VerVCoord(v)[i];
00235 }
00236 if (VerVCoord(v)[i] > b->max[i])
00237 {
00238 b->max[i] = VerVCoord(v)[i];
00239 }
00240 }
00241 } while ((he = HalNxt(he)) != LooLEdg(l));
00242 }
00243 MSD_lowWidenBox(b, CONTBVEPS);
00244 }
00245
00246 void MSD_lowEdgeBox(BTYPE *b, EPTYPE e)
00247 {
00248 VPTYPE v1;
00249 VPTYPE v2;
00250 int i;
00251
00252 v1 = HalVtx(EdgHe1(e));
00253 v2 = HalVtx(EdgHe2(e));
00254 for (i = 0; i < 3; i++)
00255 {
00256 if (VerVCoord(v1)[i] > VerVCoord(v2)[i])
00257 {
00258 b->min[i] = VerVCoord(v2)[i];
00259 b->max[i] = VerVCoord(v1)[i];
00260 }
00261 else
00262 {
00263 b->max[i] = VerVCoord(v2)[i];
00264 b->min[i] = VerVCoord(v1)[i];
00265 }
00266 }
00267 MSD_lowWidenBox(b, CONTBVEPS);
00268 }
00269
00270
00271 void MSD_lowEvaluateSolidBoxes(SPTYPE s)
00272 {
00273 DPTYPE d;
00274 FPTYPE f;
00275
00276 for (AllShellsSolid(s, d))
00277 {
00278 MSD_lowShellBox(d);
00279 for (AllFacesShell(d, f))
00280 {
00281 MSD_lowFaceBox(f);
00282 }
00283 }
00284 }
00285
00286
00287 void MSD_lowWidenBox(BTYPE *b, real eps)
00288 {
00289 int i;
00290
00291 for (i = 0; i < 3; i++)
00292 {
00293 b->min[i] -= eps;
00294 b->max[i] += eps;
00295 }
00296 }
00297
00298
00299 void MSD_lowUpdateBox(BTYPE *b1, BTYPE *b)
00300 {
00301 int i;
00302
00303 for (i = 0; i < 3; i++)
00304 {
00305 if (b1->min[i] < b->min[i])
00306 {
00307 b->min[i] = b1->min[i];
00308 }
00309 if (b1->max[i] > b->max[i])
00310 {
00311 b->max[i] = b1->max[i];
00312 }
00313 }
00314 }
00315
00316
00317 void MSD_lowTranslateBox(BTYPE *b, real dx, real dy, real dz)
00318 {
00319 b->min[0] -= dx;
00320 b->min[1] -= dy;
00321 b->min[2] -= dz;
00322 b->max[0] += dx;
00323 b->max[1] += dy;
00324 b->max[2] += dz;
00325 }
00326
00327 void MSD_lowUpdateDEBox(void)
00328 {
00329 int i;
00330
00331 for (i = 0; i < 3; ++i)
00332 {
00333 if (desvtx[i] < deevtx[i])
00334 {
00335 debox.min[i] = desvtx[i] - abseps;
00336 debox.max[i] = deevtx[i] + abseps;
00337 }
00338 else
00339 {
00340 debox.min[i] = deevtx[i] - abseps;
00341 debox.max[i] = desvtx[i] + abseps;
00342 }
00343 }
00344 }