示例#1
0
/*
 =======================================================================================================================
 =======================================================================================================================
 */
FlipFlop::FlipFlop(int n1, int x1, int y1)
{
	n = n1;
	CLK = Punto(x1, y1);

	// J=Punto (x1,y1-15); K=Punto (x1,y1+15);
	Q = Punto("Q" + IntToStr(n), x1 + 70, y1 - 15);
	NQ = Punto("~Q" + IntToStr(n), x1 + 70, y1 + 15);
	RESET = Punto(x1 + 35, y1 + 35);
}
void myinit(void){

	glClearColor (1.0, 1.0, 1.0, 1.0);
	
	//Camara perspectiva
	canon.at(AT);		
	canon.lookAt(OR);
	canon.setVertical(Vector(0.0, 1.0, 0.0));

	//Camara en el techo - Planta
	cenital.at(Punto(0.0, 2.0, 0.0));		
	cenital.lookAt(OR);
	cenital.setVertical(Vector(0.0, 0.0, -1.0));
	cenital.setHeight(ALTO);

	//Cámara de perfil - Perfil
	perfil.at(Punto(2.0, 0.0, 0.0));		
	perfil.lookAt(OR);
	perfil.setVertical(Vector(0.0, 1.0, 0.0));
	perfil.setHeight(ALTO);

	//Cámara de frente - Alzado
	frontal.at(Punto(0.0, 0.0, 2.0));		
	frontal.lookAt(OR);
	frontal.setVertical(Vector(0.0, 1.0, 0.0));
	frontal.setHeight(ALTO);

	//Transformaciones de las fotos (LIFO)
	NO.translation(Vector(-DESP,  DESP, 0.0));
	NO.scale(0.5, 0.5);
	NE.translation(Vector( DESP,  DESP, 0.0));
	NE.scale(0.5, 0.5);
	SO.translation(Vector(-DESP, -DESP, 0.0));
	SO.scale(0.5, 0.5);
	SE.translation(Vector( DESP, -DESP, 0.0));
	SE.scale(0.5, 0.5);
	
	//Inicializacion de la iluminacion
	GLfloat light_position[] = {4.0, 9.0,-4.0, 0.0};
	GLfloat mat_ambient   [] = {0.5, 0.5, 0.5, 1.0};
	GLfloat mat_diffuse   [] = {0.0, 0.0, 0.0, 1.0};
	GLfloat mat_specular  [] = {0.9, 0.9, 0.9, 1.0};
	GLfloat mat_shininess [] = {5.0};

	glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse); 
	glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular); 
	glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); 
	glLightfv(GL_LIGHT0, GL_POSITION, light_position);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);
	glShadeModel(GL_SMOOTH);
}
示例#3
0
Ambiental::Ambiental() {

		centro = Punto(); 	
		i = RGB(1,1,1); 		
		n = 50; 		
		tipo = AMBIENTAL;
}
示例#4
0
int main (int argc, char* argv[]){
    ifstream f_paises ("./datos/paises.txt");
    Paises almacenPaises("./datos/imagenes/banderas");
    cin.get();
    f_paises >> almacenPaises;
    almacenPaises[Punto(34.520418555522845,69.20082090000005)].bandera.escribir("./prueba.ppm","PPM");
}
示例#5
0
void traza(void) {
	int i, j;
	Color color;
	double x1, y1, a, b;
	unsigned char *t;

	//Si es la primera vez, o hay que redibujar la escena...
	if(raster==NULL){
		raster = (unsigned char *)malloc(sizeof(unsigned char)*3*ancho*alto);
		if (raster==NULL){
			fprintf(stderr, "Sin memoria\n");
			exit(-1);
		}
	}
	b = calc_b(pos_z, fov);
	a = AspectRatio * b;
	t = raster;
	for(j=0; j<alto; j++){
		y1 = calc_y1(b, alto, j);
		for(i=0; i<ancho; i++){
			x1 = calc_x1(a, ancho, i);
			color = escena->rayTrace(Punto(0, 0, pos_z), Vector(x1, y1, -pos_z), 0);
			*t++ = (unsigned char)(color.r()*255);
			*t++ = (unsigned char)(color.g()*255);
			*t++ = (unsigned char)(color.b()*255);
		}
	}
	sucio = 0;
}
示例#6
0
void crear_iluminacion(void){

	FuenteLuminosa *ambiental, *puntual, *direccional, *focalizada;

	ambiental = new Ambiental();
	escena->addLight(ambiental);

	puntual = new Puntual(Color(1,1,1), Punto(1,0.5,0));
	escena->addLight(puntual);

	focalizada = new Focalizada(Color(1,1,0), Punto(0,2,-1), Vector(0,-1,0), 8, 60);
	escena->addLight(focalizada);

	//direccional = new Direccional(Color(1,0,1), Vector(0,-1,0));
	//escena->addLight(direccional);

}
示例#7
0
Direccional::Direccional(Punto direccion_) {

		direccion = direccion_;
		centro = Punto(); 	
		i = RGB(1,1,1); 		
		n = 100; 
		tipo = DIRECCIONAL;
}
示例#8
0
文件: nodos.cpp 项目: gurroz/Memori
void Nodos::moverNodo(int indice, double x, double y, double z, double dist) {
    if(indice == -1) {
        return;
    }
    if(indice >= (int)nodos.size() || indice < 0) {
        cout << "Error: Moviendo Nodo(" << indice << "). Numero de nodos = " << nodos.size() << endl;
        assert((indice < (int)nodos.size()) && (indice >= 0));
    }
    Nodo *n = nodos[indice];
    //movemos el nodo una distancia dist.
    double x1,y1,z1;
    if(n != 0) {
        x1=n->getPunto().getX()+x*dist;
        y1=n->getPunto().getY()+y*dist;
        z1=n->getPunto().getZ()+z*dist;
        n->setPunto(Punto(x1,y1,z1));
    }
};
示例#9
0
void MovimientosAUV::moverNodosSegunParametro(int indice, double valor, Malla *malla){

    int nNodos = malla->getMaxIndiceNodos();
    double xs[nNodos +1];
    double ys[nNodos +1];
    double zs[nNodos +1];

    for(int i = 0; i <= nNodos; ++i){
        xs[i] = 0.0;
        ys[i] = 0.0;
        zs[i] = 0.0;
    }

    for(int i = 0; i < malla->getNodos()->n_marcados; ++i){
        Punto *p = this->getMovimiento(i, indice);
        int ind = malla->getNodos()->nodos_marcados[i];
        xs[ind] = p->getX();
        ys[ind] = p->getY();
        zs[ind] = p->getZ();
    }

    for(int i = 0; i <= nNodos; ++i){
        Nodo *n = malla->getNodo(i);
        int i1 = n->getAsociado1();
        int i2 = n->getAsociado2();
        int i3 = n->getAsociado3();

        if(i1<0 || i2<0 || i3<0)
            continue;

        float coef1 = n->getCoef1();
        float coef2 = n->getCoef2();
        float coef3 = n->getCoef3();

        float newX = n->getPunto().getX() + coef1*xs[i1]*valor + coef2*xs[i2]*valor + coef3*xs[i3]*valor;
        float newY = n->getPunto().getY() + coef1*ys[i1]*valor + coef2*ys[i2]*valor + coef3*ys[i3]*valor;
        float newZ = n->getPunto().getZ() + coef1*zs[i1]*valor + coef2*zs[i2]*valor + coef3*zs[i3]*valor;

        n->setPunto(Punto(newX, newY, newZ));
    }

}
示例#10
0
文件: nodos.cpp 项目: gurroz/Memori
void Nodos::moverNodo(int indice, double dist) {
    if(indice == -1) {
        return;
    }
    if(indice >= (int)nodos.size() || indice < 0) {
        cout << "Error: Moviendo Nodo(" << indice << "). Numero de nodos = " << nodos.size() << endl;
        assert((indice < (int)nodos.size()) && (indice >= 0));
    }
    Nodo *n = nodos[indice];
    //movemos el nodo una distancia dist.
    double x,y,z;
    if(n != 0) {
        Vect normal = n->getNormal();
        if(normal.largo() > 0) {
            x=n->getPunto().getX()+normal.getPunto().getX()*dist;
            y=n->getPunto().getY()+normal.getPunto().getY()*dist;
            z=n->getPunto().getZ()+normal.getPunto().getZ()*dist;
            n->setPunto(Punto(x,y,z));
        }
    }
}
示例#11
0
文件: nodos.cpp 项目: gurroz/Memori
void Nodos::regresarNodoSegunConcentracion(int indice, double val) {
    if(indice == -1) {
        return;
    }
    if(indice >= (int)nodos.size() || indice < 0) {
        cout << "Error: Regresando Nodo(" << indice << "). Numero de nodos = " << nodos.size() << endl;
        assert((indice < (int)nodos.size()) && (indice >= 0));
    }
    Nodo *n = nodos[indice];
    //regresamos el nodo una distancia dist.
    double x,y,z;
    if(n != 0) {
        Vect normal = n->getNormal();
        if(normal.largo() > 0) {
            x=n->getPunto().getX()-normal.getPunto().getX()*val*n->getConcentracion();
            y=n->getPunto().getY()-normal.getPunto().getY()*val*n->getConcentracion();
            z=n->getPunto().getZ()-normal.getPunto().getZ()*val*n->getConcentracion();
            n->setPunto(Punto(x,y,z));
        }
    }
}
bool colision(int x1 , int y1 , int w1, int h1,int x2, int y2 , int w2, int h2)
{
    if(puntodentrorect(Punto(x2, y2), Rectangulo(Punto(x1,y1),w1,h1)))
    {
        return true;
    }
    if(puntodentrorect(Punto(x2+w2, y2), Rectangulo(Punto(x1,y1),w1,h1)))
    {
        return true;
    }
    if(puntodentrorect(Punto(x2, y2+h2), Rectangulo(Punto(x1,y1),w1,h1)))
    {
        return true;
    }
    if(puntodentrorect(Punto(x2+w2, y2+h2), Rectangulo(Punto(x1,y1),w1,h1)))
    {
        return true;
    }

    return false;


}
Malla* GeneraFromArchivosXYZU::aplicar() {
	int n_triangulos = 0, n_cuadrilateros = 0; // cantidad de caras de tres y cuatro lados
	//Lineas necesarias para que scanf lea archivo en computadores seteados en otro lenguaje.
	setlocale(LC_NUMERIC, "POSIX");

    FILE *arch_x = fopen(archivo_x.c_str(),"r");
    FILE *arch_y = fopen(archivo_y.c_str(),"r");
    FILE *arch_z = fopen(archivo_z.c_str(),"r");
    FILE *arch_u = fopen(archivo_u.c_str(),"r");

    char line[50];
    char cx[16];
    char cy[16];
    char cz[16];
    int num_puntos, num_caras;
    float x,y,z,nx,ny,nz,u;
    fscanf(arch_x,"%s %s\n",line,line);
    fscanf(arch_y,"%s %s\n",line,line);
    fscanf(arch_z,"%s %s\n",line,line);
    fscanf(arch_u,"%s %s\n",line,line);

    num_puntos=0;
    Nodos *nodos = new Nodos();
    Nodo *nodo;
    while(true) {
        fscanf(arch_x,"%s %s %s\n",cx,cy,cz);
        fscanf(arch_y,"%s %s %s\n",cx,cy,cz);
        fscanf(arch_z,"%s %s %s\n",cx,cy,cz);
        fscanf(arch_u,"%s %s %s\n",cx,cy,cz);
        if(strcmp(cx,"%") == 0) {
            break;
        }
        sscanf(cx,"%f",&x);
        sscanf(cy,"%f",&y);
        sscanf(cz,"%f",&z);
        nodo = new Nodo(Punto(x,y,z));
        nodos->addNodo(nodo);
        num_puntos++;

    }

    map<pair<int,int>,int> ind_arcos;
    map<pair<int,int>,int>::iterator iter1;
	map<pair<int,int>,int>::iterator iter2;
    vector<int> indice_puntos;
    vector<int> indice_arcos;
    Arcos *arcos = new Arcos();
    Caras *caras = new Caras();
    Cara *c;
    int indice;
    char *token;

    int indices[4];
    int n_lados;
    num_caras=0;
    while(true) {
        fgets(line, 50, arch_x);
        fgets(line, 50, arch_y);
        fgets(line, 50, arch_z);
        fgets(line, 50, arch_u);
        if(strpbrk("%",line) != NULL) {
            break;
        }
        token = strtok(line," ");
        for(int i=0; i<3; ++i) {
            sscanf(token,"%d",&indices[i]);
            token = strtok(NULL, " ");
        }
        if(token == NULL) { // Caso triángulos
        	n_triangulos++;
            n_lados = 3;
        }
        else { // Caso cuadriláteros
            sscanf(token,"%d",&indices[3]);
            n_cuadrilateros++;
            n_lados = 4;
        }

        //Nota: Por bug en los archivos de entrada, debo invertir el orden para que las normales queden bien.
        //for(int i=n_lados-1; i>=0; --i) // invertido por bug archivo entrada
        for(int i=0; i<n_lados; ++i) // así debiera ser
            indice_puntos.push_back(indices[i]-1);

        for(int j=0; j<n_lados; j++) {
            int ind1 = indice_puntos[j];
            int ind2 = indice_puntos[int(fmod(j+1,n_lados))];
            pair<int,int> pr1(ind1,ind2);
            pair<int,int> pr2(ind2,ind1);
            iter1 = ind_arcos.find(pr1);
			iter2 = ind_arcos.find(pr2);
            if(iter1 != ind_arcos.end())
                indice_arcos.push_back(iter1->second);
			else if(iter2 != ind_arcos.end())
                indice_arcos.push_back(iter2->second);
            else {
                indice = arcos->addArco(new Arco(ind1,ind2));
                indice_arcos.push_back(indice);
                ind_arcos.insert(make_pair(pr1,indice));
                nodos->addArcoNodo(ind1,indice);
                nodos->addArcoNodo(ind2,indice);
            }
        }
        if(n_lados == 3)
            c = new Triangulo(indice_puntos,indice_arcos);
        else // n_lados == 4
            c = new Cuadrilatero(indice_puntos,indice_arcos);
        int ind_cara = caras->addCara(c);
        num_caras++;
        for(int j=0; j<n_lados; j++) {
            arcos->setCaraArco(indice_arcos[j],ind_cara);
            nodos->addCaraNodo(indice_puntos[j],ind_cara);
        }
        indice_puntos.clear();
        indice_arcos.clear();
    }

    float max_concentracion = 0;
    float min_concentracion = 999999999;
    for(int i=0; i<num_puntos; i++) {
        fscanf(arch_x,"%f\n",&nx);
        fscanf(arch_y,"%f\n",&ny);
        fscanf(arch_z,"%f\n",&nz);
        fscanf(arch_u,"%f\n",&u);

        if(u < min_concentracion) {
            min_concentracion = u;
        }
        if(u > max_concentracion) {
            max_concentracion = u;
        }

        Vect normal = Vect(nx,ny,nz);
        nodos->getNodo(i)->setNormal(normal);
        nodos->getNodo(i)->setConcentracion(u);
    }

    cout << "max_concentracion = " << max_concentracion << endl;
    cout << "min_concentracion = " << min_concentracion << endl;

    Malla *malla = 0;
    if(n_cuadrilateros == 0)
    	malla = new MallaTriangulos(nodos,arcos,caras);
	else if(n_triangulos == 0)
		malla = new MallaCuadrilateros(nodos,arcos,caras);
	else
		malla = new Malla(nodos,arcos,caras);
    malla->setConcentracionMax(max_concentracion);
    malla->setConcentracionMin(min_concentracion);

	fclose(arch_x);
	fclose(arch_y);
	fclose(arch_z);
	fclose(arch_u);
	setlocale(LC_NUMERIC, "");

	//Chequeamos consistencia topologica.
	int V=malla->getNumNodos();
	int E=malla->getNumArcos();
	int F=malla->getNumCaras();
	cout << "Numero de nodos=" << V << endl;
	cout << "Numero de arcos=" << E << endl;
	cout << "Numero de caras=" << F << endl;
	if (V-E+F==2 || V-E+F==0)
		cout << "La malla es consistente. Cumple la formula de Euler: V-E+F=2" << endl;
	else
		cout << "Atencion, la malla no es consistente. No cumple la formula de Euler: V(" << V << ")-E(" << E << "+F("<< F << ")=" << V-E+F << " y deberia ser V-E+F=2" << endl;

    assert(malla->checkMalla(true) >= 0);
    return malla;

}
bool VerificacionNodosVecinosColapsoRegion::checkInterseccionNodo(Malla* malla, int indNodo){
	assert(malla->getNodo(indNodo)!=NULL);

			Nodo* nodoActual=malla->getNodo(indNodo);

			//Definimos los puntos que componen el segmento de proyeccion del nodo.
			Punto PuntoProyecNodoActual=  Punto(	nodoActual->getPunto().getX()+nodoActual->getNormal().getPunto().getX()*val*nodoActual->getConcentracion(),
													nodoActual->getPunto().getY()+nodoActual->getNormal().getPunto().getY()*val*nodoActual->getConcentracion(),
													nodoActual->getPunto().getZ()+nodoActual->getNormal().getPunto().getZ()*val*nodoActual->getConcentracion());
			Vect q=Vect(nodoActual->getPunto());
			Vect r=Vect(PuntoProyecNodoActual);

			if(q == r) // El nodo actual no se desplaza
                return false;

			//Revisamos cada una de las caras vecinas al nodo.
			vector<int> indCarasVecinas=nodoActual->getCaras();
			for (int indCara=0; indCara<(int)indCarasVecinas.size(); indCara++){
				Cara* caraVecina=malla->getCara(indCarasVecinas[indCara]);
				vector<int> puntos=caraVecina->getPuntosDistintos(indNodo);

				//Formar paredes del cilindro que rodea la proyeccion (una por cada arco (de la cara) no incidente en indNodo)
				for (int j=0; j<caraVecina->getNumElem()-2;++j) {
                    int indPuntoA=puntos[j];
                    int indPuntoB=puntos[j+1];
                    Nodo* NodoA=malla->getNodo(indPuntoA);
                    Nodo* NodoB=malla->getNodo(indPuntoB);
                    Punto PuntoProyecA=Punto(NodoA->getPunto().getX()+NodoA->getNormal().getPunto().getX()*val*NodoA->getConcentracion(),
                                             NodoA->getPunto().getY()+NodoA->getNormal().getPunto().getY()*val*NodoA->getConcentracion(),
                                             NodoA->getPunto().getZ()+NodoA->getNormal().getPunto().getZ()*val*NodoA->getConcentracion());
                    Punto PuntoProyecB=Punto(NodoB->getPunto().getX()+NodoB->getNormal().getPunto().getX()*val*NodoB->getConcentracion(),
                                             NodoB->getPunto().getY()+NodoB->getNormal().getPunto().getY()*val*NodoB->getConcentracion(),
                                             NodoB->getPunto().getZ()+NodoB->getNormal().getPunto().getZ()*val*NodoB->getConcentracion());

                    AdapterComputationalGeometry adapter;
                    char resultadoInterseccion;

                    if(PuntoProyecA != NodoA->getPunto()) { // Si A se desplaza

                        //Chequeamos interseccion con el primer triangulo
                        Vect triangulo1[3];
                        triangulo1[0]=Vect(NodoA->getPunto());
                        triangulo1[1]=Vect(PuntoProyecA);
                        triangulo1[2]=Vect(PuntoProyecB);
                        Vect qpoints(q.getPunto());
                        Vect rpoints(r.getPunto());

                        resultadoInterseccion=adapter.SegTriInt(triangulo1,qpoints,rpoints);

                        if (resultadoInterseccion!='0'){
                            return true;
                            }
                    }

                    if(PuntoProyecB != NodoB->getPunto()) { // Si B se desplaza

                        //Chequeamos interseccion con el segundo triangulo
                        Vect triangulo2[3];
                        triangulo2[0]=Vect(NodoB->getPunto());
                        triangulo2[1]=Vect(NodoA->getPunto());
                        triangulo2[2]=Vect(PuntoProyecB);
                        Vect q2points(q.getPunto());
                        Vect r2points(r.getPunto());

                        resultadoInterseccion=adapter.SegTriInt(triangulo2,q2points,r2points);

                        if (resultadoInterseccion!='0'){
                            return true;
                            }
                        }
                    }
				}

	return false;
	}
示例#15
0
Malla* GeneraFromMatLab::generaMallaCuadrilateros() {
	//Lineas necesarias para que scanf lea archivo en computadores seteados en otro lenguaje.
	setlocale(LC_NUMERIC, "POSIX");

    FILE *mat = fopen(archivo.c_str(),"r");
    float flt;
    if(num_anillos == 0) {
        FILE *mat2 = fopen(archivo.c_str(),"r");
        if(num_puntos == 0) {
            num_puntos = 90;
        }
        int num = 0;
        while(fscanf(mat2,"%f\n",&flt) != EOF) {
            num++;
        }
        num_anillos = num/(4*num_puntos);
		fclose(mat2);
    }
    int num_nodos = num_anillos * num_puntos; // número de nodos de la malla

    Nodos *nodos = new Nodos();
    Nodo *nodo;
    Punto p;
    double max_concentracion = 0.0;
    double min_concentracion = 99999999.0;
    // Generamos los nodos de la malla, con la información en el archivo.
    for(int j=0; j<4; j++) {
        for(int i=0; i<num_nodos; i++) {
            fscanf(mat,"%f\n",&flt);
            if(j == 0) {
                p = Punto(flt,0,0);
                nodo = new Nodo(p);
                nodos->addNodo(nodo);
            }
            else if(j == 1) {
                Punto aux=nodos->getNodo(i)->getPunto();
                aux.setZ(flt);
                nodos->getNodo(i)->setPunto(aux);
            }
            else if(j == 2) {
                Punto aux=nodos->getNodo(i)->getPunto();
                aux.setY(flt);
                nodos->getNodo(i)->setPunto(aux);
            }
            else {
                if(flt < min_concentracion) {
                    min_concentracion = flt;
                }
                if(flt > max_concentracion) {
                    max_concentracion = flt;
                }
                nodos->getNodo(i)->setConcentracion(flt);
            }
        }
    }

    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->setConcentracionMax(max_concentracion);
    malla->setConcentracionMin(min_concentracion);
    malla->setNormales();

	fclose(mat);
	setlocale(LC_NUMERIC, "");

	//Chequeamos consistencia topologica.
	int V=malla->getNumNodos();
	int E=malla->getNumArcos();
	int F=malla->getNumCaras();
	cout << "Numero de nodos=" << V << endl;
	cout << "Numero de arcos=" << E << endl;
	cout << "Numero de caras=" << F << endl;
	if (V-E+F==2 || V-E+F==0)
		cout << "La malla es consistente. Cumple la formula de Euler: V-E+F=2" << endl;
	else
		cout << "Atencion, la malla no es consistente. No cumple la formula de Euler: V-E+F=" << V-E+F << " y deberia ser V-E+F=2" << endl;

    assert(malla->checkMalla(true) >= 0);
    return malla;
}
示例#16
0
/*
* Genera una malla de triángulos desde un archivo en formato MatLab.
* El archivo se divide en cuatro grupos de filas: primero todas las
* coordenadas x, luego todas las coordenadas z, luego las coordenadas y
* y finalmente las concentraciones en los nodos.
*/
Malla* GeneraFromMatLab::generaMallaTriangulos() {
	//Lineas necesarias para que scanf lea archivo en computadores seteados en otro lenguaje.
	setlocale(LC_NUMERIC, "POSIX");

    FILE *mat = fopen(archivo.c_str(),"r");
    float flt;
    if(num_anillos == 0) {
        FILE *mat2 = fopen(archivo.c_str(),"r");
        if(num_puntos == 0) {
            num_puntos = 90;
        }
        int num = 0;
        while(fscanf(mat2,"%f\n",&flt) != EOF) {
            num++;
        }
        num_anillos = num/(4*num_puntos);
		fclose(mat2);
    }
    int num_nodos = num_anillos * num_puntos; // número de nodos de la malla

    Nodos *nodos = new Nodos();
    Nodo *nodo;
    Punto p;
    double max_concentracion = 0.0;
    double min_concentracion = 99999999.0;
    // Generamos los nodos de la malla, con la información en el archivo.
    for(int j=0; j<4; j++) {
        for(int i=0; i<num_nodos; i++) {
            fscanf(mat,"%f\n",&flt);
            if(j == 0) {
                p = Punto(flt,0,0);
                nodo = new Nodo(p);
                nodos->addNodo(nodo);
            }

            //Invierto Y y Z para que se despliegue correctamente en la aplicacion.
            else if(j == 1) {
                Punto aux=nodos->getNodo(i)->getPunto();
                aux.setZ(flt);
                nodos->getNodo(i)->setPunto(aux);
            }
            else if(j == 2) {
                Punto aux=nodos->getNodo(i)->getPunto();
                aux.setY(flt);
                nodos->getNodo(i)->setPunto(aux);
            }
            else {
                if(flt < min_concentracion) {
                    min_concentracion = flt;
                }
                if(flt > max_concentracion) {
                    max_concentracion = flt;
                }
                nodos->getNodo(i)->setConcentracion(flt);
            }
        }
    }

    // ahora formamos los arcos y caras.
    Arco *a;
    Arcos *arcos = new Arcos();
    Cara *c;
    Caras *caras = new Caras();

    int ind_cara1, ind_cara2, ind_arco;
    int n1, n2, n3, n4;
    int a1, a2, a3;
    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();

            //se deben generar 2 caras.
            //cara1: n1 n2 n3
            //cara2: n1 n3 n4
            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));
            }

            ind_nodos.push_back(n3);
            ind_nodos.push_back(n2);
            ind_nodos.push_back(n1);

            a1 = 3*(i*num_puntos+j);
            if(i == num_anillos-2) {
                a1 = 3*i*num_puntos+4*j;
            }
            a2 = a1+1;
            a3 = a1+2;

            ind_arcos.push_back(a1);
            ind_arcos.push_back(a2);
            ind_arcos.push_back(a3);

            c = new Triangulo(ind_nodos,ind_arcos);
            ind_cara1 = caras->addCara(c);

            nodos->addCaraNodo(n1,ind_cara1);
            nodos->addCaraNodo(n2,ind_cara1);
            nodos->addCaraNodo(n3,ind_cara1);

            ind_nodos.clear();
            ind_arcos.clear();

            ind_nodos.push_back(n4);
            ind_nodos.push_back(n3);
            ind_nodos.push_back(n1);

            a1 = 3*(i*num_puntos+j)+2;
            if(i == num_anillos-2) {
                a1 = 3*i*num_puntos+4*j+2;
            }
            a2 = 3*(i+1)*num_puntos+3*j;
            if(i == num_anillos-3) {
                a2 = 3*(i+1)*num_puntos+4*j;
            }
            else if(i == num_anillos-2) {
                a2 = a1+1;
            }
            a3 = a1 - 4;
            if(i == num_anillos-2) {
                if(j==0) {
                    a3 = a1+4*(num_puntos-1)-1;
                }
                else {
                    a3 = a1-5;
                }
            }
            else {
                if(j==0) {
                    a3 = a1+3*(num_puntos-1)-1;
                }
            }

            ind_arcos.push_back(a1);
            ind_arcos.push_back(a2);
            ind_arcos.push_back(a3);

            c = new Triangulo(ind_nodos,ind_arcos);
            ind_cara2 = caras->addCara(c);

            nodos->addCaraNodo(n1,ind_cara2);
            nodos->addCaraNodo(n3,ind_cara2);
            nodos->addCaraNodo(n4,ind_cara2);

            int ind_cara3 = -1;
            if(i != 0) {
                ind_cara3 = ind_cara1-(2*num_puntos)+1;
            }

            a = new Arco(n1,n2,ind_cara1,ind_cara3);
            ind_arco = arcos->addArco(a);
            nodos->addArcoNodo(n1,ind_arco);
            nodos->addArcoNodo(n2,ind_arco);

            ind_cara3 = ind_cara1+3;
            if(j == num_puntos-1) {
                ind_cara3 = ind_cara1-2*(num_puntos-1)+1;
            }

            a = new Arco(n2,n3,ind_cara1,ind_cara3);
            ind_arco = arcos->addArco(a);
            nodos->addArcoNodo(n2,ind_arco);
            nodos->addArcoNodo(n3,ind_arco);

            a = new Arco(n1,n3,ind_cara1,ind_cara2);
            ind_arco = arcos->addArco(a);
            nodos->addArcoNodo(n1,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_cara2,-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_cara2,-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 MallaTriangulos(nodos,arcos,caras);
    malla->setConcentracionMax(max_concentracion);
    malla->setConcentracionMin(min_concentracion);
    malla->setNormales();

	fclose(mat);
	setlocale(LC_NUMERIC, "");

	//Chequeamos consistencia topologica.
	int V=malla->getNumNodos();
	int E=malla->getNumArcos();
	int F=malla->getNumCaras();
	cout << "Numero de nodos=" << V << endl;
	cout << "Numero de arcos=" << E << endl;
	cout << "Numero de caras=" << F << endl;
	if (V-E+F==2 || V-E+F==0)
		cout << "La malla es consistente. Cumple la formula de Euler: V-E+F=2" << endl;
	else
		cout << "Atencion, la malla no es consistente. No cumple la formula de Euler: V-E+F=" << V-E+F << " y deberia ser V-E+F=2" << endl;

    assert(malla->checkMalla(true) >= 0);
    return malla;
}
示例#17
0
文件: arco.cpp 项目: gurroz/Memori
Punto Arco::getPuntoMedio(Malla *malla) {
	assert(malla != 0);
	Punto p1 = malla->getNodo(this->getNodo1())->getPunto();
	Punto p2 = malla->getNodo(this->getNodo2())->getPunto();
	return Punto((p1.getX()+p2.getX())/2,(p1.getY()+p2.getY())/2,(p1.getZ()+p2.getZ())/2);
}
void displayTeapot(Camara &cam, Transformacion marco){
//Dibuja la foto de un Cubo con la cam y la pone en t

	// Transformacion de la camara
	Transformacion rotcam;
	Transformacion rotationx, rotationy;
	Punto newAT = AT;
	rotationx.rotX(rotationX);
	rotationy.rotY(rotationY);

	newAT = newAT.transform(rotationx);
	newAT = newAT.transform(rotationy);
	
	Punto vert = Punto(0.0, 1.0, 0.0);
	vert.transform(rotcam);

	canon.at(newAT);
	canon.lookAt(OR);
	canon.setVertical(vert.asVector());

	Punto newFR = FR;
	newFR = newFR.transform(rotationy);
	frontal.at(newFR);
	frontal.lookAt(OR);

	Punto newPE = PE;
	newPE = newPE.transform(rotationy);
	perfil.at(newPE);
	perfil.lookAt(OR);

	Punto newCE = CE;
	newCE = newCE.transform(rotationy);
	cenital.setVertical(newCE.asVector());
	
	rotationx.reset();
	rotationy.reset();


	Transformacion t = marco * cam.getview();
	
	//Dibujo de la tetera
	Transformacion rot; 
	rot.rotX(-90);
	Transformacion mov;
	mov.translation(Real4(0.0, -1.0, 0.0));

	
	for(int k=0;k<32;k++){
		S[k].getPoints(NVERT, sb);
		S[k].getTangents(NVERT, tgU, tgV);
		S[k].getNormals(NVERT, n);
	
		for(int i=0;i<NVERT*NVERT;i++){	
			sb[i] = sb[i].transform(rot).transform(mov);
			sb[i] =	cam.shot(sb[i]).transform(marco);	
		
			float sup_color[] = {0.5, 0.5, 0.5, 1.0}; //Gris
			glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, sup_color);
		}

		if(inalambrico){
			for(int i=0;i<NVERT-1;i++){
				for(int j=0;j<NVERT-1;j++){			
					glBegin(GL_QUADS);
					glNormal3f(n[NVERT*i+j].x(),n[NVERT*i+j].y(),n[NVERT*i+j].z());
					glVertex3f(sb[NVERT*i+j].x(),sb[NVERT*i+j].y(),sb[NVERT*i+j].z());

					glNormal3f(n[NVERT*(i+1)+j].x(),n[NVERT*(i+1)+j].y(),n[NVERT*(i+1)+j].z());
					glVertex3f(sb[NVERT*(i+1)+j].x(),sb[NVERT*(i+1)+j].y(),sb[NVERT*(i+1)+j].z());

					glNormal3f(n[NVERT*(i+1)+(j+1)].x(),n[NVERT*(i+1)+(j+1)].y(),n[NVERT*(i+1)+(j+1)].z());
					glVertex3f(sb[NVERT*(i+1)+(j+1)].x(),sb[NVERT*(i+1)+(j+1)].y(),sb[NVERT*(i+1)+(j+1)].z());

					glNormal3f(n[NVERT*i+(j+1)].x(),n[NVERT*i+(j+1)].y(),n[NVERT*i+(j+1)].z());
					glVertex3f(sb[NVERT*i+(j+1)].x(),sb[NVERT*i+(j+1)].y(),sb[NVERT*i+(j+1)].z());

					glEnd();
				};	
			};
		}
		else{
			for(int i=0;i<NVERT;i++){
				glBegin(GL_LINE_STRIP);
					for(int j=0;j<NVERT;j++){
						glVertex3f( (GLfloat)((sb[i*NVERT+j]).x()),
									(GLfloat)((sb[i*NVERT+j]).y()),
									(GLfloat)((sb[i*NVERT+j]).z()));
					}
				glEnd();
			}
 			for(int i=0;i<NVERT;i++){
				glBegin(GL_LINE_STRIP);
					for(int j=0;j<NVERT;j++){
						glVertex3f( (GLfloat)((sb[i+j*NVERT]).x()),
									(GLfloat)((sb[i+j*NVERT]).y()),
									(GLfloat)((sb[i+j*NVERT]).z()));
					}
				glEnd();
			}	
		}
	}
}
void myinit(void);
void buttonMouse(int key, int state, int x, int y);
void moveMouse(int x, int y);
void myReshape(GLsizei w, GLsizei h);
void display(void);

//Cámaras
CamaraPerspectiva canon;
CamaraOrtografica cenital, perfil, frontal;

//Transformaciones que se aplican a las fotos para situarlas en la ventana
Transformacion NO, NE, SO, SE;

//Ejes
Punto OR = Punto();
Punto EX = Punto(1.0);
Punto EY = Punto(0.0,1.0);
Punto EZ = Punto(0.0,0.0,1.0);

//Tetera
Punto sb[NVERT*NVERT];
Vector n[NVERT*NVERT];
Vector tgU[NVERT*NVERT];
Vector tgV[NVERT*NVERT];
bool inalambrico = true;

//Movimiento de la camara
Punto AT = Punto(4.0, 5.0, 5.0);
Punto FR = Punto(0.0, 0.0, 2.0);
Punto PE = Punto(2.0, 0.0, 0.0);
示例#20
0
Malla* GeneraFromComsol_1::aplicar() {
	int n_triangulos = 0, n_cuadrilateros = 0; // cantidad de caras de tres y cuatro lados
	ifstream in(archivo.c_str());
	char line[MAXLINE];
	in.getline(line,MAXLINE);

    string cx,cy,cz;
	float x,y,z;

    int num_puntos, num_caras;

    num_puntos=0;
    Nodos *nodos = new Nodos();
    Nodo *nodo;

    while(true) {
        in.getline(line,MAXLINE);
		stringstream streamin(line);
		if (line[0]=='%')
			break;

		streamin >> x;
		streamin >> y;
		streamin >> z;

        nodo = new Nodo(Punto(x,y,z));
        nodos->addNodo(nodo);
        num_puntos++;
    }


    map<pair<int,int>,int> ind_arcos;
    map<pair<int,int>,int>::iterator iter1;
	map<pair<int,int>,int>::iterator iter2;
    vector<int> indice_puntos;
    vector<int> indice_arcos;
    Arcos *arcos = new Arcos();
    Caras *caras = new Caras();
    Cara *c;
    int indice;

    int indices[4], n_lados;
    num_caras=0;
    while(true) {
        indices[3]=-1;
		in.getline(line,MAXLINE);
		if (in.fail() || line[0]=='%')
            break;
		stringstream streamin(line);
		for(int i=0; i<4; i++)
            streamin >> indices[i];

        if(indices[3] == -1) {
        	n_triangulos++;
            n_lados = 3;
        }
        else {
        	n_cuadrilateros++;
            n_lados = 4;
        }

        //Nota: Por bug en los archivos de entrada, debo invertir el orden para que las normales queden bien.
        //for(int i=n_lados-1; i>=0; i--) // por el bug
        for(int i=0; i<n_lados; i++) // así debiera ser
            indice_puntos.push_back(indices[i]-1);

        for(int j=0; j<n_lados; j++) {
            int ind1 = indice_puntos[j];
            int ind2 = indice_puntos[int(fmod(j+1,n_lados))];
            pair<int,int> pr1(ind1,ind2);
			pair<int,int> pr2(ind2,ind1);
            iter1 = ind_arcos.find(pr1);
			iter2 = ind_arcos.find(pr2);
            if(iter1 != ind_arcos.end())
                indice_arcos.push_back(iter1->second);
            else if(iter2 != ind_arcos.end())
                indice_arcos.push_back(iter2->second);
            else {
                indice = arcos->addArco(new Arco(ind1,ind2));
                indice_arcos.push_back(indice);
                ind_arcos.insert(make_pair(pr1,indice));
                nodos->addArcoNodo(ind1,indice);
                nodos->addArcoNodo(ind2,indice);
            }
        }
        if(n_lados == 3)
            c = new Triangulo(indice_puntos,indice_arcos);
        else if(n_lados == 4)
            c = new Cuadrilatero(indice_puntos,indice_arcos);
        else
            c = new Cara(indice_puntos,indice_arcos);

        int ind_cara = caras->addCara(c);
        num_caras++;
        for(int j=0; j<n_lados; j++) {
            arcos->setCaraArco(indice_arcos[j],ind_cara);
            nodos->addCaraNodo(indice_puntos[j],ind_cara);
        }
        indice_puntos.clear();
        indice_arcos.clear();
    }

	Malla *malla = 0;
    if(n_cuadrilateros == 0)
    	malla = new MallaTriangulos(nodos,arcos,caras);
	else if(n_triangulos == 0)
		malla = new MallaCuadrilateros(nodos,arcos,caras);
	else
		malla = new Malla(nodos,arcos,caras);
	malla->setConcentracionTodos(1.0);
    malla->setConcentracionMax(1.0);
    malla->setConcentracionMin(0.0);
    malla->setNormales();

	in.close();

	//Chequeamos consistencia topologica.
	int V=malla->getNumNodos();
	int E=malla->getNumArcos();
	int F=malla->getNumCaras();
	cout << "Numero de nodos=" << V << endl;
	cout << "Numero de arcos=" << E << endl;
	cout << "Numero de caras=" << F << endl;
	if (V-E+F==2 || V-E+F==0)
		cout << "La malla es consistente. Cumple la formula de Euler: V-E+F=2" << endl;
	else
		cout << "Atencion, la malla no es consistente. No cumple la formula de Euler: V-E+F=" << V-E+F << " y deberia ser V-E+F=2" << endl;

    assert(malla->checkMalla(true) >= 0);
    cout << endl;
    return malla;
}
示例#21
0
/*
 =======================================================================================================================
 =======================================================================================================================
 */
FlipFlopD::FlipFlopD(int n1, int x1, int y1) :
	FlipFlop(n1, x1, y1)
{
	D = Punto(x1, y1 - 15);
}
示例#22
0
Esfera::Esfera()
{// Construye la esfera unidad por defecto
	centro = Punto();
	radio = 1.0f;
}
示例#23
0
Punto Ambiental::L(Punto p) { return Punto(0,0,0); }
示例#24
0
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;
}
示例#25
0
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;
}
示例#26
0
void crear_escena(void) {

	Esfera *amarilla, *blanca, *roja, *verde, *azul;
	float radio = 0.59673710213f;

	// Creamos la escena
	if (escena==NULL) 
		escena = new Escena();

	//Esfera
	Esfera *esfera = new Esfera(Punto(0,0.1,-2), 0.8);
	esfera->setColor(Color(1,0,0), Color(1,1,1), 0.3, 0.3, 0.7, 40);
	escena->add(esfera);

	//Caja suelo
	Transformacion t1;
	t1.translation(Real4(0.0, -1.0, -1.5));
	t1.scale(2, 0.1, 2);

	Caja *cajasuelo = new Caja(t1);
	cajasuelo->setColor(Color(1,1,1), Color::BLANCO, 0.1, 0.3, 0.9, 100);
	escena->add(cajasuelo);

	//Caja cubo
	Transformacion t2;
	t2.translation(Real4(-1.0, -0.3, -0.3));
	t2.rotation(60, Vector(1,1,1));
	t2.scale(0.5, 0.5, 0.5);

	Caja *cajacubo = new Caja(t2);
	cajacubo->setColor(Color(0,1,0), Color::BLANCO, 0.1, 0.8, 0.1, 1);
	escena->add(cajacubo);

	// Esfera blanca (detrás)
	/*blanca = new Esfera(Punto(0.0f, 0.0f, -2.0f), radio);
	blanca->setColor(Color::BLANCO);
	escena->add(blanca);*/

	// Esfera amarilla (NO)
	/*amarilla = new Esfera(Punto(-radio, radio,0.0f),radio);
	amarilla->setColor(Color::VERDE+Color::ROJO);
	escena->add(amarilla);*/

	// Esfera roja (SO)
	/*roja = new Esfera(Punto(-radio,-radio,0.0f), radio);
	roja->setColor(Color::ROJO);
	escena->add(roja);

	// Esfera azul (SE)
	/*azul = new Esfera(Punto(radio, -radio,0.0f), radio);
	azul->setColor(Color::AZUL);
	escena->add(azul);/*

	// Esfera verde (NE)
	/*verde = new Esfera(Punto(radio, radio, 0.0f), radio);
	verde->setColor(Color::VERDE);
	escena->add(verde);*/
	
	/*Transformacion t1;
	//t1.translation(Real4(2,2,2,0));
	t1.rotation(30, Vector(0,1,0));
	t1.rotation(-15, Vector(1,0,0));
	t1.scale(0.5, 0.4, 0.3);

	Caja *cajaverde = new Caja(t1);
	cajaverde->setColor(Color::VERDE);
	escena->add(cajaverde);*/
	
	//escena->add(amarilla);
	/*for(int i=0;i<6;i++){
		for(int j=0;j<4;j++){
			printf("%.2f %.2f ", cajaverde->caras[i].vertices[j].x(), cajaverde->caras[i].vertices[j].y());
		}
		printf("\n");
	}*/
}
示例#27
0
文件: 3ds.cpp 项目: Vordok/Projects
//This returns the angle between two vectors
float Angle(CVector3 vVector1, CVector3 vVector2)
{
	return acosf(Punto(vVector1, vVector2));
}
示例#28
0
Caja::Caja(Transformacion T)
{
	//ToDo: Implementar
	cara.clear();
	ncaras = 0;

	// Puntos por defecto - Altura de la caja: 2
	Punto puntos[24]= {
		// Cara 1 - Normal hacia +x
		Punto( 1, 1,-1), Punto( 1, 1, 1), Punto( 1,-1, 1), Punto( 1,-1,-1),
		// Cara 2 - Normal hacia +y
		Punto(-1, 1,-1), Punto(-1, 1, 1), Punto( 1, 1, 1), Punto( 1, 1,-1),
		// Cara 3 - Normal hacia +z
		Punto(-1, 1, 1), Punto(-1,-1, 1), Punto( 1,-1, 1), Punto( 1, 1, 1),
		// Cara 4 - Normal hacia -x
		Punto(-1, 1,-1), Punto(-1,-1,-1), Punto(-1,-1, 1), Punto(-1, 1, 1),
		// Cara 5 - Normal hacia -y
		Punto(-1,-1,-1), Punto( 1,-1,-1), Punto( 1,-1, 1), Punto(-1,-1, 1),
		// Cara 6 - Normal hacia -z
		Punto(-1,-1,-1), Punto(-1, 1,-1), Punto( 1, 1,-1), Punto( 1,-1,-1)
	};

	for(int i=0; i<6; i++){
		Punto caras[4];
		for(int j=0; j<4; j++)
			caras[j] = puntos[j+i*4].transform(T);
		Poligono *c = new Poligono(4, caras);
		cara.push_back(c);
		ncaras++;
	}
}