선 그리기.

Slides:



Advertisements
Similar presentations
6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
Advertisements

제 2 장. 비선형 방정식의 해법 1. 방정식의 근 2. 방정식의 실근을 구하는 해법 3. 다항식의 복소수 근을 구하는 해법.
수치해석 (Numerical Analysis) 보간법 (Interpolation). Page 2 보간법 (Interpolation) In this chapter … 보간법이란 ? 통계적 혹은 실험적으로 구해진 데이터들 (x i ) 로부터, 주어진 데이터를 만족하는 근사.
1.3.1 원의 방정식. 생각해봅시다. SK 텔레콤에서는 중화동에 기지국을 세우려고 한다. 이 기지국은 중화고, 중화우체국, 뚝방에 모두 전파를 보내야 한다. 기지국은 어디에 세워야 할까 ? 중화동의 지도는 다음과 같다 원의 방정식.
재료수치해석 HW # 박재혁.
예비보고서1 : 8개의 푸시버튼 스위치가 있다. 이 스위치에 각각 0~7개까지의 번호를 부여하였다고 하자
(Numerical Analysis of Nonlinear Equation)
Excel 일차 강사 : 박영민.
공차 및 끼워맞춤.
Chapter 7. 조건문.
수치해석 6장 예제문제 환경공학과 천대길.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
- 1변수 방정식의 solution 프로그램 (Bisection method, Newton-Raphson method)
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
비선형 방정식 김영광.
6장. printf와 scanf 함수에 대한 고찰
Tail-recursive Function, High-order Function
근사값과 반올림 오차 절단 오차와 Taylor 급수 오차의 전파
11장. 1차원 배열.
일차방정식의 풀이 일차방정식의 풀이 순서 ① 괄호가 있으면 괄호를 먼저 푼다.
Register, Capacitor.
제4장 제어 시스템의 성능.
Ⅲ. 이 차 방 정 식 1. 이차방정식과 그 풀이 2. 근 의 공 식.
1.4 중첩된 한정기호 (Nested Quantifiers) 이산수학 (Discrete Mathematics)
프로그래밍 개요
Chapter03 캔버스(1) HTML5 Programming.
Report #3 - due: 4/6 100*100의 2개의 희소 행렬 A, B를 전달 받아서 이들의 덧셈을 구하고, 그 결과의 행렬 C를 반환하는 add_sparse_matrix(A, B, C)를 다음과 같이 작성하라. 희소 행렬은 sparse_matrix 타입으로 표현된다.
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
SEOUL NATIONAL UNIVERSITY OF SCIENCE & TECHNOLOGY
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
8장. spss statistics 20의 데이터 변환
Biomedical Instrumentation
P 등속 직선 운동 생각열기 – 자동차를 타고 고속도로를 달릴 때, 속력계 바늘이 일정한 눈금을 가리키며 움직이지 않을 때가 있다. 이 때 자동차의 속력은 어떠할까? ( 속력이 일정하다 .)
SEOUL NATIONAL UNIVERSITY OF SCIENCE & TECHNOLOGY
삼각형에서 평행선에 의하여 생기는 선분의 길이의 비
생활 속의 밀도 (1) 뜨고 싶니? 내게 연락해 ! 물질의 뜨고 가라앉음 여러 가지 물질의 밀도.
Fitting / Matrix / Excel
홍수추적 담당교수명 : 서 영 민 연 락 처 :
객체기반 SW설계 팀활동지 4.
미분방정식.
이차방정식과 이차함수의 관계 이차함수의 그래프와 축의 위치 관계 이차방정식 의 그래프와 축이 만나는 점의 좌표는 이차방정식
Window, Viewport Window, Viewport.
수학10-나 1학년 2학기 Ⅰ. 도형의 방정식 1. 평면좌표 (2~3/24) 선분의 내분점과 외분점 수업계획 수업활동.
에어 PHP 입문.
1. 스케치 평면 설정 평면상의 스케치 스케치를 할 평면 선택 스케치시 Horizontal (x축)으로 사용할 기준축 선택
홍수추적 담당교수명 : 서 영 민 연 락 처 :
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
Chapter 1 단위, 물리량, 벡터.
제 5장 제어 시스템의 성능 피드백 제어 시스템 과도 성능 (Transient Performance)
원의 방정식 원의 방정식 x축, y축에 접하는 원의 방정식 두 원의 위치 관계 공통접선 원과 직선의 위치 관계
학 습 목 표 직선의 방정식 직선의 방정식 두 직선의 위치 관계 두 직선의 교점을 지나는 직선 점과 직선 사이의 거리.
Chapter 1 단위, 물리량, 벡터.
1. 접선의 방정식 2010년 설악산.
1. 정투상법 정투상법 정투상도 (1) 정투상의 원리
3. 반/전 가산기, 반/전 감산기 제작 컴퓨터 구조 실습 안내서.
상관계수.
수치해석 (Numerical Analysis)
컴퓨터공학과 손민정 Computer Graphics Lab 이승용 교수님
통계학 R을 이용한 분석 제 2 장 자료의 정리.
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
수치해석 ch3 환경공학과 김지숙.
수학10-나 1학년 2학기 Ⅱ.부등식의 영역 3. 부등식의 영역에서 최대, 최소(5/5) 부등식 영역 수업계획 수업활동.
SEOUL NATIONAL UNIVERSITY OF SCIENCE & TECHNOLOGY
컴퓨터는 어떻게 덧셈, 뺄셈을 할까? 2011년 10월 5일 정동욱.
버스와 메모리 전송 버스 시스템 레지스터와 레지스터들 사이의 정보 전송을 위한 경로
교착 상태 해결 : 교착 상태 탐지 교착 상태 탐지(Deadlock Detection)
Kirchhoff’s Rule (키르히호프의 법칙) Kirchhoff의 전압법칙 Kirchhoff의 전류법칙.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

선 그리기

Line Equation 기울기 절편 선의 공식: y = m . x + b m = (y2 - y1) / (x2 - x1) b = y1 - m . X1 y2 (x2,y2) y1 선분의 두 끝점 (x1,y1), (x2,y2)을 알면 기울기 m과 절편 b를 구 할 수 있고, 이 식을 사용하여 x의 위치에 대응하는 y값을 계산하여 두 점을 잇는 선 상에 위치하는 pixel의 위치를 찾아내서 값을 set할 수 있다. (x1,y1) x1 x2 선 그리기

DDA(Digital Differential Analyzer) 알고리즘 기준이 되는 축의 단위 값(1)에 대하여 상대 축의 값의 변화량을 계산하여 그 값을 가감 하는 방법을 사용하는 선 그리기 알고리즘 예: 0  기울기  1 인 경우에는 x축 상의 변화량이 y축 상의 변화량보다 크므로 x축을 기준으로 정한다. 시작점의 x값으로부터 출발하여 x값을 1씩 증가 시키면서 이에 대한 y의 변화량을 직전의 y값에 계속 더해 간다. y k+1 = yk + m (m = y : m = y / x 이고 x=1 이므로 m은 x가 1일 변할 때의 y의 변화량이다) 기울기  1 인 경우에는 y축 상의 변화량이 x축 상의 변화량보다 크므로 y축을 기준으로 정한다. 시작점의 y값으로부터 출발하여 y값을 1씩 증가 시키면서 이에 대한 x의 변화량을 직전의 x값에 계속 더해 간다. x k+1 = xk + (1/m) ( (1/m) = y : x = y/m 이고 y 가 1이므로 (1/m)은 y가 1 변할 때의 x의 변화량이다) 그러나 이 방법은 m,(1/m)값이 실 수이고 이를 누적하는 변수(x,y) 또한 실수를 사용해야 하므로 실행 속도면에서 효율적이지 못하다. 또한 변화량에 오차가 있을 경우에는 점점 오차가 누적되어 그리는 선이 제 위치에서 벗어날 수도 있다. 선 그리기

Bresenham Line Algorithm 간단한 정수 덧셈만으로 직선상의 pixel의 위치를 계산하는 방법 아래의 그림과 같이 식에 의하여 그려지는 선으로부터 가장 가까이 위치한 pixel을 찾아내는 방법을 사용한다. Raster scan 장치에서는 pixel의 위치가 미리 고정되어 있기 때문에 식에 의해서 그려지는 선 상에 정확하게 일치하는 pixel이 없을 때에는 가장 가까운 위치의 pixel을 사용하여 선을 표현하여야 한다. 따라서 Raster Scan 장치에 사선을 그릴 때에는 옆의 그림과 같이 계단처럼 보이는 jaggi현상이 나타난다. 그러나 이러한 Raster scan장치의 단점을 이용하면 라인을 빨리 그릴 수 있다. 14 식에 의하여 그려져야 할 선의 본래의 방향 13 12 11 10 10 11 12 13 14 선 그리기

Bresenham line 알고리즘을 (0 < 기울기 > 1)인 라인을 예로 들어서 설명하면 기울기가 0과 1 사이 라는 것은 라인의 각도가 x축에 대하여 0도에서 45도 사이라는 의미이다. 따라서 옆의 그림에서 현재(10,11)의 위치에 pixel을 set하였다면 그 다음 pixel의 위치는 인접한 두 개의 pixel (그림에서 점선으로 표시) 중 하나 일 것이다. 따라서 우리는 이 두개의 pixel중 어느것이 실제 라인상의 위치에 가까운지를 알아내기만 하면 다음 번에 set될 pixel의 위치를 결정 할 수 있다. 10 xk 11 12 13 yk 11 d1 d2 y = mx + b 선 그리기

d2 d1 우리는 우선 d1과 d2의 길이를 알아내야 한다. (현재 k번째의 점 (xk,yk)를 (x10, y11)에 set하였다고 하고 그 다음 k+1번째의 점(xk+1, yk+1)의 좌표를 찾는다고 할 때: 선의 공식에 의한 실제 선상의 y값: y = m(xk + 1) + b d1의 길이: d1 = y - yk = m(xk + 1) + b - yk d2의 길이: d2 = (yk + 1) - y = yk + 1 - m(xk + 1) - b d1과 d2의 길이의 차이: d1 - d2 = [m(xk + 1) + b - yk] - [ yk + 1 - m(xk + 1) - b ] = m(xk + 1) + b - yk - yk - 1 + m(xk + 1) + b = 2 m(xk + 1) - 2 yk + 2b - 1 위의 식에서 m은 (y / x)로서 실수 값이다. 식에서 실수 값을 제거하기 위하여 m 대신에 (y/ x)를 대입하여 양변에 x를 곱하면 다음과 같은 관계를 얻는다 10 (xk) 11 (xk+1) 12 13 (Yk) 11 (yk+1) 12 d1 d2 y = mx + b 선 그리기

d2 d1 m대신 (y/ x)를 대입: d1 - d2 = 2 m(xk + 1) - 2 yk + 2b - 1 = 2 (y / x) (xk + 1) - 2 yk + 2b - 1 양변에 x를 곱하면: x(d1 - d2 ) = 2 y (xk + 1) - 2x yk + 2x b - x = 2 y xk + 2 y - 2x yk + x(2b - 1) = 2 y xk - 2x yk + [ 2 y + x(2b - 1) ] = 2 y xk - 2x yk + C x는 양수 이기때문에 (d1 - d2 ) 에 x를 곱해도 값의 부호는 바뀌지 않는다. 우리가 필요한 것은 (d1 - d2 ) 의 정확한 값이 아니라 d1 과 d2 중에서 어느쪽이 더 가까운가(짧은가)의 여부이기 때문에 부호만이 중요하다. 즉, (d1 - d2 ) 가 음수이면 d1 이 더 짧고 (d1 - d2 ) 가 양수이면 d2 가 더 짧다. pk  x(d1 - d2 ) = 2 y xk - 2x yk + C 로 정의하면 (xk, yk)의 위치에 pixel을 set한 후 pk 의 값을 구하여 pk 가 음수이면 그 다음 pixel (xk+1, yk+1) 의 위치는 (xk + 1, yk) 이고 pk 가 양수이면 다음 pixel의 위치는 (xk + 1, yk+ 1)이 된다. 상수: C 10 (xk) 11 (xk+1) 12 13 (Yk) 11 (yk+1) 12 d1 d2 y = mx + b 선 그리기

그 다음 위치 (xk+2, yk+2)의 좌표 값을 구하기 위하여서는 pk+1 의 값을 구하여야 할 것이다. 즉 다음의 식의 값을 구하여야 한다. pk+1 = 2 y xk+1 - 2x yk+1 + C 그러나 이 식의 값을 직접 계산하지 않고 그 앞에서 미리 구한 pk의 값으로부터 쉽게 구 할 수 있다. 즉, pk+1 과 pk의 차이를 구해 보면 pk+1 - pk = [2 y xk+1 - 2x yk+1 + C] - [2 y xk - 2x yk + C] = 2y(xk+1 - xk ) - 2x(yk+1 - yk) + C - C = 2y(xk + 1 - xk ) - 2x(yk+1 - yk) /* xk+1 = xk + 1 이므로 */ = 2 y - 2x(yk+1 - yk) 따라서 pk+1 = pk + 2 y - 2x(yk+1 - yk) 위 식에서 (yk+1 - yk) 의 값은 pk 가 음수이면 0, 양수이면 1 이므로 pk+1 의 값은 pk가 음수이면: pk+1 = pk + 2y pk가 양수이면: pk+1 = pk + 2y - 2x 2y, 2x 모두 값이 변하지 않는 상수성질의 값이다. 따라서 2y, 2y-2x 의 값을 미리 계산하여 각각 변수에 저장한 후 이전 의 p 값의 부호에 따라서 두 값 중의 하나를 p에 더하면 그 다음의 p값들을 연속적으로 구할 수 있다. 선 그리기

최초의 p값(P0)은 다음의 식에 의하여 간단히 구할 수 있다. p0 = 2y x0 - 2x y0 + C = 2y x0 - 2x y0 + 2 y + x(2b - 1) = 2y x0 - 2x y0 + 2 y + 2x b - x = 2y x0 - 2x [(y/x) x0 + b] + 2 y + 2x b - x = 2y x0 - 2y x0 - 2 x b + 2 y + 2x b - x = 2y - x C y0 이제까지의 내용을 구현하면 알고리즘을 기술하면 다음과 같다. 1. 두 끝점으로부터 x, y를 구하여 2y와 (2y - 2x)의 값을 구하여 변수에 저장한다. 2. 시작점(x0, y0)의 위치에 pixel을 mark하고, pk=0 = 2y - x를 계산한다. 3. (xk, yk) 의 pixel을 mark한 상황에서 pk < 0 이면 그 다음 pixel의 좌표는 (xk + 1, yk) 이고 pk+1 = pk + 2y 그러지 않으면 다음 pixel의 좌표는 (xk + 1, yk+ 1) 이고 pk+1 = pk + 2y - 2x 4. 끝점에 도달할 때까지 3번을 반복한다. 선 그리기

예: 두 점(20,10), (30,18) 사이의 선 그리기 19 18 17 16 15 14 13 12 11 10 9 20 21 22 23 24 25 26 27 28 29 30 31 32 33 1 3 2 4 5 6 7 8 k pk (xk+1, yk+1) 0 6 (21, 11) 1 2 (22, 12) 2 -2 (23, 12) 3 14 (24, 13) 4 10 (25, 14) 5 6 (26, 15) 6 2 (27, 16) 7 -2 (28, 16) 8 14 (29, 17) 9 10 (30, 18) x = 10, y = 8 2y = 16, 2y - 2x = -4 p0 = 2y - x = 6 앞 페이지의 알고리즘을 사용하여 (20,10)~(30,18) 사이의 라인을 그린 결과 선 그리기

선 그리기 함수 line_bres() int line_bres(int x1, int y1, int x2, int y2, float r, float g, float b) { int x, y, dx, dy, d2x, d2y, p, i, s1, s2, interchanged; x = x1; y = y1; dx = abs(x2 - x1); dy = abs(y2 - y1); s1 = sign(x2 - x1); s2 = sign(y2 - y1); interchanged = 0; if(dy > dx) { int temp; temp = dx; dx = dy; dy = temp; interchanged = 1; } 계속 선 그리기

선 그리기 함수 line_bres() 계속 계속 d2y = 2*dy; d2x = 2*dx; p = d2y - dx; /* initial value of p */ set_pixel(x,y,r,g,b); /* first pixel point */ for(i = 0; i < dx; i++) { if(p >= 0) { p = p - d2x; if(interchanged) x = x + s1; else y = y + s2; }/*if p*/ if(interchanged) y = y + s2; else x = x + s1; set_pixel(x, y, r,g,b); p = p + d2y; } /*for i*/ return 1; } 선 그리기