//fungsi rekursif hilbert dengan pola-pola tertentu void drawHilbert(int *x, int *y, int lengthX, int lengthY, int lvl){ if(lvl>0){ drawHilbert (x, y, lengthY, lengthX, lvl-1); lineForward (x, y, lengthX, -lengthY, BLACK); drawHilbert (x, y, lengthX, lengthY, lvl-1); lineForward (x, y, lengthY, -lengthX, BLACK); drawHilbert (x, y, lengthX, lengthY, lvl-1); lineForward (x, y, -lengthX, lengthY, BLACK); drawHilbert (x, y, -lengthY, -lengthX, lvl-1); } }
void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); drawText(); glCallList(textList); if (displayFFT) { glPushMatrix(); glCallList(fftList); glPopMatrix(); glPointSize(pSize); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(3, GL_DOUBLE, sizeof(point), fftPointList); glColorPointer(4, GL_FLOAT, sizeof(point), &fftPointList[0].r); glDrawArrays(GL_LINES, 0, fftN); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); } if (displayHilbert) { drawHilbert(); } glPushMatrix(); glTranslatef(xx, yy, -zoom); glRotatef(rotx, 1.0, 0.0, 0.0); glRotatef(roty, 0.0, 1.0, 0.0); glRotatef(rotz, 0.0, 0.0, 1.0); GLfloat ambient1[] = {0.15f, 0.15f, 0.15f, 1.0f}; GLfloat diffuse1[] = {0.8f, 0.8f, 0.8f, 1.0f}; GLfloat specular1[] = {1.0f, 1.0f, 1.0f, 1.0f}; GLfloat position1[] = {0.0f, 0.0f, 24.0f, 1.0f}; glLightfv(GL_LIGHT1, GL_AMBIENT, ambient1); glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse1); glLightfv(GL_LIGHT1, GL_DIFFUSE, specular1); glLightfv(GL_LIGHT1, GL_POSITION, position1); glEnable(GL_LIGHT1); drawAxes(); glPointSize(pSize); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(3, GL_DOUBLE, sizeof(point), pointsList); glColorPointer(4, GL_FLOAT, sizeof(point), &pointsList[0].r); glDrawArrays(GL_POINTS, 0, sampleSize); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glPopMatrix(); glutPostRedisplay(); glutSwapBuffers(); }
int main(){ init(); char title[22] = "Hilbert Curve Level 1"; //title window int x, y, length; int lvl = 1; //level mula-mula 1 set_window_title("Hilbert Curve"); allegro_message("Hilbert Curve\n(C) 2008 by A Ninja @ Junior IT"); allegro_message("Press UP / DOWN to change level\nPress ESC to Exit"); do{ //koordinat awal adalah (10, 590) dan mula-mula panjang per garis //lurus adalah 512 px x = 10, y = 590, length = 512; //panjang akan dibagi dua sebanyak lvl kali //jika lebih dari atau sama dengan 8 px for(int i=1; i<=lvl; i++) if(length >= 8) length /= 2; title[20] = lvl+48; title[21] = '\0'; set_window_title(title); //bersihkan layar menjadi putih clear_to_color(screen, WHITE); drawHilbert(&x, &y, 0, length, lvl); do{ readkey(); }while(!key[KEY_UP] && !key[KEY_DOWN] && !key[KEY_ESC]); //jika tombol UP ditekan, maka level akan bertambah if(key[KEY_UP] && lvl<9) lvl++; //jika tombol DOWN ditekan, maka level akan berkurang else if(key[KEY_DOWN] && lvl>1) lvl--; }while(!key[KEY_ESC]); allegro_message("Thanks and good-bye ^_^"); deinit(); return 0; }