// Donde N es el numero de rotaciones
void Model_Revolution::calcular_coord_textura(int N, int M)
{

    int n_vertices = _vertices.size();

    double d[M];    //vector de distancias
    d[0] = 0;

    for(unsigned int k=1; k<M; k++)
        d[k] = d[k-1] + distancia(_vertices[k-1], _vertices[k]);

    for(unsigned int i=0; i<N; i++)
    {
        for(unsigned int j=0; j<M; j++)
        {

            float si = (float)i/(N-1);

            float tj = d[j]/d[M-1];

            _texturas.push_back(_vertex2f(si, tj));

        }
    }
}
_sup_par_triangles_object3D::_sup_par_triangles_object3D
(  
   const unsigned long nu, 
   const unsigned long nv, 
   const FunPar & fp 
) 
{
   assert( nu > 1 && nv > 1 );
   
   const unsigned long 
      nverts = (nu+1L)*(nv+1L) , // número total de vértices del modelo
      //naris  = 3L*nverts + nu + nv , // número total de aristas del modelo
      ncaras = 2L*nu*nv ; // número de caras del modelo
      
   // crear tablas de vértices, normales y coordenadas de textura
   
   Vertices.resize( nverts );
   Vertices_normals.resize( nverts );
   Vertices_tex_coords.resize( nverts );
   
   for( unsigned long iv = 0 ; iv <= nv ; iv++ )
   for( unsigned long iu = 0 ; iu <= nu ; iu++ )
   {
      const vector2d // coords. paramétricas
         cpar( double(iu)/double(nu) , double(iv)/double(nv) ); 
      vector3d 
         pos, nor ;  // posicion y normal
         
      // evalua posición y normal a partir de las coordenadas paramétricas
      fp.eval( cpar.s,cpar.t, pos, nor ); 
      
      // insertar vectores en las tablas
      const unsigned long 
         inv = indice(nu,nv,iu,iv) ; // indice del vértice en la tabla
      
      Vertices[inv]            = _vertex3f( pos.x, pos.y, pos.z )  ;  
      Vertices_normals[inv]    = _vertex3f( nor.x, nor.y, nor.z )  ;
      Vertices_tex_coords[inv] = _vertex2f( cpar.s, 1.0-cpar.t  ); 
   }
   
   Vertices_normals_computed = true ;
   Vertices_tex_coords_computed = true ;
   
   // crear tablas de aristas y caras
   Faces_vertices.resize( ncaras );
   
   unsigned long 
      co_car = 0L ;
   
   for( unsigned long iv = 0 ; iv < nv ; iv++ )
   for( unsigned long iu = 0 ; iu < nu ; iu++ )
   {
      const unsigned long // indices de los vértices en la tabla de v.
         inv0 = indice( nu,nv, iu  ,iv   ) ,  // inf.izq.
         inv1 = indice( nu,nv, iu+1,iv   ) ,  // inf.der.
         inv2 = indice( nu,nv, iu  ,iv+1 ) ,  // sup.izq.
         inv3 = indice( nu,nv, iu+1,iv+1 ) ;  // sup.der.
         
      Faces_vertices[co_car++] = _vertex3i( inv0, inv1, inv3 );
      Faces_vertices[co_car++] = _vertex3i( inv0, inv3, inv2 );
   }
   
   // calcular la caja englobante y normales de caras
   //compute_bounding_box();
   compute_faces_normals() ;
}