목차 1 점그리기 2 선그리기 3 다각형그리기 이병래교수 / 방송대컴퓨터과학과 점그리기 OpenGL - 꼭짓점지정 점 glverte* 함수 하나의좌표로표현되는기하요소 void glverte*( 좌표 ); 3 차원그래픽스에서는기본적으로,, z의세좌표축으로표현되는 3차원직교좌표계를사용하여점의좌표를표현함 와 축으로표현되는 2차원평면은 z축의값이 0인 3차원좌표로볼수있음 z 50 0 100 * : 접미사코드 첫째 둘째 2, 3, 또는 4 : 좌표공간의차원 i(integer), s(short), f(float), d(double) 셋째 v : 배열형태 (vector) 의좌표지정 교재관련부분 : 66 쪽 교재관련부분 : 66 쪽
OpenGL - 꼭짓점지정 glverte* 함수 void glverte*( 좌표 ); OpenGL - 점그리기 glverte* 함수로좌표위치지정 glbegin 함수와 glend 함수사이에좌표를나열 glverte2i(50, 100); glverte3f(50.0f, 100.0f, 0.0f); glverte4d(50.0, 100.0, 0.0, 1.0); GLint point[ ] = {50, 100}; glverte2iv(point); void glbegin(glenum mode); void glend(void); mode : 그리고자하는도형을나타내는상수 GL_POINTS GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN GL_QUADS, GL_QUAD_STRIP GL_POLYGON 교재관련부분 : 66 쪽 교재관련부분 : 67 쪽 OpenGL - 점그리기 목차 glbegin(gl_points); glverte2i(50, 100); glend( ); 200 1 점그리기 GLint p[3][2] = {{50, 100}, {75, 150}, {100, 200}}; glbegin(gl_points); glverte2iv(p[0]); glverte2iv(p[1]); glverte2iv(p[2]); glend( ); 150 100 50 50 100 150 2 선그리기 3 다각형그리기 교재관련부분 : 67~68 쪽
OpenGL - 직선그리기 OpenGL - 직선그리기 glbegin 함수와 glend 함수사이에 glverte* 함수로양끝점좌표위치지정 끝점의연결방법 GL_LINES : 나열된끝점들을두개씩짝을지어선분을그림 GL_LINE_STRIP : 나열된점들을계속연결하여다중선을그림 GL_LINE_LOOP : 나열된점들을계속연결하여닫힌다중선을그림 glbegin(gl_lines); glverte2iv(p1); glverte2iv(p2); glverte2iv(p3); glverte2iv(p4); glverte2iv(p5); glend( ); p5 p2 p3 p4 p1 교재관련부분 : 68~69 쪽 교재관련부분 : 68~69 쪽 OpenGL - 직선그리기 OpenGL - 직선그리기 glbegin(gl_line_strip); glverte2iv(p1); glverte2iv(p2); glverte2iv(p3); glverte2iv(p4); glverte2iv(p5); glend( ); p5 p2 p3 p4 p1 glbegin(gl_line_loop); glverte2iv(p1); glverte2iv(p2); glverte2iv(p3); glverte2iv(p4); glverte2iv(p5); glend( ); p5 p2 p3 p4 p1 교재관련부분 : 68~69 쪽 교재관련부분 : 68~69 쪽
직선방정식 기울기 - 절편방정식 DDA 알고리즘 DDA 알고리즘개요 2 1 b O 1 2 = m + b m =, = 2-1, = 2-1 = m = / m Digital Differential Analzer 축 ( 또는 축 ) 의좌표를 1씩변화시킬때, 축 ( 또는 축 ) 의좌표를직선의기울기 ( 또는기울기의역수 ) 만큼변화시켜다음점의좌표계산 기울기 ( 또는기울기의역수 ) 의절대값이 1 이하가되게기준축을정함 계산된좌표를반올림하여구한정수좌표위치에점을그림 교재관련부분 : 71 쪽 교재관련부분 : 71~73 쪽 DDA 알고리즘 DDA 알고리즘 end 0 0 = m + b Δ = 1 end end Δ = 1 0 0 = m + b end DDA 알고리즘의특성 기울기의크기에따라한축의좌표는 1, 다른축의좌표는 m( 또는 1/m) 만큼변화시키며다음좌표를계산하여가장가까운픽셀을그림 문제점 end - 0 end - 0 k+1 = k +1 k+1 = k + m end - 0 < end - 0 k+1 = k +1 k+1 = k +1/m ( k+1, Round( k+1 )) (Round( k+1 ), k+1 ) 부동소수점계산을해야함 반올림및부동소수점연산으로시간이많이소비됨 긴선분의경우부동소수점연산의오차가누적되어정확한직선경로를벗어날수있음 교재관련부분 : 71~73 쪽 교재관련부분 : 73 쪽
기울기가 0 과 1 사이인직선 k 번째점 ( k, k ) 기울기가 0 과 1 사이인직선 선분 ( l, l ) - ( r, r ) k +2 k +1 k k +1 k k +3 k +2 k+1 번째점 ( k+1, k+1 ) k+1 = k +1 k k+1 = k +1 k +2 k +1 k P k k+1 k U k+1 M k+1 L k+1 k+3 k+2 W = r l H = r l H = + b W 에 l, 에 l 을넣어 b를계산 H = + l W H W l 교재관련부분 : 73 쪽 교재관련부분 : 74 쪽 기울기가 0 과 1 사이인직선 선분 ( l, l ) - ( r, r ) 기울기가 0 과 1 사이인직선 선분 ( l, l ) - ( r, r ) k +2 k +1 k P k U k+1 M k+1 L k+1 k+3 k+2 k+1 k H H > + l W W l (, ) 가직선위에있음 H H < + l W W l (, ) 가직선아래에있음 k +2 k +1 k P k U k+1 M k+1 L k+1 k+3 k+2 k+1 k H H > + l W W l (, ) 가직선위에있음 H H < + l W W l (, ) 가직선아래에있음 F(, ) = 2W( l ) + 2H( l ) < 0 > 0 (, ) 가직선위에있음 (, ) 가직선아래에있음 F(M k+1 ) < 0 > 0 M k+1 이직선의위에있음 M k+1 이직선의아래에있음 P k+1 = L k+1 P k+1 = U k+1 = ( k +1, k ) = ( k +1, k +1)
( k+1, k+1 ) 을결정하기위한판별식 M k+1 = ( k +1, k +0.5) F(M k+1 ) = 2W( k + 0.5 l ) + 2H( k + 1 l ) ( k+1, k+1 ) 을결정하기위한판별식 M k+1 = ( k +1, k +0.5) F(M k+1 ) = 2W( k + 0.5 l ) + 2H( k + 1 l ) ( k+2, k+2 ) 를결정하기위한판별식 ( k+2, k+2 ) 를결정하기위한판별식 Case 1 F(M k+1 ) < 0 인경우 M k+2 = ( k +2, k +0.5) F(M k+2 ) = 2W( k + 0.5 l ) + 2H( k + 2 l ) = F(M k+1 ) + 2H k +2 k +1 k U k+2 P k+1 M k+2 P k L k+2 k +1 k k +3 k +2 Case 2 F(M k+1 ) > 0 인경우 M k+2 = ( k +2, k +1.5) F(M k+2 ) = 2W( k + 1.5 l ) + 2H( k + 2 l ) = F(M k+1 ) + 2(H W) k +2 k +1 k P k P k+1 k +1 k U k+2 M k+2 L k+2 k +3 k +2 판별식의초기값 F(M 1 ) : (1, 1) (6, 4) M 1 = ( l +1, l +0.5) F(M 1 ) = 2W( l + 0.5 l ) + 2H( l + 1 l ) = 2H W W = 5, H = 3 F = 2H W = 1 F < 0 : k+1 = k, F F + 6 F 0 : k+1 = k + 1, F F 4 다음픽셀위치의결정및판별식갱신 Case 1 Case 2 F < 0 F > 0 ( k +1, k ) 위치에점을그림 F F + 2H ( k +1, k +1) 위치에점을그림 F F + 2(H W) k 0 1 2 3 4 F ( k+1, k+1 ) 1 (2, 2) -3 (3, 2) 3 (4, 3) -1 (5, 3) 5 (6, 4) 5 4 3 2 1 0 0 1 2 3 4 5 6 7
void bresenham_line (int l, int l, int r, int r) { // Assume 0 < H/W < 1 int, = l, W = r - l, H = r - l; int F = 2 * H - W, df1 = 2 * H, df2 = 2 * (H - W); 목차 1 점그리기 } for ( = l; <= r; ++) { setpiel(, ); if (F < 0) F += df1; else { ++; F += df2; } } 2 선그리기 3 다각형그리기 교재관련부분 : 75~76 쪽 다각형다각형의정의 세개이상의선분으로둘러싸인평면도형 모서리 (edge) 또는변 (side) : 다각형을구성하는선분 꼭짓점 (verte) : 2개의변이만나는점꼭짓점 다각형볼록다각형과오목다각형 볼록 (conve) 다각형 : 모든내각들이 180 이하인다각형 오목 (concave) 다각형 : 볼록하지않은다각형 (180 이상인내각이존재함 ) 볼록다각형오목다각형 변, 모서리 교재관련부분 : 83 쪽 교재관련부분 : 84 쪽
다각형 다각형 볼록다각형과오목다각형의판별 내부 / 외부검사 꼭짓점들을차례로연결하는벡터로보고두인접벡터의외적을구함 홀 - 짝규칙적용 볼록다각형 오목다각형 외부의점 z E3 E4 E4 E4 E1 E3 E2 E3 E1 E1 E2 E2 모든외적의방향이동일 z E4 E5 E5 E5 E1 E4 E3 E3 E4 E2 E3 E2 E1 E1 E2 일부외적의방향이반대 P1 P2 경계상자 교재관련부분 : 85 쪽 교재관련부분 : 86 쪽 다각형 다각형 다각형의앞면과뒷면 와인딩 (winding) 눈에보이는면 ( 앞면 ) 과보이지않는객체내부의면 ( 뒷면 ) 다각형의앞면을정의하기위해정한꼭짓점의나열순서 N= (A, B, C) A + B + Cz + D > 0 (,, z) 는평면앞에위치 시계반대방향 (CCW) 와인딩 시계방향 (CW) 와인딩 z A + B + Cz + D = 0 A + B + Cz + D < 0 (,, z) 는평면뒤에위치 앞면 앞면 V 0 V 1 V 0 V 1 (V 0, V 1, ) (V 0,, V 1 ) 교재관련부분 : 84, 333 쪽 교재관련부분 : 84 쪽
다각형 다각형의표현 OpenGL 의다각형그리기 E 2 꼭짓점, 변, 각면정보를저장하는표를사용 V 1 E 1 E 3 E 6 S 1 S2 V 5 E 5 V 3 E 4 V 4 변표 E 1 : V 1,, S 1 E 2 :, V 3, S 1 E 3 : V 3, V 1, S 1, S 2 꼭짓점표 E 4 : V 3, V 4, S 2 E 5 : V 4, V 5, S 1 : 1, 1, z 1 E 6 : V 5, V 1, S 2 : 2, 2, z 2 V 3 : 3, 3, z 3 각면표 V 4 : 4, 4, z 4 S 1 : E 1, E 2, E 3 V 5 : 5, 5, z 5 S 2 : E 3, E 4, E 5, E 6 교재관련부분 : 87쪽 GL_QUADS V 0 V 1 OpenGL 의다각형그리기 OpenGL 의다각형그리기 V 0 V 4 V 0 V 4 GL_QUADS GL_QUADS V 3 V 1 V 3 V 1
OpenGL 의다각형그리기 OpenGL 의다각형그리기 V 3 V 0 V 4 V 0 GL_QUADS GL_QUADS V 1 V 1 V 3 V 5 OpenGL 의다각형그리기 정리하기 GL_QUADS V 0 V 1 V4 V 3 1 OpenGL에서꼭짓점을지정하기위해서는 glverte* 함수를사용한다. 2 OpenGL에서도형을그릴때는 glbegin 함수와 glend 함수사이에꼭짓점을나열한다. 이때 glbegin 함수에그리고자하는도형및그리기방법을나타내는상수를전달한다. 점그리기상수 : GL_POINTS 선분그리기상수 : GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP 삼각형그리기상수 : GL_TRIANGLES, GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP 사각형그리기상수 : GL_QUADS, GL_QUAD_STRIP 다각형그리기상수 : GL_POLYGON
정리하기 정리하기 3 DDA 알고리즘은 축 ( 또는 축 ) 의좌표를 1씩변화시킬때, 축 ( 또는 축 ) 의좌표를직선의기울기 ( 또는기울기의역수 ) 만큼변화시켜다음점의좌표를계산한다. 4 Bresenham 직선알고리즘 정수형덧셈연산만으로직선상의점들의위치를계산할수있는알고리즘 기울기가 0과 1 사이의값이라고가정할때, 어느점에서 좌표가 1 증가할경우 좌표는그대로이거나 1만큼증가 이를판단할수있는판별식을통해점증적으로직선상의점들의위치를계산 5 꼭짓점을나열하는와인딩에의해다각형의앞면방향을정의할수있다. 6 볼록다각형은꼭짓점을와인딩순서에따라연결하는벡터들에대해두인접벡터쌍의외적의방향이모두같다. 7 다각형외부의점으로부터어떠한점을잇는선이다각형경계와교차하는횟수가홀수이면그점은다각형내부이고, 짝수이면외부이다.