Malla* GeneraCilindro::generaMallaTriangulos() { //Genero la medula. vector<Punto> medula; medula.push_back(Punto(0,0,0)); medula.push_back(Punto(0,altura,0)); nodos = new Nodos(); Nodo *nodo; Punto p; Vect v, v1, v2; double h,angulo; h = altura / num_anillos; angulo = 2*PI / num_puntos; for(int i=0; i<num_anillos; i++) { for(int j=0; j<num_puntos; j++) { p = Punto(cos(j*angulo)*radio,i*h-h/2,sin(j*angulo)*radio); v1 = Vect(p.getX(),p.getY(),p.getZ()); v2 = Vect(0,i*h-h/2,0); v = v1 - v2; nodo = new Nodo(p); nodo->setNormal(v); //le seteamos su normal nodo->setConcentracion(0.0); // le seteamos su concentracion nodos->addNodo(nodo); } } arcos = new Arcos(); caras = new Caras(); int n0, n1, n2, n3; for(int i=0; i<num_anillos-1; i++) { for(int j=0; j<num_puntos; j++) { n0 = num_puntos*i+j; n1 = num_puntos*i+((j+1)%num_puntos); n2 = num_puntos*(i+1)+j; n3 = num_puntos*(i+1)+((j+1)%num_puntos); if (i%2==0){ //Para que se vayan alternando los arcos. arcos->addArco(new Arco(n0, n1)); arcos->addArco(new Arco(n0, n2)); arcos->addArco(new Arco(n0, n3)); caras->addCara(new Triangulo(n0,n3,n1)); caras->addCara(new Triangulo(n0,n2,n3)); } else{ arcos->addArco(new Arco(n0, n1)); arcos->addArco(new Arco(n0, n2)); arcos->addArco(new Arco(n1, n2)); caras->addCara(new Triangulo(n1,n2,n3)); caras->addCara(new Triangulo(n0,n2,n1)); } if(i==num_anillos-2) //Generamos los arcos del borde superior. arcos->addArco(new Arco(n2, n3)); } } updateVecinos(); Malla *malla = new MallaTriangulos(nodos,arcos,caras); malla->setMedula(medula); malla->setConcentracionMax(1.0); malla->setConcentracionMin(0.0); assert(malla->checkMalla(true) >= 0); return malla; }
Malla* GeneraCilindro::generaMallaCuadrilateros() { //Genero la medula. vector<Punto> medula; medula.push_back(Punto(0,0,0)); medula.push_back(Punto(0,altura,0)); int num_nodos = num_anillos * num_puntos; Nodos *nodos = new Nodos(); Nodo *nodo; Punto p; Vect v, v1, v2; double h,angulo; h = altura / num_anillos; angulo = 2*PI / num_puntos; for(int i=0; i<num_anillos; i++) { for(int j=0; j<num_puntos; j++) { p = Punto(cos(j*angulo)*radio,i*h-h/2,sin(j*angulo)*radio); v1 = Vect(p); v2 = Vect(0,i*h-h/2,0); v = v1 - v2; nodo = new Nodo(p); nodo->setNormal(v); //le seteamos su normal nodo->setConcentracion(0.0); // le seteamos su concentracion nodos->addNodo(nodo); } } Arco *a; Arcos *arcos = new Arcos(); Cara *c; Caras *caras = new Caras(); int ind_cara, ind_arco; int n1, n2, n3, n4; vector<int> ind_nodos; vector<int> ind_arcos; for(int i=0; i<(num_anillos-1); i++) { for(int j=0; j<num_puntos; j++) { ind_nodos.clear(); ind_arcos.clear(); // Orden: n1 n2 n3 n4 <-> SE SO NO NE n1 = int(fmod(num_puntos*i+j,num_nodos)); n4 = int(fmod(num_puntos*(i+1)+j,num_nodos)); if(j == num_puntos-1) { n2 = n1-num_puntos+1; n3 = n4-num_puntos+1; } else { n2 = int(fmod(num_puntos*i+j+1,num_nodos)); n3 = int(fmod(num_puntos*(i+1)+j+1,num_nodos)); } // Orden inverso para tener normal saliente ind_nodos.push_back(n4); ind_nodos.push_back(n3); ind_nodos.push_back(n2); ind_nodos.push_back(n1); if(i == num_anillos-2) { if(j == 0) { ind_arcos.push_back(2*(n1-1)+3*num_puntos); } else { ind_arcos.push_back(2*n1+j-2); } ind_arcos.push_back(2*n1+j); ind_arcos.push_back(2*n1+j+1); ind_arcos.push_back(2*(n1+1)+j); } else { if(j == 0) { ind_arcos.push_back(2*(n1+num_puntos)-1); } else { ind_arcos.push_back(2*n1-1); } ind_arcos.push_back(2*n1); ind_arcos.push_back(2*n1+1); if(i == num_anillos-3) { ind_arcos.push_back(2*n1+2*num_puntos+j); } else { ind_arcos.push_back(2*n1+2*num_puntos); } } c = new Cuadrilatero(ind_nodos,ind_arcos); ind_cara = caras->addCara(c); nodos->addCaraNodo(n1,ind_cara); nodos->addCaraNodo(n2,ind_cara); nodos->addCaraNodo(n3,ind_cara); nodos->addCaraNodo(n4,ind_cara); int ind_cara2 = -1; if(i != 0) { ind_cara2 = ind_cara-num_puntos; } a = new Arco(n1,n2,ind_cara,ind_cara2); ind_arco = arcos->addArco(a); nodos->addArcoNodo(n1,ind_arco); nodos->addArcoNodo(n2,ind_arco); ind_cara2 = ind_cara+1; if(j == num_puntos-1) { ind_cara2 = ind_cara-num_puntos+1; } a = new Arco(n2,n3,ind_cara,ind_cara2); ind_arco = arcos->addArco(a); nodos->addArcoNodo(n2,ind_arco); nodos->addArcoNodo(n3,ind_arco); if(i == num_anillos-2) { if(j == num_puntos-1) { a = new Arco(int(fmod(n1+num_puntos,num_nodos)),int(fmod(n1+1,num_nodos)),ind_cara,-1); ind_arco = arcos->addArco(a); nodos->addArcoNodo(int(fmod(n1+num_puntos,num_nodos)),ind_arco); nodos->addArcoNodo(int(fmod(n1+1,num_nodos)),ind_arco); } else { a = new Arco(int(fmod(n1+num_puntos,num_nodos)),int(fmod(n1+num_puntos+1,num_nodos)),ind_cara,-1); ind_arco = arcos->addArco(a); nodos->addArcoNodo(int(fmod(n1+num_puntos,num_nodos)),ind_arco); nodos->addArcoNodo(int(fmod(n1+num_puntos+1,num_nodos)),ind_arco); } } } } Malla *malla = new MallaCuadrilateros(nodos,arcos,caras); malla->setMedula(medula); malla->setConcentracionMax(1.0); malla->setConcentracionMin(0.0); assert(malla->checkMalla(true) >= 0); return malla; }