곡선 처리.

Slides:



Advertisements
Similar presentations
P300 학습 주제 6-5. 이온의 이동 확인하기 1. 수산화 나트륨 수용액에 건전지를 넣으면 건전지의 (-) 극과 (+) 극에서 각각 수소기체와 산소기체가 발생한다. 그 이유는 ? [ ]
Advertisements

2015 학년도 정시 1 차 | 뮤지컬스쿨 실기고사 안내. 1. 실기고사 2. 실기고사에 참여하려면 고사시각을 사전에 예약해야합니다. - 수험생은 원하는 시각을 선택하여 예약해야 하며, 예약을 하지 않을 경우 임의대로 고사시각이 배정됩니다. - 배정된 고사시각은 변경이.
컴퓨터애니메이션 3장 이규민 김태일.
공공경제론을 위한 미시경제학적 기초 이준구, 『미시경제학』 참조.
你爸爸在哪儿工作? 第12课 네 아버지는 어디서 일하시니?.
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
C++ Espresso 제1장 기초 사항.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
C++ Espresso 제2장 제어문과 함수.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
컬러 LED바 이해하기 목차 재료준비 및 브레드 보드 배선 구성하기 컬러 LED바 이해 및 프로그램 실습 응용 작품 만들기.
시스템 생명 주기(System Life Cycle)(1/2)
명품 C++ 13장 예외 처리와 C 언어와의 링크 지정.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
태양계 시뮬레이션 팀 명: 복학생 강유진 박지혜.
시스템 생명 주기(System Life Cycle)(1/2)
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
Chapter 06. 스택(Stack) Chapter 06-1: 스택의 이해와 ADT 정의.
빛의 합성과 색 인지 곽석우, 황병준.
10 Three-Dimensional Object Representations  고려대학교 컴퓨터학과 김 창 헌.
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
Data structures 02.2:mathematical induction 동의대학교 멀티미디어공학과 이광의 교수.
Data structures 02.3:programming recursive functions
Visual C++ Programming Common Controls
Chapter 9 정렬(sorting) SANGJI University Kwangman KO
C언어 프로그래밍의 이해 Ch05. 명령문 Phylogenetic: 계통, 발생(학)의.
6장 Functions of r.v..
QT/Embedded, iPop을 이용한 네트워크 오목게임
QT/Embedded, iPop을 이용한 네트워크 오목게임
기초통계학 제 7장 연관성 분석 1. 상관분석 2. 교차분석
제8장 채권가격과 수익률.
(Interpolation Values)
택배 데이터베이스 모델링 김동영 이승언.
버퍼 (Buffer).
Chapter 10 함수 기본.
生存交际 第一级 第一单元 nǐ hǎo , wǒ shì mài kè 你 好 , 我 是 麦 克 。 Hello! I’m Mike.
C언어 프로그래밍의 이해 Ch13. 선행처리기와 주석문.
11장. 1차원 배열 IT응용시스템공학과 김 형 진 교수.
수학8가 대한 92~95 쪽 Ⅳ. 연립방정식 1. 연립방정식과 그 풀이 및 활용 >끝내기전에(9/9) 끝내기 전에.
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
선택 정렬 #define SWAP(x, y, t) {(t) = (x); (x) = (y); (y) = (t);}
자궁경부암 & A형간염 예방접종안내 알고 계세요? 소중한 당신과 가족의 건강을 위해,
Chapter 11. 배열과 포인터.
야채 듬뿍 월남쌈 센텀초등학교 요리교실 강사 : 전지원.
9장 부프로그램(2) 순천향대학교 컴퓨터공학부 하 상 호.
누구나 즐기는 C언어 콘서트 제2장 기초 사항 IT응용시스템공학과 김형진 교수.
C 코드최적화 세명대학교 AI연구실 양승조.
C언어 프로그래밍의 이해 Ch05. 명령문.
Part III 애니메이션 Chapter 9 곡선.
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
CHAP 1:자료구조와 알고리즘.
AP 수량 산정 및 도면 2014 서강대학교 정보통신원.
3장,4장 발표 서정우.
Window, Viewport Window, Viewport.
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
C# 10장. 참조형.
기초학력향상 지원사이트 Ku-Cu - 활용안내 -
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
과목명: IT 표준 (표준화강좌) 교재: 미래사회와 표준, KSA 한국표준협회, 2007
중국의 단오절(端午节).
Chapter 7 – Curves Part - I
2강 -문혁-.
알기쉽게 해설한 데이터구조 고 갑 승 한남대학교
C.
2016년 3정 5행 추진현황보고 (5월 실적) 생산관리팀.
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
Presentation transcript:

곡선 처리

곡선의 연결과 Continuity Zero-Order Continuity First-Order Continuity 복잡한 구조의 곡선을 구성하기 위하여서는 그 곡선을 한번에 정의할 수 있는 복잡한 함수를 사용하기 보다는 간단한 함수로 정의할 수 있는 짧고 단순한 형태의 곡선을 여러 개 연결하는 방법을 사용한다. 이때 연속된 두 개의 곡선이 연결된 모양에 따라서 다음과 같은 continuity가 존재한다. Zero-Order Continuity 두개의 곡선의 단순히 연결되어 있는 것 첫 번째 곡선의 끝점과 두 번째 곡선의 시작점을 일치시킴으로써 얻을 수 있다. First-Order Continuity 접선 첫 번째 곡선의 끝점과 두 번째 곡선의 시작 점을 연결 시키고, 두 곡선의 연결 점에서의 접선의 기울기를 같게 함으로써 얻을 수 있다. 이 경우 두 곡선의 연결 점을 눈으로 식별할 수 없다. Second-Order Continuity 접선 연결 점에서의 접선의 기울기 뿐 아니라 곡률까지 같게 함으로써 얻을 수 있다. 이 경우에는 연결 점을 식별할 수 없을 뿐 아니라 두 개의 곡선이 마치 하나의 곡선같이 보인다. 2차원 곡선

Bezier Curve 여러 개의 컨트롤 포인트를 사용하여 첫 번째 컨트롤 포인트와 마지막 컨트롤 포인트를 다음의 예와 같이 연결하는 곡선을 정의하는 방법으로서 비교적 구현이 쉽고 Zero Order Continuity와 First Order Continuity를 구현하기 쉬운 곡선 Approximation 방법 p0 p1 p2 세 개의 컨트롤 포인트를 사용한 Bezier 곡선 p3 네 개의 컨트롤 포인트를 다섯 개의 컨트롤 포인트를 p4 2차원 곡선

Bezier Curve에서 사용하는 컨트롤 포인트들은 곡선 상의 한 점의 위치를 결정하는데 각각 영향을 미친다. 사용하여 나타낸다. (u의 값이 0이면 곡선의 시작위치를 의미하고 1이면 곡선의 끝의 위치를 의미한다) u의 값이 주어졌다고 하고 그 위치에서 각 컨트롤 포인트가 미치는 영향은 다음의 Blending Function을 사용하여 정의된다. u의 위치에서 k번 째 컨트롤 포인트가 미치는 영향을 BEZ k,n(u)로 나타내면 BEZ k,n(u) = C(n,k) u k (1 - u) n-k 위의 식에서 C(n,k)는 2항 계수로서 n ! C(n,k) = k ! (n - k) ! 로 정의 된다. 2차원 곡선

모든 컨트롤 포인트가 각각 Blending function BEZ k,n(u) 만큼 영향을 미치므로 전체 컨트롤 포인트가 곡선의 구간 내의 임의의 위치에서 미치는 영향의 합이 그 위치에서의 곡선 상의 점의 값을 결정한다. 임의의 위치에서의 곡선상의 점을 p(u)라고 하면 n p(u) =  pk BEZ k,n(u) ( 0  u  1 ) k=0 위 식의 각 term의 수식을 직접 대입하여 나타내면 다음과 같다. n n ! p(u) =  pk u k (1 - u) n - k ( 0  u  1 ) k=0 k ! (n - k) ! 2차원 곡선

: 앞 페이지의 식에 의하면 p(u)는 결국 다음의 term들의 합이 된다. p0 u 0 (1 - u) n - 0 k = 0 인 경우 p1 u 1 (1 - u) n - 1 1 ! (n - 1) ! k = 1 인 경우 p2 u 2 (1 - u) n - 2 2 ! (n - 2) ! k = 2 인 경우 pn u n (1 - u) n - n n ! (n - n) ! k = n 인 경우 p0 (1 - u) n pn u n p1 n u (1 - u) n-1 n(n-1) p2 u2 (1 - u) n-2 2 2차원 곡선

Bezier Curve와 Zero-Order Continuity 앞에서 u의 값은 0~1사이의 값으로서 u = 0 이면 곡선의 시작위치를 의미하고 u = 1이면 곡선의 끝의 위치를 가리킨다고 하였다. 앞 페이지의 각 term들을 보면 u = 0인 경우(시작 점) 에는 k = 0인 경우에는 Blending function의 값이 1이고 나머지의 경우에는 모두 0이다. 따라서 첫번째 컨트롤 포인트(P0)가 곧 곡선의 시작 점이 됨을 알 수 있다. 또 u = 1인 경우(끝 점)에는 k = n인 마지막 Blending function의 값이 1이고 나머지 경우는 모두 값이 0이다. 따라서 마지막 컨트롤 포인트가 곧 곡선의 끝 점이 됨을 알 수 있다. 따라서, 두 개의 곡선을 정의하는 컨트롤 포인트들이 있다고 할 때 첫 번째 곡선의 마지막 컨트롤 포인트와 두 번째 곡선의 첫 번째 컨트롤 포인트의 위치를 같게 함으로써 두 개의 곡선을 쉽게 연결할 수 있다. Zero Order Continuity를 쉽게 얻을 수 있다. 그 이외의 (0 < u < 1)인 구간에서는 모든 컨트롤 포인트들이 조금씩 곡선의 점의 위치에 영향을 미친다. 2차원 곡선

Cubic Bezier Curve Bezier Curve에 사용되는 컨트롤 포인트의 개수는 제한이 없다. 그러나 앞에서 본 바와 같이 (n+1)개의 컨트롤 포인트를 사용하는 경우의 Blending function 식의 차수가 n이 되므로 컨트롤 포인트를 너무 많이 사용하면 식이 복잡해지고 연산의 양이 많아 진다. 따라서 Bezier Curve를 사용하는 대부분의 Graphics Package들에서는 컨트롤 포인트의 개수를 4개 (p0 .. p3)로 제한하고 있다. 네 개의 컨트롤 포인트를 사용하면 Blending function의 차수가 3이 되므로. 이를 Cubic Bezier Curve라고 한다. Cubic Bezier Curve의 p(u)의 값은 다음과 같이 구해진다. p(u) = P0 (1-u)3 + P1 3u (1-u)2 + p2 3u2(1-u) + p3 u3 2차원 곡선

p  (x,y) 이므로 아래의 Cubic Bezier Curve의 식은 x값과 y값에 대하여 따로 적용하여야 한다. x(u) = x0 (1-u)3 + x1 3u (1-u)2 + x2 3u2(1-u) + x3 u3 p(u) = P0 (1-u)3 + P1 3u (1-u)2 + p2 3u2(1-u) + p3 u3 y(u) = y0 (1-u)3 + y1 3u (1-u)2 + y2 3u2(1-u) + y3 u3 2차원 곡선

Bezier Curve와 First-Order Continuity 알아 보기 위하여 아래의 Cubic Bezier Curver의 식을 u에 대하여 미분 하면 p(u) = P0 (1-u)3 + P1 3u (1-u)2 + p2 3u2(1-u) + p3 u3 P0 (1-u)3 P0 [3 (1-u)2 (-1) ] = P0 [-3(1-u)2] = -3 P0 (1-u) 2 P1 3u (1-u)2 3 P1 [(1-u)2 + u . 2(1-u) . (-1) ] = 3 P1 [(1-u)2 - 2u(1-u)] p2 3u2(1-u) 3 p2 [2u(1-u) + u2 (-1)] = 3 p2 [2u(1-u) - u2 ] = -3 p2 [u2 - 2u(1-u) ] p3 [3u2 ] = 3 p3 u2 d p(u) = d u -3 P0 (1-u) 2 + 3 P1 [(1-u)2 - 2u(1-u)] + -3 p2 [u2 - 2u(1-u) ] + 3 p3 u2 미분 계속 2차원 곡선

Bezier Curve와 First-Order Continuity 계속 곡선의 시작 점에서의 접선의 기울기를 알아 보기 위하여 앞 페이지의 우측의 도함수에 u = 0을 대입해 보면 -3 P0 (1-u) 2 + 3 P1 [(1-u)2 - 2u(1-u)] + (-3) p2 [u2 - 2u(1-u) ] + 3 p3 u2 = 3 ( P1 - P0 ) (when u=0) 따라서, Bezier 곡선의 시작점에서의 접선은 P0 에서 P1 으로 향하는 vector와 방향이 같다는 것을 알 수 있다. 또한, 곡선의 끝 점에서의 접선의 기울기를 알아 보기 위하여 앞 페이지의 우측의 도함수에 u = 1을 대입해 보면 -3 P0 (1-u) 2 + 3 P1 [(1-u)2 - 2u(1-u)] + (-3) p2 [u2 - 2u(1-u) ] + 3 p3 u2 = 3 ( P3 - P2 ) (when u=1) 따라서, Bezier 곡선의 끝점에서의 접선은 P2 에서 P3 로 향하는 vector와 방향이 같다는 것을 알 수 있다. 계속 2차원 곡선

Bezier Curve와 First-Order Continuity 계속 곡선의 First-Order Continuity를 얻기 위하여서는 두 개의 곡선의 연결 점에서의 두 곡선의 접선의 기울기를 같게 해 주어야 한다고 앞에서 이야기 한 바 있다. 두 개의 Bezier Curve의 연결 점에서의 두 곡선의 접선의 기울기를 같게 해 주기 위해서는 앞 페이지에서 알아본 대로 Bezier curve의 양 끝 점에서의 접선의 기울기가 각각 양 끝점에서 이웃한 두 개의 컨트롤 포인트를 연결하는 선분과 방향이 같다는 점을 이용할 수 있다. 즉 , 다음의 그림과 같이 두 Bezier curve의 연결 점과 그와 각각 이웃한 두 컨트롤 포인트를 일직선 상에 배치함으로써 Bezier Curve의 First-Order Continuity를 얻을 수 있다. 곡선 1 곡선 2 두 점이 같은 위치에 있음: Zero-Order Continuity 두 연결 점과 그와 각각 이웃한 두 점 (모두 4개의 점)이 일직선 상에 있다 : First-Order Continuity 2차원 곡선

get_2d_bezier_curve()함수 소스 (2d-bez.c 파일 내) void get_2d_bezier_curve(float *cx, float *cy, float *x, float *y, int n) { int i; float u, du, cu, Bez03, Bez13, Bez23, Bez33; u=0.0; du = 1.0 / (float)(n-1); for(i=0; i<n; i++) { cu = 1.0 - u; Bez03 = cu * cu * cu; Bez13 = 3.0 * u * cu * cu; Bez23 = 3.0 * u * u * cu; Bez33 = u * u * u; x[i] = cx[0] * Bez03 + cx[1] * Bez13 + cx[2] * Bez23 + cx[3] * Bez33; y[i] = cy[0] * Bez03 + cy[1] * Bez13 + cy[2] * Bez23 + cy[3] * Bez33; u += du; }/*i*/ } 2차원 곡선

Bezier Curve 테스트 프로그램 파일: “2dBezTst.c” draw_2d_bezier_curve()함수 소스 (2d-bez.c 파일 내) int draw_2d_bezier_curve(float *cx, float *cy, int n, float r, float g, float b) { float *x, *y; x = malloc(sizeof(float) * n); if(!x) return 0; y = malloc(sizeof(float) * n); if(!y) { free(x); return 0; } get_2d_bezier_curve(cx,cy,x,y,n); draw_polygon(x,y,n, r,g,b); free(x); free(y); return 1; } Bezier Curve 테스트 프로그램 파일: “2dBezTst.c” 2차원 곡선