Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links
El siguiente programa fue hecho por Herling Gonzalez Alvarez, que visualiza un
Campo Magnetico utilizando OpenGL.
Email: gherling@lycos.com
Pantalla de opciones del programa
Campo Magnetico
Perfil del Campo
Esta es una porcion del archivo de datos a graficar, si te interesa el archivo completo para probarlo, dame tu direccion de mail y te lo envio, no lo pongo en la pagina por ser algo pesadito.
0 0 0 -5188 -5207 -97.88 0 0 0.3158 -5081 -5099 339.5 0 0 0.6316 -4871 -4893 660.3 0 0 0.9474 -4596 -4626 872.6 0 0 1.2631 -4286 -4331 995.9 0 0 1.5789 -3963 -4025 1054 0 0 1.8947 -3645 -3723 1066 0 0 2.2107 -3342 -3429 1045 0 0 2.5267 -3061 -3149 1001 0 0 2.8417 -2803 -2887 940.3 0 0 3.1577 -2569 -2644 869.8 0 0 3.4737 -2358 -2420 794.4 0 0 3.7897 -2169 -2215 719.1 0 0 4.1057 -2001 -2031 646.4 0 0 4.4207 -1850 -1870 576.4 0 0 4.7367 -1717 -1729 508.4 0 0 5.0527 -1600 -1608 442.3 0 0 5.3687 -1499 -1504 377.9 0 0 5.6837 -1414 -1417 315.4 0 0 5.9997 -1344 -1347 254.4 0 0 6.3157 -1289 -1291 194.8 0 0 6.6317 -1248 -1249 136.1 0 0 6.9477 -1221 -1222 77.53 0 0 7.2627 -1207 -1208 18.32 0 0 7.5787 -1207 -1208 -42.78 |
Codigo fuente: aqui
// // field2.cpp // Visulizacion del Campo Magnetico // desde los archivos mds.dat y cbs.dat (minino y cero B) // Herling Gonzalez Alvarez // marzo de 2002 // gherling@lycos.com // #include <iostream.h> #include <fstream.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> #include <GL/glut.h> #ifndef M_PI #define M_PI 3.141592653589793238E0 #endif int frame=0, time=0, timebase=0; float fps; int w,h; //numero de nodos por dimension para el campo magnetico const int N=30625,nx=25,ny=25,nz=49; int m=0,fm=ny*nz,set=0; const char *stick[]={"2.0","4.0","6.0","8.0","10.0","12.0","14.0", "16.0","18.0","20.0"}; static char label[100]; char *name="ninguna"; double dt=0.01; double theta=45.0,rho=45.0,t=0.0,distancia=100.0,xc=0.0,zc=0.0,yc=0.0; double x[1000],y[1000],z[1000]; double pos[30625][6]; void setFieldDat(int caso) { ifstream infield; switch (caso) { case 1: infield.open("mbs.dat");break; case 2: infield.open("cbs.dat");break; case 3: infield.open("mirrors.dat");break; case 4: infield.open("cupss.dat");break; } for(register int i=0;i<N;i++) { infield >> pos[i][0] >> pos[i][1] >> pos[i][2] \ >> pos[i][3] >> pos[i][4] >> pos[i][5]; } infield.close(); } /*void arrow(double ax, double ay, double az) { glPushMatrix(); glTranslatef(ax,ay,az); glBegin(GL_LINES); glVertex3d( 0.0, 0.1, 0.0); glVertex3d( 0.1, 0.0, 0.0); glVertex3d( 0.0, 0.1, 0.0); glVertex3d( -0.1, 0.0, 0.0); glEnd(); glPopMatrix(); } */ void allField() { double f = 15000.0 ; glBegin(GL_LINES); for(register int i=0;i<N;i++) { glColor3f(0.0f, 0.0f, 1.0f); glVertex3d(pos[i][0],pos[i][1],pos[i][2]); glColor3f(1.f, 0.f, 0.0f); glVertex3d(pos[i][0]+pos[i][3]/f,pos[i][1]+pos[i][4]/f, pos[i][2]+pos[i][5]/f); } glEnd(); } void zyField() { register int mm=m,fmm=fm; float f = 15000.0 ; glBegin(GL_LINES); for(mm;mm<fmm;mm++) { glColor3f(0.0,0.0,1.0); glVertex3d(pos[mm][0],pos[mm][1],pos[mm][2]); glColor3f(1.0,0.0,0.0); glVertex3d(pos[mm][0]+pos[mm][3]/f,pos[mm][1]+pos[mm][4]/f, pos[mm][2]+pos[mm][5]/f); /* arrow(pos[mm][0]+pos[mm][3]/f,pos[mm][1]+pos[mm][4]/f, pos[mm][2]+pos[mm][5]/f);*/ } glEnd(); } void pointField() { glPointSize(1.0); glBegin(GL_POINTS); for(int p=0;p<N;p++) { glColor3f(1.0, 1.0, 0.0); glVertex3d(pos[p][0],pos[p][1],pos[p][2]); } glEnd(); } void setViewField(int caso) { switch (caso){ case 8: allField();break; case 9: zyField();break; case 0: pointField();break; } } void inline drawString (char *s) { unsigned int i; for (i = 0; i < strlen (s); i++) glutBitmapCharacter (GLUT_BITMAP_HELVETICA_10, s[i]); } void init() { glClearColor (0.5,0.5,0.5,1.0); //glClearColor (0.,0.,0.,0.0); } void changeSize(int w1, int h1) { if(h1 == 0) h1 = 1; w = w1; h = h1; glViewport(0, 0, w, h); // Se va a usar toda la ventana para // mostrar gráficos. glMatrixMode(GL_PROJECTION);// Activamos la matriz de proyeccion. glLoadIdentity(); // reseteamos la matrix de // projection (stack=1). gluPerspective( 15, // Ángulo de visión. (float)w/(float)h, // Razón entre el largo y el ancho, // para calcular la perspectiva. 0.0001, // Cuan cerca se puede ver. 1000); // Cuan lejos se puede ver. glMatrixMode(GL_MODELVIEW); // Escogemos la matriz de vista glLoadIdentity(); gluLookAt(xc,yc,zc, // Desde donde miramos. 4.25, 4.25, 7.5, // Hacia donde miramos. 0.0, 1.0, 0.0); // Que eje es el que esta hacia arriba } void setOrthographicProjection() { // glClearColor (0.5,0.5,0.5,1.0); // cambiamos a modo de proyecion glMatrixMode(GL_PROJECTION); // guardamos la matriz anterior que contiene la // configuracion de la perspectiva de proyecion. glPushMatrix(); // reseteamos la matriz glLoadIdentity(); // Se crea una projection ortografica 2D gluOrtho2D(0, w, 0, h); // se invierte el eje y, es decir, hacia abajo es positivo glScalef(1, -1, 1); // se mueve el origen de la esquina inferior izq. // hacia la esquina superior del mismo lado. glTranslatef(0, -h, 0); glMatrixMode(GL_MODELVIEW); } void resetPerspectiveProjection() { //Configura la matriz actual ha GL_PROJECTION glMatrixMode(GL_PROJECTION); //restaura la configuracion anterior glPopMatrix(); // retorna ha la matrix GL_MODELVIEW glMatrixMode(GL_MODELVIEW); } long double Bfield(double x) { long double b; return b; } void renderScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Guarda la matriz actual en un stack glPushMatrix(); // Activar lineas con Antialiasing glEnable(GL_LINE_SMOOTH); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE); glLineWidth(0.5); //----------------------------------------- View Magnetic Field ----> setViewField(set); //----------------------------------------- View Magnetic Field ----< //----------------------------------------- Moving Particles - LeapFrog --> // setViewMoving(); //----------------------------------------- Moving Particles - LeapFrog --< //-------------------------------AXIS-XYZ--------> glLineWidth(1.5); glBegin(GL_LINE_STRIP); glColor3f(1.0,0.0,0.0); glVertex3f(0.0,0.0,0.0); glVertex3f(14.0,0.0,0.0); glEnd(); glBegin(GL_LINE_STRIP); glColor3f (0.0,1.0,0.0); glVertex3f(0.0,0.0,0.0); glVertex3f(0.0,14.0,0.0); glEnd(); glBegin(GL_LINE_STRIP); glColor3f(0.0,0.0,1.0); glVertex3f(0.0,0.0,0.0); glVertex3f(0.0,0.0,22.0); glEnd(); //-------------------------------AXIS-XYZ--------< //---------- STICKS DE ESCALA PARA LOS EJES------> glColor3f (1.0,1.0,1.0); for(int j=1;j <= 6;j++) { sprintf(label,stick[j-1]); glRasterPos3f ( float(j*2.0),0.0,0.0); drawString (label); } for(int k=1;k<=6;k++) { sprintf(label,stick[k-1]); glRasterPos3f (0.0,float(k*2.0),0.0); drawString (label); } for(int l=1;l<=10;l++) { sprintf(label,stick[l-1]); glRasterPos3f (0.0,0.0,float(l*2.0)); drawString (label); } glColor3f (1.0,0.0,0.0); sprintf(label,"X"); glRasterPos3f(14.0,-0.5,-0.5); drawString (label); glColor3f (0.0,1.0,0.0); sprintf(label,"Y"); glRasterPos3f(-0.5,14.0,-0.5); drawString (label); glColor3f (0.0,0.0,1.0); sprintf(label,"Z"); glRasterPos3f(-0.5,-0.5,22.0); drawString (label); //---------- STICKS DE ESCALA PARA LOS EJES------< glPopMatrix(); // Recupera la matriz guardada en el stack //------------------------------------------- INTERFACE ORTOGRAFICA ----> setOrthographicProjection(); glPushMatrix(); glLoadIdentity(); glColor3f(10.0f,1.0f,1.0f); sprintf(label,"FPS:%5.2f",fps); glRasterPos2f (30.0,90.0); drawString (label); sprintf (label, "AZIMUT = %4.1f",theta); glRasterPos2f (30,30.0); drawString (label); sprintf (label, "ALTURA = %4.1f",rho); glRasterPos2f (30,45.0); drawString (label); sprintf (label, "m = %5d,fm = %5d ",m,fm); glRasterPos2f (30,60.0); drawString (label); sprintf (label, "Tipo de Trampa :%10s",name); glRasterPos2f (30,75.0); drawString (label); glPopMatrix(); resetPerspectiveProjection(); //------------------------------------------- INTERFACE ORTOGRAFICA ---- glutSwapBuffers(); } void keyboard_1(unsigned char key, int x, int y) { int nodos; nodos = nx*nz; switch (key) { case 27: exit(0); break; case '-': distancia += 1.0; break; case '+': distancia -= 1.0; break; case '1': setFieldDat(1);name=" Minimo B"; break; case '2': setFieldDat(2);name=" Cero B"; break; case '3': setFieldDat(3);name=" Espejo"; break; case '4': setFieldDat(4);name=" Cusp"; break; case '0': set=0; break; case '9': set=9; break; case '8': set=8; break; case 'l':case 'L': m+=nodos; fm+=nodos; if(m>(N-nodos)) { m=0; fm=nodos; } break; case 'k':case 'K': m-=nodos; fm-=nodos; if(m<0) { m=N-nodos; fm=N; } break; } } void keyboard_2(int key, int x, int y) { switch (key) { case GLUT_KEY_LEFT : theta += 1.0;break; case GLUT_KEY_RIGHT : theta -= 1.0;break; case GLUT_KEY_UP : rho -= 1.0;break; case GLUT_KEY_DOWN : rho += 1.0;break; } } void viewCam(double theta, double rho) { xc = distancia*cos(theta*M_PI/180.0)*sin(rho*M_PI/180.0); zc = distancia*sin(theta*M_PI/180.0)*sin(rho*M_PI/180.0); yc = distancia*cos(rho*M_PI/180.0); glLoadIdentity(); gluLookAt(xc,yc,zc, 4.25, 4.25, 7.5, 0.0, 1.0, 0.0); } void idle() { t += 0.25; if(theta > 360 || theta < -360) theta=0.0; if(rho > 360 || rho < -360) rho=0.0; viewCam(theta,rho); frame++; time=glutGet(GLUT_ELAPSED_TIME); if (time - timebase > 1000) { fps=frame*1000.0/(time-timebase); timebase = time; frame = 0; } glutPostRedisplay(); } int main(int argc, char **argv) { x[0] = 4.5; y[0] = 4.5; z[0] = 7.0; cout<< "-------------------------------"<<endl; cout<< " Trayectoria de Particulas "<<endl; cout<< " Cagadas un Campo Magnetico "<<endl; cout<< "-------------------------------"<<endl; cout<< "TECLAS:"<<endl; cout<< "-------------------------------"<<endl; cout<< "1 :carga el archivo mbs.dat -Trampa minimoB-"<<endl; cout<< "2 :carga el archivo cbs.dat -Trampa CeroB-"<<endl; cout<< "3 :carga el archivo mirror.dat -Trapa Espejo-"<<endl; cout<< "4 :carga el archivo cups.dat -Trampa Cusp-"<<endl; cout<< " "<<endl; cout<< "8 :campo vectorial (opcion 1,2,3 o 4 anteriores)."<<endl; cout<< "9 :perfil YZ del campo."<<endl; cout<< "l :mueviniento en una direccion del perfil ZY del campo.-"<<endl; cout<< "k :movimiento del perfil en la direccion contraria."<<endl; cout<< " "<<endl; cout<< "UP,Left,Right,Down para mover la vista"<<endl; cout<< "+ y - se aleja o se acerca."<<endl; glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(320,320); glutInitWindowSize(480,400); glutCreateWindow("VECTORIAL FIELD 3D"); init(); glutReshapeFunc(changeSize); // glutFullScreen(); glutKeyboardFunc(keyboard_1); glutSpecialFunc(keyboard_2); glutIdleFunc(idle); glutDisplayFunc(renderScene); glutMainLoop(); return 0; } |
valcoey@hotmail.com
Ramiro Alcocer, 2001
Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links