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 #ifndef _Windows
00044 #include <graphics.h>
00045 #endif
00046 #include <conio.h>
00047 #endif
00048 #include <math.h>
00049 #include "mensagem.h"
00050 #include "memvirtu.h"
00051 #include "lowparam.h"
00052 #include "lowmacro.h"
00053 #include "lowsolid.h"
00054 #include "genfunc_.h"
00055 #include "vectorop.h"
00056 #include "eulerops.h"
00057 #include "mancommd.h"
00058 #include "analise_.h"
00059 #include "basrov__.h"
00060 #include "shpshape.h"
00061 #include "sethmain.h"
00062
00063 double MSD_lowSolidAreaProjetada(SPTYPE s);
00064
00065 void MSD_execNameAreaProjetada(void)
00066 {
00067 char name1[12];
00068 float dx, dy, dz;
00069 real area, dim;
00070
00071 while (4 != sscanf(restbuf, "%s %f %f %f", name1, &dx, &dy, &dz))
00072 {
00073 printf("area projetada: Nome dx dy dz");
00074 if (!lineins("? "))
00075 {
00076 return;
00077 }
00078 }
00079 MSD_highNameAreaProjetada(name1, dx, dy, dz, &area, &dim);
00080 printf("solido %s tem area proj. %f e dim. princ. %f\n", name1, area, dim);
00081 }
00082
00083 int MSD_highNameAreaProjetada(char *name, real dx, real dy, real dz, real *area, real *dim)
00084 {
00085 int sn;
00086
00087 if ((sn = MSD_getSolidIdFromName(name)) == -1)
00088 {
00089 fprintf(stderr, MEN_NaoEncontrouSolidNome, NAM_AreaProjetada, name);
00090 *area = *dim = 0.0;
00091 return(ERROR);
00092 }
00093 return(MSD_highAreaProjetada(sn, dx, dy, dz, area, dim));
00094 }
00095
00096 int MSD_highAreaProjetada(Id sn, real dx, real dy, real dz, real *area, real *dim)
00097 {
00098 SPTYPE s;
00099
00100 if ((s = MSD_getSolid(sn)) == SNIL)
00101 {
00102 fprintf(stderr, MEN_NaoEncontrouSolido, NAM_AreaProjetada, sn);
00103 *area = *dim = 0.0;
00104 return(ERROR);
00105 }
00106 return(MSD_lowAreaProjetada(s, dx, dy, dz, area, dim, 1));
00107 }
00108
00109 int MSD_lowAreaProjetada(SPTYPE s, real dx, real dy, real dz, real *area,
00110 real *dim, int flag)
00111 {
00112 SPTYPE sp;
00113 vector dir, normal;
00114
00115 makevec(normal, 0.0, 0.0, 1.0, 0.0);
00116 makevec(dir, dx, dy, dz, 0.0);
00117 sp = MSD_CriaListaDePoligonosCoplanares(s, dir);
00118 *area = MSD_lowSolidAreaProjetada(sp);
00119 *dim = MSD_lowSolidDimensaoPrincipal(sp, normal);
00120
00121 if (flag == 1)
00122 {
00123 MSD_highNameSoftRemove("st");
00124 }
00125 return(SUCCESS);
00126 }
00127
00128 void MSD_lowMakeUnion(FPTYPE f, vector dir)
00129 {
00130 XY xy[30];
00131 LPTYPE l;
00132 LPTYPE FaFOtf;
00133 HPTYPE he1;
00134 HPTYPE he2;
00135 vector a;
00136
00137
00138
00139
00140
00141 int j;
00142
00143 if (dot(dir, FacFeq(f)) < EPS)
00144 {
00145 return;
00146 }
00147 FaFOtf = FacFLOut(f);
00148 he1 = LooLEdg(FaFOtf);
00149 he2 = he1;
00150 MSD_lowRebatePontoNoPlano(VerVCoord(HalVtx(he1)), a, dir);
00151 xy[0].x = a[0];
00152 xy[0].y = a[1];
00153 he1 = HalNxt(he1);
00154 j = 1;
00155 do
00156 {
00157 MSD_lowRebatePontoNoPlano(VerVCoord(HalVtx(he1)), a, dir);
00158 xy[j].x = a[0];
00159 xy[j++].y = a[1];
00160 } while ((he1 = HalNxt(he1)) != he2);
00161 MSD_highNameMakePrism("p1", j, 100.0, xy);
00162
00163
00164
00165
00166
00167 for (AllLoopsFace(f, l))
00168 {
00169 if (l == FaFOtf)
00170 {
00171 continue;
00172 }
00173 he1 = LooLEdg(l);
00174 he2 = he1;
00175 MSD_lowRebatePontoNoPlano(VerVCoord(HalVtx(he1)), a, dir);
00176 xy[0].x = a[0];
00177 xy[0].y = a[1];
00178 he1 = HalNxt(he1);
00179 j = 1;
00180 do
00181 {
00182 MSD_lowRebatePontoNoPlano(VerVCoord(HalVtx(he1)), a, dir);
00183 xy[j].x = a[0];
00184 xy[j].y = a[1];
00185 } while ((he1 = HalNxt(he1)) != he2);
00186 MSD_highNameMakePrism("p2", j, 1.0, xy);
00187 MSD_highNameDifference("p1", "p2", "df");
00188 MSD_highNameRenameSolid("df", "p1");
00189 }
00190
00191 if (MSD_getSolidIdFromName("st") == -1)
00192 {
00193 MSD_highNameRenameSolid("p1", "st");
00194 }
00195 else
00196 {
00197 MSD_highNameUnion("st", "p1", "un");
00198 MSD_highNameRenameSolid("un", "st");
00199
00200
00201
00202
00203
00204 }
00205 }
00206
00207 void MSD_lowMoveFace(FPTYPE f, vector dir)
00208 {
00209 FPTYPE f2;
00210 LPTYPE l;
00211 HPTYPE he;
00212 HPTYPE LoLEdl;
00213
00214 if (FacFlag(f) == 0)
00215 {
00216 MSD_lowMakeUnion(f, dir);
00217 }
00218 FacFlag(f) = 2;
00219
00220 l = FacFLOut(f);
00221 he = LoLEdl = LooLEdg(l);
00222 do
00223 {
00224 f2 = LooLFace(HalWLoop(mate(he)));
00225 if (FacFlag(f2) == 0)
00226 {
00227 MSD_lowMakeUnion(f2, dir);
00228 FacFlag(f2) = 1;
00229 }
00230 } while ((he = HalNxt(he)) != LoLEdl);
00231
00232 for (AllLoopsFace(f, l))
00233 {
00234 LoLEdl = LooLEdg(l);
00235 he = LooLEdg(l);
00236 do
00237 {
00238 f2 = LooLFace(HalWLoop(mate(he)));
00239 if (FacFlag(f2) != 2)
00240 {
00241 MSD_lowMoveFace(f2, dir);
00242 }
00243 } while ((he = HalNxt(he)) != LoLEdl);
00244 }
00245 }
00246
00247 SPTYPE MSD_CriaListaDePoligonosCoplanares(SPTYPE s, vector dir)
00248 {
00249 DPTYPE dd;
00250 FPTYPE ff;
00251
00252 for (AllShellsSolid(s, dd))
00253 {
00254 for (AllFacesShell(dd, ff))
00255 {
00256 FacFlag(ff) = 0;
00257 }
00258 MSD_lowMoveFace(SheSFaces(dd), dir);
00259 }
00260 return(MSD_lowFindSolidByName("st"));
00261 }
00262
00263
00264
00265 int MSD_lowMaximaDirecao(vector p)
00266 {
00267 if ((MSD_lowModuloReal(p[0]) >= MSD_lowModuloReal(p[1])) &&
00268 (MSD_lowModuloReal(p[0]) >= MSD_lowModuloReal(p[2])))
00269 {
00270 return(0);
00271 }
00272 else
00273 {
00274 return(MSD_lowModuloReal(p[1]) >= MSD_lowModuloReal(p[2]) ? 1 : 2);
00275 }
00276 }
00277
00278
00279
00280
00281
00282 void MSD_lowRebatePontoNoPlano(vector p2, vector pp, vector dir)
00283 {
00284 real raz, ang;
00285 vector dirz, axis;
00286 matrix mat;
00287
00288 makevec(dirz, 0.0, 0.0, 1.0, 1.0);
00289 normalize(dirz);
00290 normalize(dir);
00291 cross(axis, dirz, dir);
00292 normalize(axis);
00293 ang = acos(dot(dirz, dir));
00294 rotmat(axis, -ang, mat);
00295
00296 raz = dot(p2, dir);
00297 pp[0] = p2[0] - raz * dir[0];
00298 pp[1] = p2[1] - raz * dir[1];
00299 pp[2] = p2[2] - raz * dir[2];
00300 pp[3] = 1.0;
00301 vecmult(pp, pp, mat);
00302 }
00303
00304 real MSD_lowModuloReal(real num)
00305 {
00306 return(num <= 0 ? -num : num);
00307 }
00308
00309 double MSD_lowSolidAreaProjetada(SPTYPE s)
00310 {
00311 DPTYPE d;
00312 FPTYPE f;
00313 double varea;
00314 vector normal;
00315
00316 makevec(normal, 0.0, 0.0, 1.0, 0.0);
00317 varea = 0.0;
00318 for (AllShellsSolid(s, d))
00319 {
00320 for (AllFacesShell(d, f))
00321 {
00322 if (dot(normal, FacFeq(f)) > 0)
00323 {
00324 varea += MSD_lowFaceArea(f);
00325 }
00326 }
00327 }
00328 return(-varea);
00329 }
00330
00331 double MSD_lowSolidDimensaoPrincipal(SPTYPE s, vector normal)
00332 {
00333 DPTYPE d;
00334 FPTYPE f;
00335 HPTYPE he1;
00336 HPTYPE he2;
00337 double dim, dd;
00338 vector v1, v2;
00339 HPTYPE LLEFFLF;
00340
00341 dim = 0.0;
00342 for (AllShellsSolid(s, d))
00343 {
00344 for (AllFacesShell(d, f))
00345 {
00346 if (dot(normal, FacFeq(f)) > 0)
00347 {
00348 he1 = LLEFFLF = LooLEdg(FacFLoops(f));
00349 do
00350 {
00351 he2 = LLEFFLF;
00352 do
00353 {
00354 if (he1 != he2)
00355 {
00356 veccopy(v1, VerVCoord(HalVtx(he1)));
00357 veccopy(v2, VerVCoord(HalVtx(he2)));
00358 dd = vecd(v1, v2);
00359 if (dd > dim)
00360 {
00361 dim = dd;
00362 }
00363 }
00364 } while ((he2 = HalNxt(he2)) != LLEFFLF);
00365 } while ((he1 = HalNxt(he1)) != LLEFFLF);
00366 }
00367 }
00368 }
00369 return(dim);
00370 }