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; }
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; }
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)); } } }
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)); } } }