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);
	}
Beispiel #2
0
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);
        }
    }
}
Beispiel #3
0
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());
        }
    }
}
Beispiel #4
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));
        }
    }
}
Beispiel #5
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));
        }
    }
}
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, "");
	}