Example #1
0
int Nodos::addNodo(Nodo* n) {
    Punto p = n->getPunto();
		    double x = p.getX();
		    double y = p.getY();
		    double z = p.getZ();
		    if(x>maxx) maxx = x;
		    if(x<minx) minx = x;
		    if(y>maxy) maxy = y;
		    if(y<miny) miny = y;
		    if(z>maxz) maxz = z;
		    if(z<minz) minz = z;


    // Si existe un indice en que haya un punto que fue borrado insertamos el punto ahi.
    if(borrados.size() > 0) {
        int ind = borrados[0];
        nodos[ind] = n;
        borrados.erase(borrados.begin());
        num_nodos_validos++; // actualizamos el numero de nodos validos
        return ind;
    }
    else {
        nodos.push_back(n); // agregamos el punto al contenedor.
        num_nodos++; // actualizamos el numero de nodos del contenedor
        num_nodos_validos++; // actualizamos el numero de nodos validos
        return (nodos.size()-1);
    }
}
Example #2
0
void Flecha::drawAt(const Punto &en) const
{
	float largo= vector.module();
	Punto punta= en+vector;
	glColor3f(color.r(),color.g(),color.b());
	if(largo<0.001){ //Es muy pequeño o nulo; lo dibujamos como un punto
		glPointSize(4.0);
		glBegin(GL_POINTS);
			glVertex3d(punta.x(),punta.y(),punta.z());
		glEnd();
	}
	else { //Si es más grande como un flecha
		glBegin(GL_LINES);
			glVertex3d(en.x(),en.y(),en.z());
			glVertex3d(punta.x(),punta.y(),punta.z());
		glEnd();
		glPushMatrix();
		glTranslatef(punta.x(),punta.y(),punta.z());
		glRotatef(vector.longitude(),0.0,1.0,0.0);
		glRotatef(-vector.latitude(),1.0,0.0,0.0);
		glTranslatef(0.0,0.0,-largo/10.0);
		glutWireCone(largo/50.0,largo/10.0,10,1);
		glPopMatrix();
	};
}
Example #3
0
void Obstaculo::calTTC(float v, float antiguo)
{   float m ;
    float b;
     if(dir->getx()==0)
      m =  0;
     else
      m = dir->gety()/dir->getx();
    if(dir->getx()==0 || m==0) b = centro->gety();
    else
     b = centro->gety()/(m*centro->getx());
    Punto* corte = new Punto(0.0,b,90);

    if (b>0 && velocidad > 0 && v>0)
    {
        float tobstaculo = (centro->distanciaPunto(corte))/(velocidad/3.6);
        Punto* coche = new Punto(0,0,90);
        float tcoche = (coche->distanciaPunto(corte))/(v/3.6);
        if (fabs(tobstaculo-tcoche) > 10)
            TTC = -1;
        else
        {
            if (antiguo!=-1)
                TTC = (tobstaculo + antiguo)/2;
            else TTC = tobstaculo;
            if(TTC-antiguo<0.1)
                TTC=-1;
        }
    }
    else TTC = -1;
}
Example #4
0
Nodos::Nodos(vector<Nodo*> nds) {
    num_nodos = nds.size();
    num_nodos_validos = nds.size();
    nodos = nds;
    double mx = -1*numeric_limits<float>::max();
    double mix = numeric_limits<float>::max();
    double my = -1*numeric_limits<float>::max();
    double miy = numeric_limits<float>::max();
    double mz = -1*numeric_limits<float>::max();
    double miz = numeric_limits<float>::max();
    for(int i = 0; i < (int)nds.size(); ++i){
        Nodo* n = nds[i];
		if( n!= 0){
		    Punto p = n->getPunto();
		    double x = p.getX();
		    double y = p.getY();
		    double z = p.getZ();
		    if(x>mx) mx = x;
		    if(x<mix) mix = x;
		    if(y>my) my = y;
		    if(y<miy) miy = y;
		    if(z>mz) mz = z;
		    if(z<miz) miz = z;
		}
    }
    this->maxx = mx;
    this->minx = mix;
    this->maxy = my;
    this->miny = miy;
    this->maxz = mz;
    this->minz = miz;

    nodos_marcados = NULL;
}
Example #5
0
double Triangulo::distanciaCentroide(Punto p){
    Punto centr = centroide();
    int auxx,auxy;
    auxx = pow((p.getX() - centr.getX()),2);
    auxy = pow((p.getY() - centr.getY()),2);
    return sqrt(auxx+auxy);
}
Punto Punto::transform(const Transformacion &t)const
//Devuelve el punto transformado
{
	Punto p;
	for(int i=0;i<4;i++) p.setelem(i,t.row(i)*(*this));
	return p;
}
Example #7
0
void renderFunction(){
	glClear(GL_COLOR_BUFFER_BIT); 
	glColor(Color::amarillo);
	for(int i=-radio;i<=radio;i++){
		for(int j=-radio;j<=radio;j++){
			if(i*i+j*j <= radio*radio + radio/2){
				glDraw(centroSol+Punto<double>(i,j));
			}
		}
	}

	for(particula& p: v){
		Punto<double> dist = centroSol - p.posicion;
		double r = dist.norma2();

		p.dibujar();
		p.aceleracion+=(dist)*(1.0/r)*particula::dt*g;
		p.iterar();
	}



	glFlush();
	glutSwapBuffers();
	glutTimerFunc(1, (void(*)(int))renderFunction,0);
}
Example #8
0
int main()
{
  Punto* p = new Punto();

  cout<<"("<<p->get_X()<<", "<<p->get_Y()<<")";

  return 0;
}
Example #9
0
Triangulo::Triangulo(Punto p1,Punto p2,Punto p3, Transformacion t) 
{
	vert=new Punto[3];
	vert[0]= p1.transform(t);
	vert[1]= p2.transform(t);
	vert[2]= p3.transform(t);
	nvertices= 3;
	N= ((vert[1]-vert[0])^(vert[2]-vert[1])).unitary();

}
Example #10
0
Cuadrilatero::Cuadrilatero(Punto p1,Punto p2,Punto p3,Punto p4, Transformacion t)
{
	vert=new Punto[4];
	nvertices=4;
	vert[0]= p1.transform(t);
	vert[1]= p2.transform(t);
	vert[2]= p3.transform(t);
	vert[3]= p4.transform(t);
	N= ((vert[1]-vert[0])^(vert[2]-vert[1])).unitary();
}
Example #11
0
int main()
{
    cout << "Prueba C++" <<endl;
    cout << "Constructor Punto" <<endl;
    Punto coordenadas = Punto();
    coordenadas.Mostrar();
    cout << "Constructor de copia Punto" <<endl;
    Punto coordenadas2 = coordenadas;
    coordenadas2.Mostrar();
    cout << "Constructor de copia generado Punto" <<endl;
    Punto coordenadas3 = Punto(coordenadas);
    coordenadas3.Mostrar();
    cout << "Constructor de un solo parametro" <<endl;
    Punto coordenadas4 = Punto(102);
    coordenadas4.Mostrar();
    cout << "Constructor con 2 parametro" <<endl;
    Punto coordenadas5 = Punto(1028,1028);
    coordenadas5.Mostrar();
    cout << "Constructor con 2 parametro con valores por defecto" <<endl;
    Punto coordenadas6 = Punto();
    coordenadas6.Mostrar();
    coordenadas = coordenadas2 = coordenadas4;
    coordenadas.Mostrar();
    coordenadas2.Mostrar();
    cout <<"Operador asignacion"<<endl;
    coordenadas4 = coordenadas5;
    coordenadas4.Mostrar();
    cout <<"Operador << sobrecargado"<<endl;
    cout <<coordenadas4<<endl;
    cout <<"Operador >> sobrecargado"<<endl;
    cin >> coordenadas4;
    cout << coordenadas4 << endl;
    cout <<"Operador ++ (pos) sobrecargado"<<endl;
    coordenadas2 = coordenadas4 ++;
    cout <<"coodenadas2 :" <<coordenadas2 << endl;
    cout <<"coordenadas4 :" << coordenadas4 << endl;
    cout <<"Operador ++ (pre) sobrecargado"<<endl;
    coordenadas3 = ++coordenadas4;
    cout <<"coodenadas3 :" <<coordenadas3 << endl;
    cout <<"coordenadas4 :" << coordenadas4 << endl;
    cout <<"Operador + sobrecargado"<<endl;
    coordenadas6 = coordenadas2 + coordenadas5;
    cout <<"coordenadas6 :"<<coordenadas6<<endl;
    cout <<"Operador - sobrecargado"<<endl;
    coordenadas5 = coordenadas6 - coordenadas2;
    cout <<"coordenadas5 :"<<coordenadas5<<endl;
    cout <<"Operador + sobrecargado con otro objeto a la derecha"<<endl;
    coordenadas2 = coordenadas5 + 7;
    cout <<"coordenadas2 :"<<coordenadas2<<endl;
    cout <<"Operador + sobrecargado con otro objeto a la izquierda"<<endl;
    coordenadas2 = 7 + coordenadas5;
    cout <<"coordenadas2 :"<<coordenadas2<<endl;
    return 0;
}
Example #12
0
void Poligono::drawWith(const Transformacion &T)const
//Dibuja el poligono solido (como Primitiva)
{	
	Vector Nt = N.transform( !(T.inverse3x3()) );
	glColor3f(color.r(),color.g(),color.b());
	glBegin(GL_POLYGON);
	glNormal3f(Nt.x(),Nt.y(),Nt.z());
	for(int i=0; i< nvertices; i++){
		Punto vertt = vert[i].transform(T);
		glVertex3f(vertt.x(),vertt.y(),vertt.z());
	}
	glEnd();
}
int main() {
	
	std::cout << "******************************************************************" << std::endl;
	std::cout << "* Ejemplos de Instanciacion de Objetos creados Dinamicamente     *" << std::endl;
	std::cout << "******************************************************************" << std::endl;
	
	std::cout << "Primer ejemplo de Instanciacion de un objeto de la Clase Punto." << std::endl;
	Punto* punto = new Punto(1.5, 6.836423);
	std::cout << "Punto(" << punto->getX() << ", " << punto->getY() << ")" << std::endl << std::endl;
	
	std::cout << "Segundo ejemplo de Instanciacion de un objeto de la Clase Figura." << std::endl;
	Figura* figura = new Figura(4);
	std::cout << "Figura(" << figura->getNumPuntos() << ")" << std::endl << std::endl;
	return 0;
}
Example #14
0
int Esfera::puntosInterseccion(Punto p, Punto u, float *t) {

	// Vector u = Origen + t*(Destino)
	// t : incognita
	// Q = Origen = p
	// V = Destino  
	// rayo = p + t*u

	bool v = false;
	float t1,t2;

	u.normalizar();

	Punto Q = p - posicion;
	Punto V = u;
	
	float a = V*V;
	float b = 2*(Q*V);
	float c = (Q*Q) - radio*radio;

	//
	// if (v) cerr << "a: "<<a<<" - b: "<<b<<" - c: "<<c<<endl;
	// 
	
	// Cogemos, de las dos soluciones, la negativa, porque es la que antes 
	// intersectará de las dos
	float D = b*b - 4*a*c;
	//
	// if (v) cerr << "D: "<<D<<" " <<sqrt(D)<<endl;
	// 
	if (D < 0) {
		return 0;
	}
	else {
		t1 = (-b - sqrt(D)) / (2*a);
		if (D == 0) {
			*t = t1;
			return 1;
		}
		t2 = (-b + sqrt(D)) / (2*a);
		if (t1 > t2) {
			*t = t2;
			return 1;
		}
		*t = t1;
		return 1;
	}
		//
		// if ((t1 > 0 && t2 <0)) {
		// 	*t = t1;
		// 	return 1;
		// }
		// if ((t1 < 0 && t2>0)) {
		// 	*t = t2;
		// 	return 1;
		// }
		// 
			
	
};
Transformacion Transformacion::scale(float sx,float sy,float sz, Punto centro)
//Acumula el escalado sobre un punto generico
{
	Matriz s;
	translation(centro);
	s.setelem(0,0,sx); s.setelem(1,1,sy); s.setelem(2,2,sz);
	append(s);
	return translation(centro.negated());
}
Example #16
0
Focalizada::Focalizada(Punto centro_, Punto direccion_, float factor_) {

		centro = centro_; 	
		factor = factor_;
		direccion = direccion_.normalizar();
		i = RGB(1,1,1); 		
		n = 200; 
		tipo = FOCALIZADA;
}
Example #17
0
// Constructor
Triangulo::Triangulo(Punto p0, Punto p1, Punto p2) {

	// Vertices en sentido antihorario
	vertices.push_back(p0);
	vertices.push_back(p1);
	vertices.push_back(p2);
	
	zmax = max(p0.z,p1.z,p2.z);	
	tipo = OTRO;

	posicion = (p0 + p1 + p2) / 3;

	Punto normal = (p2-p1)^(p0-p2);
	normal.normalizar();
	normales.push_back(normal);

	material = Material(RGB(0,1,0),0.5,0.5);

	// Proyectamos el polígono en el plano 
	if (fabs(normales[0].x) > fabs(normales[0].y) && fabs(normales[0].x) > fabs(normales[0].z)) { 
		// Proyectamos sobre las X
		proyecc = 1;
		i0 = proyecc - 1;
		i1 = 1;
		i2 = 2;
	}
	else if (fabs(normales[0].y) > fabs(normales[0].x) && fabs(normales[0].y) > fabs(normales[0].z)) {
		// Proyectamos sobre las Y
		proyecc = 2;
		i0 = proyecc - 1;
		i1 = 0;
		i2 = 2;
	}
	else {
		// Proyectamos sobre las Z
		proyecc = 3;
		i0 = proyecc - 1;
		i1 = 0;
		i2 = 1;
	}
	// i1 = (i0-1)%3;
	// i2 = (i0+1)%3;

};
Example #18
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));
    }

}
Example #19
0
void RenderRayTracer::renderiza(Escena escena, Camara c) {

	RGB color;

	// float i,j;
	int i,j;

	float alfa = (c.fov*PI)/360.0;
	float dist = 0.5/tan(alfa);

	float incx = 1.0/(float)ancho*1.0;
	float incy = 1.0/(float)alto*1.0;

	float aspectratio = (float)ancho/(float)alto;
	float alfaw = alfa*aspectratio;
	float ancho_a = tan(alfaw)*dist;


	Punto centro = c.posicion + (c.look - c.posicion).normalizar()*dist;

	// Vector horizontal y vertical por los que se mueve 
	Punto horizontal = up^(c.look - c.posicion);
	horizontal.normalizar();
	Punto vertical = (c.look - c.posicion).normalizar()^horizontal;
	vertical.normalizar();

	Punto direccion = centro - horizontal*ancho_a - vertical*0.5;
	for(i=0;i<ancho;i++) {
		for(j=0;j<alto;j++) {
			// trazamos un rayo desde centro hasta x,y -> devuelve un color
			//
			// (direccion+horizontal*i*incx+vertical*j*incy - c.posicion).escribir();
			// 
			color = escena.trazarRayo(c.posicion,(direccion+horizontal*i*incx+vertical*j*incy - c.posicion).normalizar(),1,-1,1);
			raster.push_back(color);
		}
	}
	cerr << "Tiempo renderizado:  ";
};
Example #20
0
bool Triangulo::enCuadradoSelec(Punto p){
    Punto arrIzq,arrDer,abaIzq,abaDer;
    arrIzq = areaArribaIzq();
    arrDer = areaArribaDer();
    abaDer = areaAbajoDer();
    abaIzq = areaAbajoIzq();
    bool dentro = (arrIzq.getX()<=p.getX()) && (arrIzq.getY()<=p.getY()) && 
                (arrDer.getX()>=p.getX()) && (arrDer.getY()<=p.getY()) &&
                (abaIzq.getX()<=p.getX()) && (abaIzq).getY()>=p.getY() &&
                (abaDer.getX()>=p.getX()) && (abaDer.getY()>=p.getY());            
    return dentro;
}
Transformacion Transformacion::rotation(float ang, Vector vectorEje, Punto enRecta )
//Acumula el giro alrededor de un eje generico
{
	float lat,lon;

	lat= vectorEje.latitude();		//latitud
	lon= vectorEje.longitude();		//longitud

	//Recordar acumulacion LIFO
	translation(enRecta);			//Rehacer la traslacion
	rotY(lon);						//Rehacer la longitud
	rotX(-lat);						//Rehacer la latitud
	rotZ(ang);						//Girar el angulo
	rotX(lat);						//Deshacer la latitud
	rotY(-lon);						//Deshacer la longitud
	return translation(enRecta.negated());	//Traslacion al origen
}
Example #22
0
void Triangulo::moverFig (int x,int y){
	Punto p;
	int auxx, auxy;
	p= getP1();
	auxx= p.getX()+x;
	auxy= p.getY()+y;
	setP1(Punto(auxx,auxy));
	p= getP2();
	auxx= p.getX()+x;
	auxy= p.getY()+y;
	setP2(Punto(auxx,auxy));
	p= getP3();
	auxx= p.getX()+x;
	auxy= p.getY()+y;
	setP3(Punto(auxx,auxy));
}
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();
			}	
		}
	}
}
Example #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;
}
Vector Punto::operator -(const Punto &p)const
//Resta de puntos genera vector
{
	return Vector(x()-p.x(),y()-p.y(),z()-p.z());
}