Página principal | Jerarquía de la clase | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

esfera.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= esfera.cc                                                 Julio de 1998 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definiciones basicas para las clases de geometria                       =
00005 //=-------------------------------------------------------------------------=
00006 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00007 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00008 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00009 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00010 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00011 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00012 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00013 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00014 //=-------------------------------------------------------------------------=
00015 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00016 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00017 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00018 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00019 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00020 //===========================================================================
00021 
00022 #include "toolkits/geom/geometria.h"
00023 
00024 #ifdef VEL_ROSITA
00025     #include "toolkits/geom/esfera.h"
00026 #endif
00027 
00028 #include <stdio.h>
00029 
00030 //===========================================================================
00031 //= Clase ESFERA                                                            =
00032 //===========================================================================
00033 
00034 ESFERA::ESFERA(double r)
00042 {
00043     _radio = r;
00044     _lod = 500;
00045 
00046     #ifdef GL_ENABLED
00047     Textura_glu = gluNewQuadric();
00048     _paralelos = 10;
00049     _meridianos = 16;
00050     #endif
00051     imagen = NULL;
00052 }
00053 
00054 ESFERA::~ESFERA()
00059 {
00060     if ( imagen ) delete imagen;
00061     #ifdef GL_ENABLED
00062     if ( Textura_glu ) gluDeleteQuadric(Textura_glu);
00063     #endif
00064 }
00065 
00066 double
00067 ESFERA::radio(void)
00077 {
00078     return _radio;
00079 }
00080 
00081 void
00082 ESFERA::set_radio(double r)
00092 {
00093     if ( r > EPSILON  ) {
00094         _radio = r;
00095     }
00096 }
00097 
00098 void
00099 ESFERA::activar_lod(void)
00106 {
00107     unsigned long int p, nt;
00108 
00109     for ( p = 2; p < 400; p++ ) {
00110         nt = 2 * p * (long int)((double)p * 1.5);
00111         if ( nt >= _lod ) {
00112             _paralelos = (int)p;
00113             _meridianos = (int)((double)p * 1.5);
00114             break;
00115         }
00116     }
00117     if ( p == 400 ) {
00118         _paralelos = (int)p;
00119         _meridianos = (int)((double)p * 1.5);
00120     }
00121 }
00122 
00123 void
00124 ESFERA::set_lod(unsigned long int lod)
00133 {
00134     _lod = lod;
00135     activar_lod();
00136 }
00137 
00138 void
00139 ESFERA::anexar_textura(IMAGEN *img)
00146 {
00147     if ( imagen ) delete imagen;
00148     imagen = img;
00149 }
00150 
00151 int
00152 ESFERA::clasificar_punto(VECTOR p)
00159 {
00160     double d = DISTANCIA(0, 0, 0, p.x, p.y, p.z);
00161 
00162     if ( IGUAL(_radio, d ) ) {
00163         return 0;
00164       }
00165       else if ( d < _radio ) {
00166         return 1;
00167       }
00168       else {
00169         return -1;
00170       }
00171     ;
00172 }
00173 
00174 void
00175 ESFERA::minmax(VECTOR *min, VECTOR *max)
00178 {
00179     min->x = -_radio;
00180     min->y = -_radio;
00181     min->z = -_radio;
00182     max->x = _radio;
00183     max->y = _radio;
00184     max->z = _radio;
00185 }
00186 
00187 #ifdef GL_ENABLED
00188 
00189 void
00190 ESFERA::pintar_gl(CALIDAD_VISUAL *Calidad, MATERIAL* Material,
00191                   CAMARA * /*Camara*/)
00197 {
00198     //- Pintado de bordes --------------------------------------------------
00199     COLOR cb(1, 0, 0);
00200 
00201     if ( Calidad->con_bordes ) {
00202         Calidad->activar_bordes_gl(cb, Material);
00203         // Voy a poner caras
00204         gluQuadricDrawStyle(Textura_glu, (GLenum)GLU_LINE);  
00205         gluQuadricOrientation(Textura_glu, (GLenum)GLU_OUTSIDE);
00206         gluQuadricNormals(Textura_glu, (GLenum)GLU_FLAT);
00207         gluQuadricTexture(Textura_glu, GL_FALSE);
00208         gluSphere(Textura_glu, _radio, _meridianos, _paralelos);
00209     }
00210 
00211     if ( Calidad->con_cajas ) PINTAR_MINMAX_GL();
00212 
00213     //- Pintado de caras ---------------------------------------------------
00214     COLOR c(1, 1, 1);
00215 
00216     if ( Calidad->con_caras ) {
00217         // Voy a poner caras
00218         gluQuadricDrawStyle(Textura_glu, (GLenum)GLU_FILL);  
00219         gluQuadricOrientation(Textura_glu, (GLenum)GLU_OUTSIDE);
00220         //gluQuadricOrientation(Textura_glu, (GLenum)GLU_INSIDE);
00221 
00222         Material->activar_gl();
00223         Calidad->activar_caras_gl(c, Material);
00224 
00225         switch ( Calidad->calidad_caras ) {
00226           case CVC_CONSTANTE: gluQuadricNormals(Textura_glu, (GLenum)GLU_FLAT);
00227             break;
00228           case CVC_SHADE:
00229             gluQuadricNormals(Textura_glu, (GLenum)GLU_SMOOTH);
00230             break;
00231           case CVC_FLAT: default:
00232             gluQuadricNormals(Textura_glu, (GLenum)GLU_FLAT);
00233             break;
00234         }
00235 
00236         if ( imagen && Calidad->con_textura ) {
00237             imagen->activar_gl();
00238             gluQuadricTexture(Textura_glu, GL_TRUE);
00239             glEnable(GL_TEXTURE_2D);
00240             Calidad->activar_textura_gl();
00241           }
00242           else if ( Calidad->con_caustics ) {
00243             gluQuadricTexture(Textura_glu, GL_TRUE);
00244             Calidad->activar_textura_gl();
00245           }
00246           else {
00247             gluQuadricTexture(Textura_glu, GL_FALSE);
00248             glDisable(GL_TEXTURE_2D);
00249         }
00250 
00251         ACTIVAR_POLYGON_OFFSET();
00252         gluSphere(Textura_glu, _radio, _meridianos, _paralelos);
00253         DESACTIVAR_POLYGON_OFFSET();
00254         glDisable(GL_TEXTURE_2D);
00255     }
00256 
00257 }
00258 #endif
00259 
00260 void
00261 ESFERA::pintar_povray(FILE *fd)
00267 {
00268     fprintf(fd,
00269         "sphere {\n"
00270         "    <0, 0, 0>, %f\n",
00271         _radio
00272     );
00273 }
00274 
00275 void
00276 ESFERA::pintar_aqz(FILE *fd)
00282 {
00283     char num[200];
00284 
00285     sprintf(num, "%f", _radio);
00286     simplifique_real(num);
00287     fprintf(fd, "    geometria ESFERA %s \"%s\"\n", num, "");
00288 }
00289 
00290 GEOMETRIA *
00291 ESFERA::crear_copia(void)
00297 {
00298     ESFERA *e;
00299 
00300     e = new ESFERA(_radio);
00301     if ( !e ) return NULL;
00302 
00303     (*e) = (*this);
00304 
00305     #ifdef GL_ENABLED
00306     e->Textura_glu = gluNewQuadric();
00307 
00308     if ( imagen ) {
00309         e->imagen = imagen->copie();
00310         if ( !e->imagen ) {
00311             fprintf(stderr,
00312             "<ESFERA> Warning: no se pudo replicar una textura.\n");
00313             fflush(stderr);
00314         }
00315     }
00316     #endif
00317 
00318     return (GEOMETRIA *)e;
00319 }
00320 
00321 //===========================================================================
00322 //= EOF                                                                     =
00323 //===========================================================================
00324 

Este archivo HTML ha sido generado automáticamente a partir del código fuente AQUYNZA. NO LO EDITE. Para mayor información contacte al autor.