기말과제 .hwp

실행파일만 있는 폴더.zip



제목없~1.JPG


Report 내용 中 : 실행파일만 있는 폴더.zip

 

회전함수에 대한 설명은 중간 과제를 통하여 설명했으므로 넘어간다.

현재 이 프로그램은 사각형의 회전에 따른, 그림자의 생성에 주제가 맞추어져 있다.

그림 1-2은 그림자를 생성하기 위한 좌표 계산 방법을 보여주고 있다.

그림 1-1, 및 그림 1-2의 L의 위치는 상수이며 1점의 위치도 상수이다. 또한 1‘점의 높이 또한 상수 이므로, 1’점의 폭(x축의 거리)은 계산될 수 있다.

 

만약, F1 key가 눌린다면, (KeyPath함수)

1. 제 1~4점을 원점을 중심으로 약간 회전시키고 그 좌표값을 순서대로 x[] y[]에 초기화함.

(KeyPath -> Matrix 함수)

2. 제 1~4점과 L의 거리의 비를 통해 1‘~4'점을 shaodw배열에 초기화시킨다.

(KeyPath -> Shadow 함수)

3. 최대값, 최소값을 비교하고, 각각 max, min 변수에 초기화시킨다.

(KeyPath 함수)

4. 위에 위치한 삼각형과 아래에 위치한 사각형을 그려준다.

(RenderScene 함수)

5. x배열 및 y배열에 초기화된 좌표값을 근거로 중간에 위치한 사각형을 그린다.

(RenderScene 함수)

6. max, min, L점을 잇는 삼각형을 그린다.

(RenderScene 함수)

 

#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include "glut.h"
#include "glext.h"
#include "wglext.h"

#include <math.h>
#include <stdio.h>

 GLfloat angle=0.08;
 GLfloat x[]={10, 10,-10,-10};
 GLfloat y[]={10,-10,-10, 10};
 GLfloat max,min,shadow[4];

void ChangeSize(GLsizei w, GLsizei h){
    GLfloat AspectRatio=(GLfloat)h/(GLfloat)w;
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (w<=h) glOrtho(-100,100,-100*AspectRatio,100*AspectRatio,100,-100);
      else    glOrtho(-100/AspectRatio,100/AspectRatio,-100,100,100,-100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }

void RenderScene(void){
    glClearColor(0.3,0.3,0.3,1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_POLYGON);
        glColor3f(1,0.5,0.5);
        glVertex3f(x[0],y[0],0);
        glVertex3f(x[1],y[1],0);
        glVertex3f(x[2],y[2],0);
        glVertex3f(x[3],y[3],0);
        glEnd();
    glBegin(GL_POLYGON);
        glVertex3f(0,50,0);
        glVertex3f(5,55,0);
        glVertex3f(-5,55,0);
        glEnd();
    glBegin(GL_POLYGON);
        glColor3f(0,0,0);
        glVertex3f(50,-60,0);
        glVertex3f(-50,-60,0);
        glVertex3f(-50,-65,0);
        glVertex3f(50,-65,0);
        glEnd();
    glBegin(GL_LINES);
        glColor3f(1,1,1);
        glVertex3f(0,50,0);
        glVertex3f(max,-59,0);
        glEnd();
    glBegin(GL_LINES);
        glVertex3f(0,50,0);
        glVertex3f(min,-59,0);
        glEnd();
    glBegin(GL_LINES);
        glVertex3f(max,-59,0);
        glVertex3f(min,-59,0);
        glEnd();
    glutSwapBuffers();
    }
void KeyPath(int po, int x, int y){
    int i,j;
    int a,b;
    if(po==GLUT_KEY_F1){
        for(i=0; i<4; i++){
            Matrix(i);
            Shadow(i);
            }
        for(i=0; i<4; i++){
            for(j=0; j<4; j++){
                if(shadow[i]>shadow[j])a++;
                if(shadow[i]<shadow[j])b++;
                if(a>2)max=shadow[i];
                if(b>2)min=shadow[i];
                }
            a=0;
            b=0;
            }
        }
    glutPostRedisplay();
    }

void Matrix(GLsizei Q){
    int i,j;
    GLfloat First[]={x[Q], y[Q], 1, 1};
    GLfloat Second[][4]={{cos(angle),   sin(angle),     0,              0},
                        {-sin(angle),   cos(angle),     0,              0},
                        {0,             0,              1,              0},
                        {0,             0,              0,              1}};
    GLfloat Third[]={0,0,0,1};
        for(i=0; i<4; i++){
            for (j=0;j<4;j++){
                Third[i]+=First[j]*Second[j][i];
                }
            }
        x[Q]=Third[0];
        y[Q]=Third[1];
    }

void Shadow(GLsizei p){
    GLfloat lx,ly,px,py,zx,zy;
    zx=((50-(-59))*x[p])/(50-y[p]);
    shadow[p]=zx;
    }

void main(void){
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("신동석");
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);
    glutSpecialFunc(KeyPath);
    glutMainLoop();
    }