char AdapterComputationalGeometry::SegTriInt(Vect* T,Vect q,Vect r){ SegmentTriangleIntersection segmenttriangleintersection; tPointi Tpoints; tPointd qpoints; tPointd rpoints; tPointd ppoints; segmenttriangleintersection.Vertices[0][0]=T[0].getPunto().getX(); segmenttriangleintersection.Vertices[0][1]=T[0].getPunto().getY(); segmenttriangleintersection.Vertices[0][2]=T[0].getPunto().getZ(); segmenttriangleintersection.Vertices[1][0]=T[1].getPunto().getX(); segmenttriangleintersection.Vertices[1][1]=T[1].getPunto().getY(); segmenttriangleintersection.Vertices[1][2]=T[1].getPunto().getZ(); segmenttriangleintersection.Vertices[2][0]=T[2].getPunto().getX(); segmenttriangleintersection.Vertices[2][1]=T[2].getPunto().getY(); segmenttriangleintersection.Vertices[2][2]=T[2].getPunto().getZ(); Tpoints[0]=0; Tpoints[1]=1; Tpoints[2]=2; qpoints[0]=q.getPunto().getX(); qpoints[1]=q.getPunto().getY(); qpoints[2]=q.getPunto().getZ(); rpoints[0]=r.getPunto().getX(); rpoints[1]=r.getPunto().getY(); rpoints[2]=r.getPunto().getZ(); return segmenttriangleintersection.SegTriInt(Tpoints,qpoints,rpoints,ppoints); }
void Nodos::regresarNodo(int indice, double dist) { 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. if(n != 0) { Vect *normal = n->getNormal(); if(normal != 0) { n->getPunto()->setX(n->getPunto()->getX()-normal->getPunto().getX()*dist); n->getPunto()->setY(n->getPunto()->getY()-normal->getPunto().getY()*dist); n->getPunto()->setZ(n->getPunto()->getZ()-normal->getPunto().getZ()*dist); } } }
void Nodos::moverNodoSegunConcentracion(int indice, double val) { 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. if(n != 0) { Vect *normal = n->getNormal(); if(normal != 0) { n->getPunto()->setX(n->getPunto()->getX()+normal->getPunto().getX()*val*n->getConcentracion()); n->getPunto()->setY(n->getPunto()->getY()+normal->getPunto().getY()*val*n->getConcentracion()); n->getPunto()->setZ(n->getPunto()->getZ()+normal->getPunto().getZ()*val*n->getConcentracion()); } } }
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)); } } }
void AlmacenaToMllDebug::aplicar(Malla *malla, string filename){ //Lineas necesarias para que scanf lea archivo en computadores seteados en otro lenguaje. setlocale(LC_NUMERIC, "POSIX"); FILE *archivoSalida = fopen(filename.c_str(),"w"); fprintf(archivoSalida,"MLL (Debug file)\n"); fprintf(archivoSalida,"%d %d %d\n",malla->getMaxIndiceNodos()+1,malla->getMaxIndiceCaras()+1,malla->getMaxIndiceArcos()+1); fprintf(archivoSalida,"%d %d %d\n",malla->getNumNodos(),malla->getNumCaras(),malla->getNumArcos()); Nodo *nodo; Vect normal; cout << "Recorriendo Nodos" << endl; for(int i=0; i<=malla->getMaxIndiceNodos(); i++) { nodo = malla->getNodo(i); if(nodo == 0) { fprintf(archivoSalida,"Nodo{%d}=Vacio \n",i); } else { fprintf(archivoSalida,"Nodo{%d}=(%f,%f,%f) ",i,nodo->getPunto().getX(),nodo->getPunto().getY(),nodo->getPunto().getZ()); vector<int> caras = nodo->getCaras(); vector<int> arcos = nodo->getArcos(); fprintf(archivoSalida,"Caras{"); for(int j=0; j<(int)caras.size(); j++) { fprintf(archivoSalida,"%d",caras[j]); if(j<(int)caras.size()-1) { fprintf(archivoSalida,","); } } fprintf(archivoSalida,"} Arcos{"); for(int j=0; j<(int)arcos.size(); j++) { fprintf(archivoSalida,"%d",arcos[j]); if(j<(int)arcos.size()-1) { fprintf(archivoSalida,","); } } fprintf(archivoSalida,"} "); normal = malla->getNodo(i)->getNormal(); fprintf(archivoSalida,"Normal=(%f,%f,%f) ",normal.getPunto().getX(),normal.getPunto().getY(),normal.getPunto().getZ()); fprintf(archivoSalida,"Concentracion={%f}",nodo->getConcentracion()); fprintf(archivoSalida,"\n"); } } cout << "Pasamos nodos" << endl; Arco *a; for(int i=0; i<=malla->getMaxIndiceArcos(); i++) { a = malla->getArco(i); //si se elimino un arco, puede que en esa posicion exista un puntero igual a 0, por eso nos aseguramos que el arco sea distinto de 0. if(a == 0) { fprintf(archivoSalida,"Arco{%d} Vacio\n",i); } else { fprintf(archivoSalida,"Arco{%d} Nodos{%d,%d} Caras{%d,%d}\n",i,a->getNodo1(),a->getNodo2(),a->getCara1(),a->getCara2()); } } Cara *c; vector<int> ind_nodos; vector<int> ind_arcos; for(int i=0; i<=malla->getMaxIndiceCaras(); i++) { c = malla->getCara(i); //si se elimino una cara, puede que en esa posicion exista un puntero igual a 0, por eso nos aseguramos que la cara sea distinta de 0. if(c == 0) { fprintf(archivoSalida,"Cara{%d} Vacia\n",i); } else { ind_nodos = c->getNodos(); ind_arcos = c->getArcos(); fprintf(archivoSalida,"Cara{%d} %d ",i,c->getNumElem()); fprintf(archivoSalida,"Nodos{"); double conc_prom = 0; for(int j=0; j<(int)ind_nodos.size(); j++) { conc_prom = conc_prom + malla->getNodo(ind_nodos[j])->getConcentracion(); fprintf(archivoSalida,"%d",ind_nodos[j]); if(j<(int)ind_nodos.size()-1) { fprintf(archivoSalida,","); } } fprintf(archivoSalida,"} "); fprintf(archivoSalida,"Arcos{"); for(int j=0; j<(int)ind_arcos.size(); j++) { if(malla->getArco(ind_arcos[j]) != 0) { fprintf(archivoSalida,"%d:%d-->%d",ind_arcos[j],malla->getArco(ind_arcos[j])->getNodo1(),malla->getArco(ind_arcos[j])->getNodo2()); if(j<(int)ind_arcos.size()-1) { fprintf(archivoSalida,","); } } } fprintf(archivoSalida,"} "); Vect normal = c->getNormal(malla); fprintf(archivoSalida,"Normal=(%f,%f,%f) ",normal.getPunto().getX(),normal.getPunto().getY(),normal.getPunto().getZ()); fprintf(archivoSalida,"Concentracion=%f",conc_prom); fprintf(archivoSalida,"\n"); } } fclose(archivoSalida); setlocale(LC_NUMERIC, ""); }