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 <math.h>
00043 #include "memvirtu.h"
00044 #include "lowmacro.h"
00045 #include "lowparam.h"
00046 #include "lowsolid.h"
00047 #include "vectorop.h"
00048 #include "analise_.h"
00049 #include "basrov__.h"
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 real MSD_determinaDistanciaParametrica(vector cc, vector dir, vector pp)
00061 {
00062 real d;
00063
00064 d = -dot(dir, pp);
00065 return(-(d + dot(dir, cc)) / dot(dir, dir));
00066 }
00067
00068 real MSD_determinaDimensaoPrincipalBarra(SPTYPE s, vector dir)
00069 {
00070 DPTYPE d;
00071 VPTYPE v;
00072 VPTYPE vmax;
00073 VPTYPE vmin;
00074 real pmax = -9999, pmin = 9999, dis;
00075 vector pc;
00076
00077 d = SolSShells(s);
00078 makevec(pc, 0.0, 0.0, 0.0, 1.0);
00079
00080 for (AllVerticesShell(d, v))
00081 {
00082 dis = MSD_determinaDistanciaParametrica(pc, dir, VerVCoord(v));
00083 if (pmax < dis)
00084 {
00085 pmax = dis;
00086 vmax = v;
00087 }
00088 if (pmin > dis)
00089 {
00090 pmin = dis;
00091 vmin = v;
00092 }
00093 }
00094
00095 veccopy(pc, VerVCoord(vmax));
00096 dis = MSD_determinaDistanciaParametrica(VerVCoord(vmin), dir, pc);
00097
00098 vecesc(pc, dir, dis);
00099 return(sqrt(dot(pc, pc)));
00100 }
00101
00102 real MSD_determinaMaiorDimensao(SPTYPE s)
00103 {
00104 switch (SolType(s))
00105 {
00106 case SOLIDO_TIPO_BARRA:
00107 switch (SolGeometria(s))
00108 {
00109 case BARRA_GEOM_CIRCULO:
00110 case BARRA_GEOM_QUADRADO:
00111 return(SolParam2(s));
00112
00113 case BARRA_GEOM_RETANGULO:
00114 case BARRA_GEOM_ELIPSE:
00115 case BARRA_GEOM_PERFIL_L:
00116 return(SolParam3(s));
00117
00118 case BARRA_GEOM_TRIANGULO:
00119 case BARRA_GEOM_PERFIL_I:
00120 case BARRA_GEOM_PERFIL_T:
00121 return(SolParam4(s));
00122
00123 default:
00124 return(0.0);
00125 }
00126
00127 case SOLIDO_TIPO_SOLID:
00128 return(0.0);
00129
00130 case SOLIDO_TIPO_PLACA:
00131 return(0.0);
00132
00133 default:
00134 return(0.0);
00135 }
00136 }
00137
00138 real MSD_determinaDimensaoPrincipal(SPTYPE s, vector dir, real dim)
00139 {
00140 SPTYPE sp;
00141 vector DirCalc;
00142
00143 switch (SolType(s))
00144 {
00145 case SOLIDO_TIPO_BARRA:
00146 if ((sp = MSD_getSolid(SolPerfil(s))) == SNIL)
00147 {
00148 return(0.0);
00149 }
00150 cross(DirCalc, dir, FacFeq(MSD_getFace(sp, 1)));
00151 if (!vecnull(DirCalc, 0.001))
00152 {
00153 switch (SolGeometria(s))
00154 {
00155 case BARRA_GEOM_CIRCULO:
00156 case BARRA_GEOM_QUADRADO:
00157 case BARRA_GEOM_TRIANGULO:
00158 case BARRA_GEOM_RETANGULO:
00159 case BARRA_GEOM_ELIPSE:
00160 case BARRA_GEOM_PERFIL_L:
00161 case BARRA_GEOM_PERFIL_T:
00162 case BARRA_GEOM_PERFIL_I:
00163 return(MSD_determinaDimensaoPrincipalBarra(sp, DirCalc));
00164 }
00165 }
00166 else
00167 {
00168 switch (SolGeometria(s))
00169 {
00170 case BARRA_GEOM_CIRCULO:
00171 case BARRA_GEOM_QUADRADO:
00172 case BARRA_GEOM_TRIANGULO:
00173 case BARRA_GEOM_RETANGULO:
00174 case BARRA_GEOM_ELIPSE:
00175 case BARRA_GEOM_PERFIL_L:
00176 case BARRA_GEOM_PERFIL_T:
00177 case BARRA_GEOM_PERFIL_I:
00178 veccopy(DirCalc, FacFeq(MSD_getFace(sp, 1)));
00179 return(MSD_lowSolidDimensaoPrincipal(sp, DirCalc));
00180 }
00181 }
00182 break;
00183
00184 case SOLIDO_TIPO_SOLID:
00185 return(dim);
00186
00187 case SOLIDO_TIPO_PLACA:
00188 if (comp(dot(SolPrincDir(s), dir), 0.0, 0.001) == 0)
00189 {
00190 if ((sp = MSD_getSolid(SolPerfil(s))) == SNIL)
00191 {
00192 return(0.0);
00193 }
00194 return(MSD_determinaDimensaoPrincipalBarra(sp, dir));
00195 }
00196 else
00197 {
00198 if (SolParam1(s) > SolParam2(s))
00199 {
00200 return(SolParam2(s));
00201 }
00202 return(SolParam1(s));
00203 }
00204 }
00205 return(0.0);
00206 }