/* plot6d_gl.c plot up to 6d data, mouse select choice * reads from stdin, first line 6 nv nw nx ny nz nt * many lines v w x y z t u * sorted v first, w next, ... * plot6d_gl < file.dat > file.out * converted from plot5d_gl.c */ #include #include #include #include #include #undef max #define max(a,b) ((a>b)?(a):(b)) #undef min #define min(a,b) ((a1) { if(argv[1][0]=='s') solid = 1; if(argv[1][0]=='b') buffer = 1; if(argv[1][0]=='a') { solid = 1; buffer = 1;} } if(solid && buffer) glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); if(solid && !buffer) glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH ); if(!solid & buffer) glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE ); if(!solid & !buffer) glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE ); glutInitWindowSize(width, height); glutInitWindowPosition(10,10); glutCreateWindow(argv[0]); glutReshapeFunc(reshape); glutDisplayFunc(paint); glutMouseFunc(mouse); glutIdleFunc(do_scan); if(solid) glEnable(GL_DEPTH_TEST); glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, (GLfloat)width, 0.0, (GLfloat)height, -0.1, (GLfloat)height+0.1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClearColor(1.0, 1.0, 1.0, 0.0); glutMainLoop(); return 0; } /* end main */ void reshape(int w, int h) { glViewport(0, 0, w, h); width = w; height = h; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, (GLfloat)width, 0.0, (GLfloat)height, -0.1, (GLfloat)height+0.1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glutPostRedisplay(); } void do_scan() { if(running==0) return; if(stop==1) return; v6step++; if(v6step>=nv6) { v6step = 0; v5step++; if(v5step>=nv5) { v5step=0; v4step++; if(v4step>=nv4) { v4step = 0; v3step++; if(v3step>=nv3) { v3step=0; } } } } repaint(); } /* end do_scan */ void mouse(int button, int state, int x, int y) { xm = x; ym = height-y; bm = 1; if(state==GLUT_DOWN) { /* printf("mouse down x=%d, y=%d, ym=%d \n", x, y, ym); */ if(in_rect(width-75, 10, 30, 20)) { /* dynamic display do_scan */ v6step = nv6; /* optional, could go from current position */ v5step = nv5; v4step = nv4; v3step = nv3; running = 1; stop = 0; } else if(in_rect(width-75, 40, 30, 20)) { /* stop */ stop = 1; running = 0; printf("check stop \n"); } else if(in_rect(width-120, 40, 50, 20)) { /* faster */ speed -= 0.01; printf("faster speed = %f \n",speed); if(speed<0) speed = 0.0; } else if(in_rect(width-180, 40, 50, 20)) { /* slower */ speed += 0.01; printf("slower speed = %f \n",speed); if(speed>250) speed = 0.3; } else if(in_rect(width-55, 70, 50, 20)) { /* step4D */ v6step++; if(v6step>=nv6) v6step=0; repaint(); } else if(in_rect(width-110, 70, 50, 20)) { /* step3D */ v5step++; if(v5step>=nv5) v5step=0; repaint(); } else if(in_rect(width-165, 70, 50, 20)) { /* step2D */ v4step++; if(v4step>=nv4) v4step=0; repaint(); } else if(in_rect(width-220, 70, 50, 20)) { /* step1D */ v3step++; if(v3step>=nv3) v3step=0; repaint(); } else if(in_rect(width-140, 10, 60, 20)) { /* next scan */ var3++; if(var3>dim-1) var3 = 0; while(var3==var1 || var3==var2) { var3++; if(var3>dim-1) var3 = 0; } var4 = 0; while(var4==var1 || var4==var2 || var4==var3) { var4++; } var5 = 0; while(var5==var1 || var5==var2 || var5==var3 || var5==var4) { var5++; } var6 = 0; while(var6==var1 || var6==var2 || var6==var3 || var6==var4 || var6==var5) { var6++; } v3step = nn[var3]-1; v4step = nn[var4]-1; v5step = nn[var5]-1; v6step = nn[var6]-1; repaint(); } else if(in_rect(width-220, 10, 65, 20)) { /* next side */ var2++; if(var2>dim-1) var2 = 0; if(var2==var1) var2++; while(var1==var3 || var2==var3) { var3++; if(var3>dim-1) var3 = 0; } var4 = 0; while(var4==var1 || var4==var2 || var4==var3) { var4++; } var5 = 0; while(var5==var1 || var5==var2 || var5==var3 || var5==var4) { var5++; } var6 = 0; while(var6==var1 || var6==var2 || var6==var3 || var6==var4 || var6==var5) { var6++; } v3step = nn[var3]-1; v4step = nn[var4]-1; v5step = nn[var5]-1; v6step = nn[var6]-1; repaint(); } else if(in_rect(width-295, 10, 70, 20)) { /* next front */ var1++; if(var1>dim-1) var1 = 0; if(var1==var2) var2++; if(var2>dim-1) var2 = 0; while(var1==var3 || var2==var3) { var3++; if(var3>dim-1) var3 = 0; } var4 = 0; while(var4==var1 || var4==var2 || var4==var3) { var4++; } var5 = 0; while(var5==var1 || var5==var2 || var5==var3 || var5==var4) { var5++; } var6 = 0; while(var6==var1 || var6==var2 || var6==var3 || var6==var4 || var6==var5) { var6++; } v3step = nn[var3]-1; v4step = nn[var4]-1; v5step = nn[var5]-1; v6step = nn[var6]-1; repaint(); } if(in_rect(width-35, 10, 30, 20)) { /* quit run or job */ if(running) stop=1; else exit(0); } } /* end if down */ } /* end mousePressed */ GLfloat * Op(double x, double y, double u) /* Ortho plot */ { zop[0] = xoff+x*scale+0.5*y*scale; if(zop[0]>0.9*width) zop[0] = 0.9*width; zop[1] = yoff+u*scale+0.5*y*scale; if(zop[0]>0.9*height) zop[0] = 0.9*height; zop[2] = y*scale; if(!solid) zop[2] = 0.0; if(debug) printf("Op returns %f, %f, %f \n", zop[0], zop[1], zop[2]); return zop; } /* end Op */ int in_rect(int x, int y, int w, int h) { return xm>x && xmy && ym=nvwxyzt) { printf("index error, lin=%d >= %d \n", lin, nvwxyzt); lin = nvwxyzt-1; } return lin; } /* end i6x */ void set_color(int i) { if(i<0) {glColor3f(0.0, 0.0, 0.0); return;} if(i>9) {glColor3f(0.7, 0.7, 0.7); return;} switch(i) { case 0: glColor3f(0.0, 0.0, 0.0); break; case 1: glColor3f(1.0, 0.5, 0.5); break; /* should be brown */ case 2: glColor3f(1.0, 0.0, 0.0); break; case 3: glColor3f(1.0, 1.0, 0.0); break; case 4: glColor3f(0.0, 1.0, 1.0); break; case 5: glColor3f(0.0, 1.0, 0.0); break; case 6: glColor3f(0.0, 0.0, 1.0); break; case 7: glColor3f(0.5, 0.5, 1.0); break; case 8: glColor3f(1.0, 0.0, 1.0); break; case 9: glColor3f(0.7, 0.7, 0.7); break; } } /* end set_color */ void fillRect(int x, int y, int w, int h) { glBegin(GL_POLYGON); glVertex2f(x, y); glVertex2f(x, y+h); glVertex2f(x+w, y+h); glVertex2f(x+w, y); glEnd(); } /* end fillrect */ void drawBox(int x, int y, int w, int h) { glBegin(GL_LINE_LOOP); glVertex2f(x-2, y-2); glVertex2f(x-2, y+h+2); glVertex2f(x+w+2, y+h+2); glVertex2f(x+w+2, y-2); glVertex2f(x-2, y-2); glEnd(); } /* end drawBox */ void printstring(int x, int y, char *string) { int len, i; glRasterPos2i(x, y); len = (int) strlen(string); for (i = 0; i < len; i++) glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, string[i]); } /* end printstring */ int S(int i, int ii, int iii, int iiii, int iiiii, int iiiiii) { return i*nw*nx*ny*nz*nt + ii*nx*ny*nz*nt + iii*ny*nz*nt + iiii*nz*nt + iiiii*nt + iiiiii; } /* end S */ void repaint() { glutPostRedisplay(); } void read_data() { int i, n_input; printf("read_data running \n"); scanf("%d %d %d %d %d %d %d", &dim, &nv, &nw, &nx, &ny, &nz, &nt); printf("dim=%d \n", dim); printf("nv=%d \n", nv); printf("nw=%d \n", nw); printf("nx=%d \n", nx); printf("ny=%d \n", ny); printf("nz=%d \n", nz); printf("nt=%d \n", nt); nvwxyzt = nv*nw*nx*ny*nz*nt; printf("about to allocate %d points times %d doubles, %d bytes each for %d bytes \n", nvwxyzt, dim+1, sizeof(double), nvwxyzt*(dim+1)*sizeof(double)); pt = (double *)malloc(nvwxyzt*(dim+1)*sizeof(double)); printf("allocation sucessful \n"); n_input = 0; /* read data points, last index varies by 1 */ while(1) { scanf("%lf %lf %lf %lf %lf %lf %lf", &pt[n_input*(dim+1)+0], &pt[n_input*(dim+1)+1], &pt[n_input*(dim+1)+2], &pt[n_input*(dim+1)+3], &pt[n_input*(dim+1)+4], &pt[n_input*(dim+1)+5], &pt[n_input*(dim+1)+6]); if(n_input==0) { dvmin = pt[n_input*(dim+1)+0]; dvmax = pt[n_input*(dim+1)+0]; dwmin = pt[n_input*(dim+1)+1]; dwmax = pt[n_input*(dim+1)+1]; dxmin = pt[n_input*(dim+1)+2]; dxmax = pt[n_input*(dim+1)+2]; dymin = pt[n_input*(dim+1)+3]; dymax = pt[n_input*(dim+1)+3]; dzmin = pt[n_input*(dim+1)+4]; dzmax = pt[n_input*(dim+1)+4]; dtmin = pt[n_input*(dim+1)+5]; dtmax = pt[n_input*(dim+1)+5]; dumin = pt[n_input*(dim+1)+6]; dumax = pt[n_input*(dim+1)+6]; printf("v=%f w=%f x=%f, y=%f, z=%f, t=%f, u=%f \n", dvmin, dwmin, dxmin, dymin, dzmin, dtmin, dumin); } else { dvmin = min(dvmin,pt[n_input*(dim+1)+0]); dvmax = max(dvmax,pt[n_input*(dim+1)+0]); dwmin = min(dwmin,pt[n_input*(dim+1)+1]); dwmax = max(dwmax,pt[n_input*(dim+1)+1]); dxmin = min(dxmin,pt[n_input*(dim+1)+2]); dxmax = max(dxmax,pt[n_input*(dim+1)+2]); dymin = min(dymin,pt[n_input*(dim+1)+3]); dymax = max(dymax,pt[n_input*(dim+1)+3]); dzmin = min(dzmin,pt[n_input*(dim+1)+4]); dzmax = max(dzmax,pt[n_input*(dim+1)+4]); dtmin = min(dtmin,pt[n_input*(dim+1)+5]); dtmax = max(dtmax,pt[n_input*(dim+1)+5]); dumin = min(dumin,pt[n_input*(dim+1)+6]); dumax = max(dumax,pt[n_input*(dim+1)+6]); } n_input++; if(n_input==nvwxyzt) break; } /* end while */ printf("read_data finished, n_input=%d \n", n_input); printf("vmin=%f, vmax=%f, last=%f \n", dvmin, dvmax, pt[(nvwxyzt-1)*(dim+1)+0]); printf("wmin=%f, wmax=%f, last=%f \n", dwmin, dwmax, pt[(nvwxyzt-1)*(dim+1)+1]); printf("xmin=%f, xmax=%f, last=%f \n", dxmin, dxmax, pt[(nvwxyzt-1)*(dim+1)+2]); printf("ymin=%f, ymax=%f, last=%f \n", dymin, dymax, pt[(nvwxyzt-1)*(dim+1)+3]); printf("zmin=%f, zmax=%f, last=%f \n", dzmin, dzmax, pt[(nvwxyzt-1)*(dim+1)+4]); printf("tmin=%f, tmax=%f, last=%f \n", dtmin, dtmax, pt[(nvwxyzt-1)*(dim+1)+5]); printf("umin=%f, umax=%f, last=%f \n", dumin, dumax, pt[(nvwxyzt-1)*(dim+1)+6]); for(i=0; i