Window, Viewport Window, Viewport.

Slides:



Advertisements
Similar presentations
1.1 구조체란 1.2 중첩 구조체 1.3 구조체와 배열 1.4 구조체와 포인터 1.5 구조체와 함수 1.6 공용체와 열거형.
Advertisements

재료수치해석 HW # 박재혁.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
1장. 이것이 C 언어다.. 1장. 이것이 C 언어다. 1-1 C 언어의 개론적 이야기 프로그래밍 언어란 무엇인가? 컴파일이란 무엇인가? 사람과 컴파일러가 이해할 수 있는 약속된 형태의 언어 C 언어도 프로그래밍 언어 중 하나이다. 컴파일이란 무엇인가? 프로그래밍.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
15년 용접등급 평가(3차) 생 산 관 리 팀 DATE : 2015年 09月 24日.
Excel 일차 강사 : 박영민.
공차 및 끼워맞춤.
#include <stdio.h> int main(void) { float radius; // 원의 반지름
수치해석 6장 예제문제 환경공학과 천대길.
컴퓨터 프로그래밍 기초 [Final] 기말고사
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
Multimedia Programming 10: Point Processing 5
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
멀티미디어 시스템 (아날로그 이미지,신호를 디지털로 변환 방법) 이름 : 김대진 학번 :
비선형 방정식 김영광.
2주차: 변수, 수식, Control Flow.
6장. printf와 scanf 함수에 대한 고찰
2007 1학기 11 프로젝트 기초 실습.
Chapter 7. Three-Dimensional Viewing
상관함수 correlation function
14장. 포인터와 함수에 대한 이해.
11장. 1차원 배열.
C#.
13. 연산자 오버로딩.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
‘Chess’를 읽고 컴퓨터공학부 배상수.
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
3D 프린팅 프로그래밍 01 – 기본 명령어 강사: 김영준 목원대학교 겸임교수.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
PSD센서 명령어 이해하기 목차 재료준비 및 브레드 보드 배선 구성하기 PSD센서 명령어 이해 및 실습 응용 작품 만들기.
김선균 컴퓨터 프로그래밍 기초 - 7th : 함수 - 김선균
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
컴퓨터 프로그래밍 기초 [01] Visual Studio 설치 및 사용방법
18장. 다차원 배열 그리고 포인터.
수학10-나 1학년 2학기 Ⅳ.삼각함수 4. 삼각방정식과 삼각부등식(9/12) 삼각함수 수업계획 수업활동.
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
수학10-나 1학년 2학기 Ⅱ.부등식의 영역 2. 연립부등식의 영역 (3/5) 부등식 영역 수업계획 수업활동.
수학10-나 1학년 2학기 Ⅱ.부등식의 영역 1. 부등식의 영역(2/5) 부등식 영역 수업계획 수업활동.
이차방정식과 이차함수의 관계 이차함수의 그래프와 축의 위치 관계 이차방정식 의 그래프와 축이 만나는 점의 좌표는 이차방정식
선 그리기.
곡선 처리.
Chapter 1 단위, 물리량, 벡터.
가장 많이 사용 Accelerator 최상위 WM_COMMAND, OLE 메시지 관련 이벤트 처리만 가능 이 클래스를 상속받아서 다른 이벤트 처리 이벤트 처리 관련 윈도우(창) 최상위 클래스 멀티 테스킹(모듈) CFrameWnd, Cview,
7주차: Functions and Arrays
3. 반/전 가산기, 반/전 감산기 제작 컴퓨터 구조 실습 안내서.
수학10-나 1학년 2학기 Ⅰ. 도형의 방정식 4. 도형의 이동 (20/24) 도형의 평행이동 수업계획 수업활동.
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
상관계수.
컴퓨터공학과 손민정 Computer Graphics Lab 이승용 교수님
아두이노 프로그래밍 2일차 – Part4 아날로그 키패드 활용하기 강사: 김영준 목원대학교 겸임교수
9장. spss statistics 20의 데이터 변수계산
어서와 C언어는 처음이지 제21장.
영역 기반 처리.
C.
수학10-나 1학년 2학기 Ⅱ.부등식의 영역 3. 부등식의 영역에서 최대, 최소(5/5) 부등식 영역 수업계획 수업활동.
수업 내용 수업 목표 강의 내용 강의 계획서 교과서 및 참고도서 평가 방법 수강생의 학습 방법 제안 강의자료 사이트
2016년 3정 5행 추진현황보고 (5월 실적) 생산관리팀.
BoardGame 보드게임 따라가기.
Presentation transcript:

Window, Viewport Window, Viewport

Device Coordinate Systems, Normalized Coordinate Systems, World Coordinate Systems Device Coordinate: 컴퓨터 화면의 pixel의 위치를 나타내는 고정 좌표 체계. Normalized Coordinate: 출력 장치의 Resolution에 따라서 변화하는 Device 좌표계의 좌표 값의 범위를 0-1사이의 값으로 통일하여 나타내는 좌표 체계. World Coordinate: 나타내려고 하는 사물의 환경에 따라 적절히 설정되는 실 좌표체계. (구현하려는 사물은 World 좌표계 상에서 정의 되지만 컴퓨터 화면에 나타내기 위해서는 결국 Device 좌표계로 바뀌어야 한다) Window, Viewport

Window, Viewport Window: World 좌표계 상에서 실제 화면에 구현하려는 부분을 한정 짓기 위하여 지정되는 영역. (World좌표계의 값을 사용하여 정한다) Viewport: Window 내부의 물체를 화면의 지정된 위치에 mapping하기 위하여 사용하는 화면상의 영역. ( Normalized 좌표 값을 사용하여 정한다) 화면 윈도우 Viewport World 좌표계 Device 좌표계 Window, Viewport

ywmax yw ywmin xw yvmax xwmin xwmax yv yvmin xv xvmin xvmax (xw - xwmin) ywmin xw (xwmax - xwmin) xvmax xvmin yvmin yvmax xv yv xwmin xwmax (xv- xvmin) (xvmax - xvmin) Window, Viewport

Window to Viewport Coordinate Transformation Window 내의 한 점의 위치와 그에 대응하는 Viewport 내의 위치는 다음과 같은 관계가 있다. (xv - xvmin ) / (xvmax - xvmin) = (xw - xwmin) / (xwmax - xwmin) (yv - yvmin ) / (yvmax - yvmin) = (yw - ywmin) / (ywmax - ywmin) 위의 관계로부터 주어진 Window상의 점의 위치에 대응하는 Viewport 내의 좌표(xv, yv)을 구하는 식은 다음과 같다. xv = xvmin + (xw - xwmin) [ (xvmax - xvmin) / (xwmax - xwmin) ] yv = yvmin + (yw - ywmin) [ (yvmax - yvmin) / (ywmax - ywmin) ] 계속 Window, Viewport

앞의 마지막 두 식에서 [ ]안의 상수 term을 다음과 같이 각 각 sx, sy로 대치하면 [ (xvmax - xvmin) / (xwmax - xwmin) ] = sx, [ (yvmax - yvmin) / (ywmax - ywmin) ] = sy 두 식은 다음과 같이 간단히 나타낼 수 있다. xv = xvmin + (xw - xwmin) sx yv = yvmin + (yw - ywmin) sy 이 식을 더욱 간단히 하기 위하여 괄호를 없애고 정리하면 xv = xw . sx + ( xvmin - xwmin . sx) yv = yw . sy + (yvmin - ywmin . sy) 계속 Window, Viewport

xv = xw . sx + cx yv = yw . sy + cy 앞의 마지막 두 식에서 다시 변하지 않는 상수 term (xvmin - xwmin .. sx), (yvmin - ywmin .. sy) 를 각각 cx,cy로 대치하면 두 식은 다음과 같은 형태가 된다. xv = xw . sx + cx yv = yw . sy + cy Window와 Viewport 값에 대하여 sx, sy, cx, cy의 값을 미리 구해 두면 Window 내의 한 점의 위치를 Viewport의 좌표로 구하는 것은 위의 식을 사용하여 간단히 구할 수 있다. sx, sy, cx, cy값은 Window의 크기(위치)와 Viewport의 크기(위치)가 변할 때 마다 다시 계산하여야 한다. 이 계산을 하는 함수가 파일 grinit.c 내의 set_view_constant()이다. 계속 Window, Viewport

static int set_view_constants(void) { if(!graphics_mode) return 0; ViewSx = (XVmax - XVmin) / (XWmax - XWmin); ViewSy = (YVmax - YVmin) / (YWmax - YWmin); ViewCx = XVmin - XWmin * ViewSx; ViewCy = YVmin - YWmin * ViewSy; return 1; } 이 함수는 static함수로서 같은 파일(grinit.c) 내에 있는 다음의 두 함수에서 호출된다. Window, Viewport

Window의 경계를 set하는 함수(grinit.c 파일 내) int set_window(float L, float T, float R, float B) { if(L >= R) return 0; if(B >= T) return 0; XWmin = L; XWmax = R; YWmin = B; YWmax = T; set_view_constants(); return 1; } Window, Viewport

Viewport의 영역을 set하는 함수(grinit.c 파일 내) int set_viewport(float L, float T, float R, float B) { if(L >= R) return 0; if(B >= T) return 0; if(L < 0.0) return 0; if(L > 1.0) return 0; if(R < 0.0) return 0; if(R > 1.0) return 0; if(T < 0.0) return 0; if(T > 1.0) return 0; if(B < 0.0) return 0; if(B > 1.0) return 0; XVmin = L; XVmax = R; YVmin = B; YVmax = T; set_view_constants(); return 1; } Window, Viewport

Window 내의 한 점의 위치를 화면상의 Pixel의 위치(Device Coordinate)로 변환하는 함수(grinit.c 파일 내) int get_pixel_position(float x, float y, int *px, int *py) { *px = round( (x * ViewSx + ViewCx) * MaxPDX ); *py = round(MaxPDY - ( (y * ViewSy + ViewCy) * MaxPDY) ); return 1; } 위의 함수는 Window상의 좌표값을 화면상의 Pixel의 좌표로 변환하여 준다. 식을 자세히 보면 x축의 값은 MaxPDX의 값에 0에서 1사이의 값인 Viewport의 좌표 값이 곱해지는 것을 알 수 있다. 또한 Pixel의 y축의 좌표는 구해진 값을 MaxPDY에서 뺀 값을 사용한다. 그 이유는 화면상의 y축의 좌표 값의 증가 방향과 Window(Viewport)의 좌표 값의 증가 방향이 반대이기 때문이다. Window, Viewport

draw_line()함수 (line.c 파일 내) int draw_line(float x1, float y1, float x2, float y2, float r, float g, float b) { int px1,py1, px2,py2; /* pixel positions */ get_pixel_position(x1,y1, &px1,&py1); get_pixel_position(x2,y2, &px2,&py2); line_bres(px1,py1, px2,py2, r,g,b); return 1; } 이 함수는 추후 line clipping알고리즘 강의 후 약간 변경될 것임 Window, Viewport

case 0: set_viewport(0.0, 1.0, 0.5, 0.5); break; draw_line(-10.0, 10.0, 10.0, -10.0, L_Green); draw_line(-10.0, -10.0, 10.0, 10.0, L_Green); draw_line(-10.0, 10.0, -10.0, -10.0, White); draw_line(-10.0, -10.0, 10.0, -10.0, White); draw_line( 10.0, -10.0, 10.0, 10.0, White); draw_line( 10.0, 10.0, -10.0, 10.0, White); set_video_mode(vga_800x600x64k); set_window(-10.0, 10.0, 10.0, -10.0); set_video_mode(text_80x25x16); int x1,y1, x2,y2, x3,y3, x4,y4, i; /* window and viewport test */ #include "vgainfo.h" for(i=0; i<4; i++) { #include <stdio.h> #include "grinit.h" #include "line.h" void main(void) switch(i) { getch(); } { Window, Viewport, Device 좌표 전환 테스트 프로그램(wintest.c) Window, Viewport