목차
A.1 시어핀스키 가스켓
A.2 시어핀스키 가스켓의 순환적 생성
A.3 삼차원 시어핀스키 가스켓
A.4 순환적 삼차원 시어핀스키 가스켓
A.2 시어핀스키 가스켓의 순환적 생성
A.3 삼차원 시어핀스키 가스켓
A.4 순환적 삼차원 시어핀스키 가스켓
본문내용
0.,0.);
glVertex3f(New.x, New.y,New.z);
glEnd();
/* 이전 점을 새로운 점으로 교체 */
old.x=New.x;
old.y=New.y;
old.z=New.z;
glFlush(); /* 버퍼를 비움*/
}
void mouse(int btn, int state, int x, int y) /* 마우스 답신 */
{
if(btn==GLUT_LEFT_BUTTON&state==GLUT_DOWN) glutIdleFunc(display);
if(btn==GLUT_MIDDLE_BUTTON&state==GLUT_DOWN) glutIdleFunc(NULL);
if(btn==GLUT_RIGHT_BUTTON&state==GLUT_DOWN) exit(0);
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(0,0);
glutCreateWindow("Sierpinski Gasket");
glutIdleFunc (display);
glutMouseFunc (mouse);
glClearColor(1.0, 1.0, 1.0, 0.0); /* 흰 배경 */
glColor3f(1.0, 0.0, 0.0); /* 적색으로 그리기 */
glMatrixMode(GL_PROJECTION); /* 투영 행렬 모드 */
glLoadIdentity(); /* 단위 행렬 */
glOrtho(0.0, 500.0, 0.0, 500.0, -500.0, 500.0);
glMatrixMode(GL_MODELVIEW);
glutDisplayFunc(clear);
glutMainLoop(); /* 이벤트 루프로 들어감 */
}
- 결과
A.4 순환적 삼차원 시어핀스키 가스켓
- 프로그램 소스
// 삼차원 시어핀스키 가스켓을 구성하기 위한 사면체의 순환적 분할
// 순환 단계는 명령 라인에 주어짐
#include
#include
typedef float point3[3];
// 초기 사면체
point3 v[]={{0.0, 0.0, 1.0}, {0.0, 0.942809, -0.33333},
{-0.816497, -0.471405, -0.333333}, {0.816497, -0.471405, -0.333333}};
static GLfloat theta[] = {0.0,0.0,0.0};
int n;
void triangle( point3 a, point3 b, point3 c)
/* 선구조를 위한 하나의 라인 루프와 균일 음영을 위한 하나의 법선
또는 보간 음영을 위한 세 개의 법선 */
{
glBegin(GL_POLYGON);
glNormal3fv(a);
glVertex3fv(a);
glVertex3fv(b);
glVertex3fv(c);
glEnd();
}
void divide_triangle(point3 a, point3 b, point3 c, int m)
{
/* 정점 번호를 이용한 삼각형 분할 외향면을 생성하기위해서 오른손법칙을적용 */
point3 v1, v2, v3;
int j;
if(m>0)
{
for(j=0; j<3; j++) v1[j]=(a[j]+b[j])/2;
for(j=0; j<3; j++) v2[j]=(a[j]+c[j])/2;
for(j=0; j<3; j++) v3[j]=(b[j]+c[j])/2;
divide_triangle(a, v1, v2, m-1);
divide_triangle(c, v2, v3, m-1);
divide_triangle(b, v3, v1, m-1);
}
else(triangle(a,b,c)); // 순환의 마지막에 삼각형을 그림
}
void tetrahedron( int m)
{
// 사면체의 각 면들에 삼각형 분할을 적용
glColor3f(1.0,0.0,0.0);
divide_triangle(v[0], v[1], v[2], m);
glColor3f(0.0,1.0,0.0);
divide_triangle(v[3], v[2], v[1], m);
glColor3f(0.0,0.0,1.0);
divide_triangle(v[0], v[3], v[1], m);
glColor3f(0.0,0.0,0.0);
divide_triangle(v[0], v[2], v[3], m);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
tetrahedron(n);
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)
{
n=4;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutCreateWindow("3D Gasket");
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glEnable(GL_DEPTH_TEST);
glClearColor (1.0, 1.0, 1.0, 1.0);
glutMainLoop();
}
- 결 과
glVertex3f(New.x, New.y,New.z);
glEnd();
/* 이전 점을 새로운 점으로 교체 */
old.x=New.x;
old.y=New.y;
old.z=New.z;
glFlush(); /* 버퍼를 비움*/
}
void mouse(int btn, int state, int x, int y) /* 마우스 답신 */
{
if(btn==GLUT_LEFT_BUTTON&state==GLUT_DOWN) glutIdleFunc(display);
if(btn==GLUT_MIDDLE_BUTTON&state==GLUT_DOWN) glutIdleFunc(NULL);
if(btn==GLUT_RIGHT_BUTTON&state==GLUT_DOWN) exit(0);
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(0,0);
glutCreateWindow("Sierpinski Gasket");
glutIdleFunc (display);
glutMouseFunc (mouse);
glClearColor(1.0, 1.0, 1.0, 0.0); /* 흰 배경 */
glColor3f(1.0, 0.0, 0.0); /* 적색으로 그리기 */
glMatrixMode(GL_PROJECTION); /* 투영 행렬 모드 */
glLoadIdentity(); /* 단위 행렬 */
glOrtho(0.0, 500.0, 0.0, 500.0, -500.0, 500.0);
glMatrixMode(GL_MODELVIEW);
glutDisplayFunc(clear);
glutMainLoop(); /* 이벤트 루프로 들어감 */
}
- 결과
A.4 순환적 삼차원 시어핀스키 가스켓
- 프로그램 소스
// 삼차원 시어핀스키 가스켓을 구성하기 위한 사면체의 순환적 분할
// 순환 단계는 명령 라인에 주어짐
#include
#include
typedef float point3[3];
// 초기 사면체
point3 v[]={{0.0, 0.0, 1.0}, {0.0, 0.942809, -0.33333},
{-0.816497, -0.471405, -0.333333}, {0.816497, -0.471405, -0.333333}};
static GLfloat theta[] = {0.0,0.0,0.0};
int n;
void triangle( point3 a, point3 b, point3 c)
/* 선구조를 위한 하나의 라인 루프와 균일 음영을 위한 하나의 법선
또는 보간 음영을 위한 세 개의 법선 */
{
glBegin(GL_POLYGON);
glNormal3fv(a);
glVertex3fv(a);
glVertex3fv(b);
glVertex3fv(c);
glEnd();
}
void divide_triangle(point3 a, point3 b, point3 c, int m)
{
/* 정점 번호를 이용한 삼각형 분할 외향면을 생성하기위해서 오른손법칙을적용 */
point3 v1, v2, v3;
int j;
if(m>0)
{
for(j=0; j<3; j++) v1[j]=(a[j]+b[j])/2;
for(j=0; j<3; j++) v2[j]=(a[j]+c[j])/2;
for(j=0; j<3; j++) v3[j]=(b[j]+c[j])/2;
divide_triangle(a, v1, v2, m-1);
divide_triangle(c, v2, v3, m-1);
divide_triangle(b, v3, v1, m-1);
}
else(triangle(a,b,c)); // 순환의 마지막에 삼각형을 그림
}
void tetrahedron( int m)
{
// 사면체의 각 면들에 삼각형 분할을 적용
glColor3f(1.0,0.0,0.0);
divide_triangle(v[0], v[1], v[2], m);
glColor3f(0.0,1.0,0.0);
divide_triangle(v[3], v[2], v[1], m);
glColor3f(0.0,0.0,1.0);
divide_triangle(v[0], v[3], v[1], m);
glColor3f(0.0,0.0,0.0);
divide_triangle(v[0], v[2], v[3], m);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
tetrahedron(n);
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)
{
n=4;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutCreateWindow("3D Gasket");
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glEnable(GL_DEPTH_TEST);
glClearColor (1.0, 1.0, 1.0, 1.0);
glutMainLoop();
}
- 결 과
소개글