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

	Nodo* nodo=malla->getNodo(indNodo);
	Vect viejaNormal=nodo->getNormal();
	Vect nuevaNormal;
	vector<int> indArcosVecinos=nodo->getArcos();
	for (int indArco=0; indArco< (int)indArcosVecinos.size(); indArco++){
		Arco* arcoVecino=malla->getArco(indArcosVecinos[indArco]);
		int indPuntoA=arcoVecino->getNodoDistinto(indNodo);
		Nodo* NodoA=malla->getNodo(indPuntoA);
		Vect vectorVecino=NodoA->getNormal()*(val*NodoA->getConcentracion());
		nuevaNormal=nuevaNormal+vectorVecino;
		}
	//Normalizamos.
	nuevaNormal = nuevaNormal*(1/nuevaNormal.largo());
	nodo->setNormal(nuevaNormal);
	//Si la inconsistencia no se corrige, borramos el nodo central.
	if (checkInterseccionNodo(malla,indNodo)==true){
		nodo->setNormal(viejaNormal);
		colapsarRegion(malla,indNodo);
		return false;
	}
	else
		ntrayectoriasreparadas++;
	return true;
	}
Esempio n. 2
0
double Arco::getLargo(Malla *malla) {
	assert(malla != 0);
	Punto p1 = malla->getNodo(this->getNodo1())->getPunto();
	Punto p2 = malla->getNodo(this->getNodo2())->getPunto();
	double x1 = p1.getX();
	double y1 = p1.getY();
	double z1 = p1.getZ();
	double x2 = p2.getX();
	double y2 = p2.getY();
	double z2 = p2.getZ();
	Vect *v = new Vect(x1-x2,y1-y2,z1-z2);
	double largoArco=v->largo();
	delete v;
	return largoArco;
}
Esempio n. 3
0
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));
        }
    }
}
Esempio n. 4
0
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));
        }
    }
}