Пример #1
0
void MontanaRusa::creaTuboFrenet(){
        //Lo multiplicamos por el numero de vueltas
        GLfloat intervalo = 2*M_PI*2/NQ;
        PV3D** vertices = getVertices();

        //Construimos los vertices de cada cara del tubo
        for(int i=0; i<NQ; i++){
                GLfloat valor = i*intervalo;
                PV3D* T = primeraDerivada(valor);
                T->normaliza();
                PV3D* B = primeraDerivada(valor)->productoVectorial(segundaDerivada(valor));
                B->normaliza();
                PV3D* N = B->productoVectorial(T);
                PV3D* C = funcion(valor);
                for(int j=0; j<NP; j++){
                        int indiceVertice = NP*i+j;
                        PV3D* vertice = perfil[j]->multiplicaMatriz(N,B,T,C);
                        vertices[indiceVertice] = vertice;
                }
        }

        //Construimos las caras
        for(int i=0; i<NQ; i++){
                for (int j=0; j<NP; j++){
                        int indiceCara = NP*i+j;
                        caras[indiceCara] = new Cara(4);
                        VerticeNormal** normalesCara = new VerticeNormal*[4];

                        int verticeBase = indiceCara;
                        int v0 = verticeBase % (NP*NQ);
                        int v1 = sucesor(verticeBase % (NP*NQ));
                        int v2 = (sucesor(verticeBase)+NP) % (NP*NQ);
                        int v3 = (verticeBase + NP) % (NP*NQ);

                        normalesCara[0] = new VerticeNormal(v0,indiceCara);
                        normalesCara[1] = new VerticeNormal(v1,indiceCara);
                        normalesCara[2] = new VerticeNormal(v2,indiceCara);
                        normalesCara[3] = new VerticeNormal(v3,indiceCara);

                        caras[indiceCara]->addVerticeNormal(normalesCara);
                }

        }

        //Calculamos las normales de cada cara
        for(int i=0; i<numCaras; i++){
                normales[i] = CalculoVectorNormalPorNewell(caras[i]);
        }
}
Пример #2
0
void eliminarRegistro(Pagina* actual, tipoClave cl, int* encontrado)
{
   int k;

   if (actual != NULL)
   {
      *encontrado = buscarNodo(actual, cl, &k);
      if (*encontrado)
      {
         if (actual->ramas[k-1] == NULL)		/* es un nodo hoja */
            quitar(actual, k);
         else
         {
            sucesor(actual, k);
            /* se elimina la clave sucesora en su nodo */
            eliminarRegistro(actual->ramas[k], actual->claves[k], encontrado);
         }
      }
      else
      {
         eliminarRegistro(actual->ramas[k], cl, encontrado);
      }
      /* Las llamadas recursivas devuelven control a este punto.
         Se comprueba el número de claves del nodo descendiente,
         desde el nodo actual en la ruta de búsqueda seguida.
      */

      if (actual->ramas[k] != NULL)
      if (actual->ramas[k]->cuenta < m/2)
      restablecer(actual,k);
   }
   else
	  *encontrado = 0;
}
Пример #3
0
void inOrden(Nodo *arbol){
	if(!arbol) { return; }
	Nodo *cur = min(arbol);
	while(cur) {
		printf("%d\n",cur->numero);
		cur = sucesor(cur,arbol);
	}
	return;
}