Ok adesso che è tutto chiaro sono riuscito a dare un sguardo al tuo codice.
In effetti c'eri quasi vicina, ma hai fatto alcuni errori.
Questo è il codice corretto
In primis, attenzione quando apri e chiudi i file sul disco, hai fatto confusione con le variabili (chiudi due volte la variabile dati ma in realtà la seconda volta dovrebbe essere datidue. In generale, usa dei nomi più chiari.codice:#define MAXR 1236#define MAXC 103*32676 #include <OpenGL/gl.h> #include <OpenGL/glu.h> #include <GLUT/glut.h> #include <iostream> #include <fstream> float mat[MAXR]; int seq[MAXC]; int sfondo[32676]; using namespace std; GLfloat t = 4; int c = 0; static uint frameCount = 0; void init(void) { glClearColor(0.7, 0.7, 0.7, 0.0); // colore sfondo, il quarto parametro indica la trasparenza glShadeModel(GL_FLAT); glEnable(GL_DEPTH_TEST); } void draw(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); for (int j = 0; j < 728; j=j+12) { glBegin(GL_POLYGON); uint colorIndex = (frameCount * j) % c; int colorValue = seq[colorIndex]; glColor3f(colorValue, colorValue, colorValue); for (int i = 1*j; i < 1*j+12; i = i + 2) { glVertex2f(mat[i],mat[i + 1]); } glEnd(); //fine poligono } glutSwapBuffers(); frameCount++; } void display(void) { glutPostRedisplay(); // la finestra corrente deve essere nuovamente visualizzata } void mouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) //clic del muose glutIdleFunc(display); break; case GLUT_RIGHT_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(NULL); break; default: break; } } void Resize(int iWidth, int iHeight) { glViewport(0, 0, (GLsizei)iWidth, (GLsizei)iHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-683.0, 683.0, -384.0, 384.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int main(int argc, char** argv) { ifstream exagonData("puntook.txt"); int r = 0; while (!exagonData.eof()) { exagonData >> mat[r]; r++; } exagonData.close(); // legge dati sequenza ifstream blackWhite("dec_pol15.txt"); while (!blackWhite.eof()) { blackWhite >> seq[c]; c++; } blackWhite.close(); glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(1024, 768); glutInitWindowPosition(100, 100); glutCreateWindow("Pattern 103 esagoni"); init(); glutDisplayFunc(draw); glutReshapeFunc(Resize); glutMouseFunc(mouse); glutMainLoop(); }
glBegin deve essere usato all'inizio di ogni poligono e non di ogni vertice (per cui va messo fuori dal for in cui l'hai piazzato tu).
L'algoritmo con cui scegli il colore dell'esagono corrispondente è errato. Rivedi il mio per capire come ho fatto.
Ed il risultato finale è questo (molto più veloce sul mio MacBook)
Un saluto!


Rispondi quotando
