//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);
    }
}
Exemple #2
0
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;
}