00001 #include <stdio.h>
00002 #include "mensagem.h"
00003 #include "memvirtu.h"
00004 #include "lowparam.h"
00005 #include "lowmacro.h"
00006 #include "lowsolid.h"
00007 #include "eulerops.h"
00008 #include "vectorop.h"
00009 #include "genfunc_.h"
00010 #include "analise_.h"
00011 #include "prop.h"
00012 #include "mancommd.h"
00013
00014 real MSD_highNamePropriedadeArea(char *name);
00015 real MSD_highPropriedadeArea(Id sn);
00016 double MSD_lowPropriedadeArea(SPTYPE s);
00017 double MSD_lowPropriedadeAreaFace(FPTYPE f);
00018 double MSD_lowPropriedadeAreaLaco(LPTYPE l);
00019
00020 void MSD_execManipulatePropriedade(void)
00021 {
00022 int ip ;
00023 char onam[30] ;
00024 matrix mat ;
00025 real area, volume;
00026 float cx, cy, cz ;
00027
00028 for (ip = 0 ; ip == 0 ; ) {
00029 switch(optin()) {
00030
00031
00032 case 'a':
00033 if (1 == sscanf(restbuf, "%s", onam)) {
00034 area = MSD_highNamePropriedadeArea(onam) ;
00035 ip = 1 ;
00036 printf("area = %f\n", - area);
00037 }
00038 break ;
00039
00040
00041 case 'v':
00042 if (1 == sscanf(restbuf, "%s", onam)) {
00043
00044 ip = 1 ;
00045 printf("volume = %f", volume);
00046 }
00047 break ;
00048
00049
00050
00051 case 'c':
00052 if (1 == sscanf(restbuf, "%s", onam)) {
00053
00054 ip = 1 ;
00055 printf("centro de gravidade = (%f,%f,%f)\n", cx, cy, cz);
00056 }
00057 break ;
00058
00059
00060
00061 case 'i':
00062 if (1 == sscanf(restbuf, "%s", onam)) {
00063
00064 ip = 1 ;
00065
00066 }
00067 break ;
00068
00069
00070
00071 }
00072 if (ip == 0) {
00073 printf("-avci nome do sólido\n") ;
00074 if (!lineins("? "))
00075 return ;
00076 }
00077 }
00078 }
00079
00080 real MSD_highNamePropriedadeArea(char *name)
00081 {
00082 int sn ;
00083
00084 if ((sn = MSD_getSolidIdFromName(name)) == -1) {
00085 fprintf(stderr, "area: nao encontrou o sólido %s!\n", name) ;
00086 return(ERROR) ;
00087 }
00088 return(MSD_highArea(sn)) ;
00089 }
00090
00091 real MSD_highPropriedadeArea(Id sn)
00092 {
00093 SPTYPE s ;
00094
00095 if ((s = MSD_getSolid(sn)) == SNIL) {
00096 fprintf(stderr, "area: nao encontrou o sólido %d!\n", sn) ;
00097 return(0.0) ;
00098 }
00099 return(MSD_lowPropriedadeArea(s)) ;
00100 }
00101
00102 double MSD_lowPropriedadeArea(SPTYPE s)
00103 {
00104 DPTYPE d;
00105 FPTYPE f;
00106 double area = 0;
00107
00108 for (d = SolSShells(s) ; d != DNIL ; d = SheNextD(d))
00109 for (f = SheSFaces(d) ; f != FNIL ; f = FacNextF(f))
00110 area += MSD_lowPropriedadeAreaFace(f);
00111 return(area);
00112 }
00113
00114 double MSD_lowPropriedadeAreaFace(FPTYPE f)
00115 {
00116 LPTYPE l;
00117 double area = 0;
00118
00119 area = MSD_lowPropriedadeAreaLaco(FacFLOut(f));
00120 for (l = FacFLoops(f) ; l != LNIL ; l = LooNextL(l))
00121 if (l != FacFLOut(f))
00122 area -= MSD_lowPropriedadeAreaLaco(l);
00123 return(area);
00124 }
00125
00126
00127 double MSD_lowPropriedadeAreaLaco(LPTYPE l)
00128 {
00129 HPTYPE he ;
00130 VPTYPE v1 ;
00131 vector aa, bb, cc, dd, vv1 ;
00132
00133 veczer(dd) ;
00134 he = LooLEdg(l) ;
00135 v1 = HalVtx(he) ;
00136 he = HalNxt(he) ;
00137 do {
00138 veccopy(vv1, VerVCoord(v1)) ;
00139 vecminus(aa, VerVCoord(HalVtx(he)), vv1) ;
00140 vecminus(bb, VerVCoord(HalVtx(HalNxt(he))), vv1) ;
00141 cross(cc, aa, bb) ;
00142 vecplus(dd, dd, cc) ;
00143 } while ((he = HalNxt(he)) != LooLEdg(l)) ;
00144 return(-0.5 * dot(FacFeq(LooLFace(l)), dd)) ;
00145 }