EXIF Viewer사진 크기706x766
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();
}
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
8 |
[OpenGL] OpenGL 표현에 필요한 파일들...
![]() | simpled | 2013.09.22 | 3090 |
7 |
[C :: OpenGL] 곡선
![]() | simpled | 2013.08.05 | 4347 |
6 |
[C :: OpenGL] 프로젝션을 사용하지 않은 그림자 생성
![]() | simpled | 2013.08.05 | 6536 |
» |
[C :: OpenGL] 2D 프로젝션 코드 (그림자 생성 원리)
![]() | 심플디 | 2013.08.05 | 8205 |
4 |
[C :: OpenGL] 삼각형 그리기
![]() | simpled | 2013.08.05 | 3915 |
3 |
[C :: OpenGL] cosin^n (Θ)의 3D 그래프
![]() | 심플디 | 2013.08.05 | 3224 |
2 |
[C :: OpenGL] 움직이는 4각형 :: OpenGL
![]() | simpled | 2013.08.05 | 3723 |
1 |
[C :: OpenGL] OpenGL utility toolkit. zip
![]() | simpled | 2013.08.05 | 3456 |