삼각형 분할하기 + 사면체 분할하기
------------------------------------------------------------------------------------------------------------------
1. 삼각형 분할하기
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<GL/glut.h>
GLfloat v[3][2]={{-1.0, -0.58}, {1.0, -0.58}, {0.0, 1.15}};
int n=5; //5회 분할을 선언
void triangle(GLfloat *a, GLfloat *b, GLfloat *c) //삼각형의 점 설정, x축과 y축, z축
{
glBegin(GL_TRIANGLES);
glVertex2fv(a);
glVertex2fv(b);
glVertex2fv(c);
glEnd();
}
void divide_triangle(GLfloat *a, GLfloat *b, GLfloat *c, int k) //k는 반복 제어 함수 k값은 display함수에서 가져 옴
{
GLfloat ab[2], ac[2], bc[2]; //각 변의 중점
int j;
if(k>0)
{
/* 변의 중점 계산 */
for(j=0; j<2; j++) ab[j]=(a[j]+b[j])/2;
for(j=0; j<2; j++) ac[j]=(a[j]+c[j])/2;
for(j=0; j<2; j++) bc[j]=(b[j]+c[j])/2;
/* 내부를 제외한 3개의 삼각형 분할 */
divide_triangle(a, ab, ac, k-1);
divide_triangle(c, ac, bc, k-1);
divide_triangle(b, bc, ab, k-1);
}
else(triangle(a,b,c)); /*재귀가 끝나면 삼각형 그림 */
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT); //화면 분할
glBegin(GL_TRIANGLES); //도형 그리기 시작
divide_triangle(v[0], v[1], v[2], n); //삼각형 분할
glEnd(); //그리기 종료
glFlush(); //finish보다 종료 속도가 더 빠름
}
void myinit(void)
{
/* 속성들 */
glClearColor(1.0, 1.0, 1.0, 1.0); /* 흰 배경 */
glColor3f(1.0, 0.0, 0.0); /* 적색으로 그림 */
/* 관측의 설정 */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-2.0, 2.0, -2.0, 2.0); //관측공간의 너비와 높이 설정
glMatrixMode(GL_MODELVIEW);
}
void main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //윈도우의 속성을 요청. 프레임버퍼 1개만, RGB컬러 사용
glutInitWindowSize(500, 500); //500*500 픽셀단위로 설정
glutInitWindowPosition(0, 0); //화면 좌상단의 위치 지정
glutCreateWindow("triangle");
glutDisplayFunc(display); //디스플레이 답신 지정
myinit();
glutMainLoop(); //무한 이벤트 루프로 돌아감
}
결과
2. 사면체 분할하기