본문 바로가기
  • fishing...
  • eating...
MISCELLANEOUSNESS

3차원 가스킷

by 회색뿔 2010. 3. 17.


#include 
#include 
#include 
#include 
#include "glut.h"

GLfloat v[4][3]={{0.0, 0.0, 1.0}, {0.0, 0.942809, -0.33333}, {-0.816497, -0.471405, -0.333333}, {0.816497, -0.471405, -0.333333}};
GLfloat colors[4][3] = {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, 0.0}};

int n;

void myinit(void)
{
	/* 속성들 */
	glClearColor(1, 1, 1, 1); 
	glColor3f(1.0, 1.0, 1.0); 

	glEnable( GL_DEPTH_TEST );
	/* 관측의 설정 */
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(-25.0, 25.0, -25.0, 25.0);
	glMatrixMode(GL_MODELVIEW);
}	

void triangle( GLfloat *a, GLfloat *b, GLfloat *c )
{
	glBegin( GL_TRIANGLES );
		glVertex3fv( a );
		glVertex3fv( b );
		glVertex3fv( c );
	glEnd();
}

void tetra( GLfloat *a, GLfloat *b, GLfloat *c, GLfloat *d )
{
	glColor3fv( colors[ 0 ] );
	triangle( a, b, c );
	glColor3fv( colors[ 1 ] );
	triangle( a, c, d );
	glColor3fv( colors[ 2 ] );
	triangle( a, d, b );
	glColor3fv( colors[ 3 ] );
	triangle( b, d, c );
}

void divide_tetra( GLfloat *a, GLfloat *b, GLfloat *c, GLfloat *d, int m )
{
	GLfloat mid[ 6 ][ 3 ];
	int j;

	if( m > 3 )
	{
		/* 6개 중점의 중점 계산 */
		for( j = 0; j < 3; j++ ) mid[ 0 ][ j ] = ( a[ j ] + b[ j ] ) / 2;
		for( j = 0; j < 3; j++ ) mid[ 1 ][ j ] = ( a[ j ] + c[ j ] ) / 2;
		for( j = 0; j < 3; j++ ) mid[ 2 ][ j ] = ( a[ j ] + d[ j ] ) / 2;
		for( j = 0; j < 3; j++ ) mid[ 3 ][ j ] = ( b[ j ] + c[ j ] ) / 2;
		for( j = 0; j < 3; j++ ) mid[ 4 ][ j ] = ( c[ j ] + d[ j ] ) / 2;
		for( j = 0; j < 3; j++ ) mid[ 5 ][ j ] = ( b[ j ] + d[ j ] ) / 2;

		divide_tetra( a, mid[ 0 ], mid[ 1 ], mid[ 2 ], m - 1 );
		divide_tetra( mid[ 0 ], b, mid[ 3 ], mid[ 5 ], m - 1 );
		divide_tetra( mid[ 1 ], mid[ 3 ], c, mid[ 4 ], m - 1 );
		divide_tetra( mid[ 2 ], mid[ 4 ], d, mid[ 5 ], m - 1 );
	}
	else
	{
		tetra( a, b, c, d );
	}
}

void display(void)
{
	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
	glBegin( GL_TRIANGLES );
	divide_tetra( v[ 0 ], v[ 1 ], v[ 2 ], v[ 3 ] , n );
	glEnd(); 
	glFlush();
}

void myReshape(int w, int h)
{
	glViewport(0, 0, w, h); 
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity();
	
	if (w <= h)
		glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w,
			2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0);
	else
		glOrtho(-2.0 * (GLfloat) w / (GLfloat) h,
			2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0, 10.0);
	
	glMatrixMode(GL_MODELVIEW);  
	glutPostRedisplay();
}


void main(int argc, char **argv)
{
	glutInit(&argc, argv);

	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH );
	glutInitWindowSize(500, 500);
	glutInitWindowPosition(0, 0);

	printf( "input n = " );
	scanf( "%d", &n );

	glutCreateWindow("Practice - 01");
	glutDisplayFunc(display);
	glutReshapeFunc(myReshape);
	
	myinit();
	
	glutMainLoop();
}




'MISCELLANEOUSNESS' 카테고리의 다른 글

eclipse + python  (2) 2010.03.20
2차원 가스킷  (0) 2010.03.17
가스킷 그리기  (0) 2010.03.11