<<

CURVE 3D 프로그래머를 위한 커브 입문서 : 직선에서 곡면까지 1st Edition

lifeisforu [email protected] http://lifeisforu.tistory.com

1

목차

목차 ...... 2 들어 가며 ...... 4 1. Combination ...... 6 1.1. Linear combination ...... 6 1.2. Linear independence ...... 7 1.3. Cartesian coordinate system ...... 8 1.4. Convex combination ...... 9 2. & ...... 13 2.1. Linear interpolation ...... 16 2.2. Polynomial interpolation ...... 17 2.3. Method of undetermined coefficients ...... 18 2.4. Lagrange interpolation ...... 19 2.5. Divided difference ...... 21 2.5.1. Linear interpolation ...... 21 2.5.2. Quadratic interpolation ...... 22 2.5.3. Divided difference & General intepolation...... 23 2.6. Newton interpolation ...... 25 2.7. Problem of polynomial interpolation ...... 26 2.8. interpolation ...... 28 2.8.1. Cubic ...... 29 2.8.2. Solving natural cubic spline ...... 31 3. Parametric equation & continuity ...... 33 3.1. Parametric equation ...... 34 3.2. Parametric continuity ...... 37 3.3.Geometric Continuity ...... 40 4. Bé zier curve ...... 42 4.1. Linear Bé zier curve ...... 43 4.2. Quadratic Bé zier curve ...... 43 4.3. Cubic Bé zier curve ...... 45 4.4. Composite Bezier curve ...... 48 5. Spline Curve ...... 50 5.1. Linear spline curve ...... 50 5.2. Quadratic spline curves ...... 51 5.3. Spline curves of higher degrees ...... 53

2

6. Hermite spline ...... 56 6.1. Finite difference ...... 58 6.2. Cardinal spline ...... 58 6.3. Catmul-Rom spline ...... 58 6.4. Kochanek-Bartels spline ...... 59 6.5. Monotone cubic interpolation ...... 60 7. B-Spline( Basis spline ) ...... 61 8. Nonuniform rational B-Spline( NURBS ) ...... 65 8.1. Nonuniform B-spline ...... 65 8.1.1. Uniform knot vector ...... 65 8.1.2. Open uniform knot vector ...... 66 8.1.3. Non-uniform knot vector ...... 67 8.2. Rational curve ...... 68 8.3. Non-Uniform Rational B-Spline ...... 71 8.4. Construction of the basis functions ...... 72 8.5. General form of a NURBS curve ...... 76 8.6. General form of a NURBS surface ...... 76 9. Subdivision Surface ...... 76

3

들어 가며

대부분의 3D 프로그래머들은 커브를 다뤄 본 적이 있을 것입니다. 그런데 안타깝게도 커브의 개 념을 제대로 이해하고 사용하는 사람들은 많지 않습니다. 저도 그런 부류 중의 하나입니다. 대부 분 그냥 라이브러리에 있는 기능을 사용하든지 구글링을 해서 찾은 코드를 사용합니다. 그러다 보니 다음과 같은 요청에 대응할 수가 없습니다.

"점을 찍으면 자동으로 path 가 생성되게 해 주세요."

"Path 를 원하는 대로 제어할 수 있게 해 주세요."

"Path 를 따라 움직이는 오브젝트가 등속도 운동을 하게 해 주세요."

"Path 가 부드럽게 연결되게 해 주세요."

"이럴 땐 어떤 커브를 사용해야 하나요?"

위와 같은 요청에 응답하기 위해서 코드를 보면 뭔가 곱하고 더하고 난리도 아닙니다. 그리고 모 르는 용어가 자꾸 나오니 이해하기도 어렵습니다. 또한 값을 좀만 바꿔도 원하지 않는 매듭 모양 이 나오거나 깨집니다.

코드를 이거 건드려 보고 저거 건드려 보고, 값을 이리 바꾸고 저리 바꾸고, 삽질을 하다가 보면 시간은 흘러가고 작업 마감일은 다가 옵니다. 그렇다고 제대로 공부하기에는 시간도 부족한 것 같고 참고 자료도 마땅치 않습니다. 특히나 저 같은 문과 출신들에게는 그것이 엄청난 벽으로 다 가 옵니다. 왜냐하면 어디서부터 시작해서 어디에서 끝내야 할지 모르기 때문입니다.

사실 커브 및 서피스에 대한 내용은 수학적인 카테고리로 볼 때 수치해석( numerical analysis ) 과 관계가 깊습니다. 인문계 출신들은 그런 분야의 존재 자체를 모르는 사람도 많을 것입니다. 저만 해도 그런 과목이 있다는 것은 들어는 봤지만, 실제 무슨 내용인지는 이 문서를 정리하면서 수치해석의 내용이 무엇인지 알게 되었습니다. 그러므로 이쪽에 대해 전문가 수준으로 알고자 한 다면 수치해석 책 하나 보시는 것이 깔끔할 것이라 생각합니다. 물론 비전공자가 보기에는 친절 하지 않을 수도 있습니다.

그런데 그저 개념만 파악하고자 하거나 간단한 참고서가 필요하다는 생각을 하실 수 있습니다. 이 글은 ( 저를 포함한 ) 그런 사람들에게 샛길이라도 제공하기 위해서 작성되었습니다. 그러므 로 독자들이 이런 분야에 대한 지식을 많이 가지고 있지 않다는 전제를 깔고 글을 작성하도록 하 겠습니다.

이 글의 내용은 직접 작성한 부분도 있지만 거의 대부분은 참고자료를 번역하거나 정리한 것입니 다. 그리고 정확한 내용을 담고 있지 않을 수 있음을 죄송하게 생각합니다. 제가 수학과 영어에 전문가가 아니기 때문에 잘못된 지식들도 포함되어 있을 수 있습니다. 그러므로 이해가 안 간다

4

싶으면 적당히 다른 참고 문헌들을 참조하시기 바랍니다.

궁금한 사항이 있으시거나 잘못된 내용을 제보해 주시려고 한다면, 저에게 메일 ( [email protected] )을 보내 주시면 됩니다.

다시 한 번 말씀드리지만 전문적인 영역에 접근하는 책은 아니므로 대충 전체 흐름을 이해한다는 느낌으로 보시기 바랍니다. 커브 다항식이 어떤 형태로 구성되는지를 이해하고 상용 라이브러리 의 파라미터들을 이해할 수 있다면, 그리고 스스로 간단하게 커브 다항식을 만들어 낼 수 있다면 대성공일 것입니다.

지금은 제가 아는 게 별로 없어서 내용이 많이 부실하고 그냥 짜집기에 가까운 글이 되었지만, 나중에 기회가 되면 좀 더 내용을 보강해서 2nd Edition 을 작성해 볼 계획입니다.

마지막으로, 부탁드리고 싶은 것이 있는데, 이 글을 상업적으로 이용하지 말아 주시기 바랍니다.

5

1. Combination

커브를 다룰 때 가장 먼저 알아야 할 것은 combination 입니다. 이 개념은 기하 도형들을 다룰 때도 매우 중요한 개념입니다. 왜냐하면 정의역( domain )과 치역( range )을 결정하는 데 영향 을 끼치기 때문입니다.

잘 이해가 안 갈 수 있으니, 예를 들어 보도록 하겠습니다. 다음과 같은 문제가 있다고 합시다.

“어떤 삼각형 안쪽에 10 초 동안 100 개의 점을 찍는 프로그램을 제작하십시오”

일단 가장 핵심적인 조건은 무엇일까요? 물론 다들 아시겠지만, “삼각형 안쪽에 점을 찍는다” 입 니다. 일단 이 핵심조건을 만족하는 함수를 만들었다고 합시다. 그렇다면 이 함수에 어떤 범위의 값들( 정의역 )을 넣어야 삼각형 안 쪽의 어떤 점들( 치역 )이 나오게 될까요?

이러한 질문에 답을 줄 수 있는 것이 바로 combination 입니다. 집합론의 조합이 combination 이라는 용어로 사용되고 있는데, 여기에서 combination 은 결합의 의미로 사용됩니다.

1.1. Linear combination

Linear combination( 선형 결합 ) 이라는 것은 상수로 이루어진 항들과 벡터로 이루어진 항들을 곱한 것을 서로 더해서 결과를 만드는 표현식을 의미합니다. 예를 들면 벡터 x, y 에 대한 linear combination 은 ax + by 라는 식으로 표기될 수 있고, 여기에서 a, b 는 상수입니다. 나중에 보면 알겠지만 해당 식은 전체 실수 집합에서 특정한 부분집합을 표현할 수 있습니다. 그래서 combination 입니다.

K 라는 field ( 예를 들면, 실수 ) 와 K 에 의존하는 V 라는 vector space 가 있다고 가정합시다. 보통 우리는 V 의 요소를 vector 라 부르고, K 의 요소를 scalar 라 부릅니다. 만약 v1, …,vn 이 벡터이고 a1, ..., an 이 스칼라라고 한다면 Linear combination 은 다음과 같이 표기될 수 있습니다.

이 단순해 보이는 식이 왜 중요한 것일까요? 저 식에 linear independence( 선형 독립성 )을 부여하면 공간을 정의하는데 매우 유용하기 때문입니다.

일단 2 개의 2 차원 벡터, v1, v2 와 임의의 스칼라 a1, a2 를 가지고 있다고 합시다. 그러면 아래 그림처럼 2 차원 공간상의 어떠한 점을 만드는 것이 가능합니다.

6

그림 1. 2 개의 요소를 가진 linear combination.

이것은 3 개의 2 차원 벡터와 스칼라 쌍을 통해서도 가능합니다.

그림 2. 3 개의 요소를 가진 linear combination.

1.2. Linear independence

그런데 linear independence 를 부여한다는 것은 어떤 의미일까요? 일단 반대 의미인 linear dependence( 선형 종속성 ) 라는 의미에 대해서 살펴 보도록 하겠습니다. 선형 종속성이라는 것은 linear combination 을 구성하는 한 벡터가 다른 벡터들의 linear combination 에 의해서 정의되는 상태를 의미합니다.

이해가 쉽지 않으므로 매우 단순한 예를 하나 들어 보도록 하겠습니다. 다음과 같은 linear combination 이 있다고 가정합니다.

원래의 linear combination 에서 v1 을 제외하면 v2 와 v3 로 구성된 또 다른 linear combination 이 생깁니다. 이 때 v1 이 v2 와 v3 에 의한 linear combination 으로 정의될 수 7

있다면, 즉 아래 식이 참이라면, 해당 linear combination 은 바로 선형 종속성을 가진다고 할 수 있습니다.

v1 이 ( 2.0, 3.0 ) 이고 v2 가 ( 1.0, 0.0 ), 그리고 v3 가 ( 0.0, 1.0 ) 라고 합시다. 그리고 a1

은 1.0 이고, a2 가 2.0, 그리고 a3 가 3.0 이라고 합시다. 그러면 다음의 관계가 성립됩니다.

결국 해당 식은 참이 되어, 앞의 linear combination 은 선형 종속성을 가진 것입니다. 만약 이 식이 거짓이었다면, 선형 독립성을 가진 것이 됩니다. 이를 일반화하면 선형 종속성은 다음과 같이 정의됩니다.

벡터 스페이스 V 의 부분집합 S = { v1, v2, ..., vn } 의 벡터들에 대해서, 0 이 아닌 a1, a2, ..., ak 스칼라들과 v1, v2, ..., vk 벡터들에 대해서 다음을 만족하면, S 의 벡터들은 선형적으로 종속되었다고 할 수 있습니다.

이를 정리하면 다음과 같이 표현할 수 있습니다.

즉, 적당한 스칼라 값만 공급해 주면 나머지 벡터들로 v1 을 정의할 수 있다는 의미가 됩니다.

그렇다면 S 의 벡터들이 linear independence 가 될 수 있는 조건은 무엇일까요?

바로 벡터 스페이스의 차수와 동일한 개수의 벡터들을 사용하되 직교하게 만드는 것입니다. 그것의 예가 우리가 자주 접하는 Cartesian coordinate system( 데카르트 좌표계 ) 입니다.

1.3. Cartesian coordinate system

Euclidean space( 유클리드 공간 ) 에서 가장 중요한 개념들 중의 하나를 언급하라고 하면, 데카르트 좌표계를 예로 들 수 있습니다. 이는 선형 독립적인 linear combination 을 보장하며, 공간상의 모든 점을 표현할 수 있는 수단을 제공하기 때문입니다.

2 차원에서의 linear combination 을 살펴 봅시다.

8

v1 이 ( 1.0, 0.0 ) 이고 v2 가 ( 0.0, 1.0 ) 이라고 합시다. 그렇다면 임의의 a1 과 a2 를 공급하여 linear combination 을 수행한 결과를 보면 다음과 같습니다.

그림 3. 직교하는 벡터들을 이용한 linear combination.

그림 3 은 매우 익숙한 형태를 보여 주고 있습니다. a1v1 + a2v2 를 각각 v1 과 v2 에 사영하면

결과는 각각 a1v1 과 a2v2 가 됩니다. 이를 좌표계 표현으로 바꾸면 ( a1, a2 ) 라고 할 수 있습니다. 이렇게 linear combination 의 형식으로 공간상에 어떠한 새로운 벡터를 만들어 낼 수 있는 선형 독립적인 벡터들을 basis vector( 기저 벡터 ) 라 합니다.

정규화되어 있지 않은 벡터를 사용해서 좌표를 표현할 수도 있지만, 그렇게 되면 기저를 만드는 사람이나 단체마다 그 의미가 균일하지 않을 것입니다. 그래서 기저에 대한 표준을 정했으며, 그것을 standard basis( 표준 기저 )라고 합니다. 표준 기저는 각 축 방향에 대한 unit vector( 단위 벡터 )입니다. 이것이 데카르트 좌표계에서의 기저가 됩니다.

이것은 우리가 ( a, b ) 라는 형태의 좌표를 보면, x 축으로 a 만큼, y 축으로 b 만큼이라고 자연스럽게 생각할 수 있는 근거를 제공합니다. 기저가 단위 벡터이니 normalize 되어 있고, 벡터를 각 기저에 사영한 벡터의 길이는 벡터와 기저를 dot-product( 내적 ) 한 결과와 같습니다. 그래서 다음과 같이 말할 수 있습니다.

"데카르트 좌표계에서 어떤 벡터의 좌표는 표준 기저들에 대한 내적의 결과이다."

1.4. Convex combination

지금까지의 내용을 통해서, 우리는 linear combination 이 결국 공간을 정의한다는 것을 알게 되었습니다. 그런데 지금까지 글을 보면서 의문을 가지는 사람들이 있을 것입니다.

"정의역과 치역을 이야기하다가 뜬금없이 뭔 소리일까?"

다급해 하지 마십시오. 이제부터가 본론입니다.

Convex combination 은 "한정된" 공간을 정의할 수 있게 해 줍니다.

9

3D 프로그래밍을 좀 해 보신 분들은 convex 와 concave 에 대해서 들어 보신 적이 있을 것입니다. Concave 는 non-convex 입니다.

어떤 영역 안에 있는 두 점들을 선택했을 때 그 두 점들을 연결하는 직선이 특정 영역 안쪽에 존재한다면 convex 라고 합니다. 아래 그림을 보면 좀 더 명확해 질 것입니다.

그림 4. 왼쪽이 convex set, 오른쪽이 concave set. 출처 : Convex set, wikipedia.

Convex 가 되는 조건을 수학적으로 만족시켜 주는 것이 convex combination 입니다. 기본적인 형태는 linear combination 과 같은데, 스칼라에 대한 조건만 틀립니다.

단,

이라는 조건을 만족시켜야 합니다. 이것을 이해하기 위해서는 line 에서부터 설명을 시작하는 것이 편합니다. 다음과 같은 직선이 있다고 합시다. 그리고 어떤 점은 시간에 따라 직선 위를 이동하고 있습니다. 그 점의 위치를 결정하는 함수를 p( t ) 라고 합시다.

그림 5. 시간에 따라 직선 위를 움직이는 점.

a 는 시간 t0 일 때의 점이고, b 는 시간 t1 일 때의 점입니다. 시간 t 일 때 p( t ) 가 가리키는 점의 위치를 a 와 b 를 사용해서 표현해 보십시오.

아마 머리가 멍해지시는 분들이 있을 것입니다. 저도 질문 써 놓고 잠시 멍하니 있었습니다.

우리가 실수 벡터 공간을 다루고 있다는 점을 상기하면, 약간 좀 편하게 접근할 수 있습니다.

10

그림 6. 그림 5 에 벡터 관점으로 접근. p( t ) 는 다음과 같이 정의될 수 있습니다.

이제 원래 주제로 돌아 와서 이것이 왜 convex combination 과 관련이 있는지 이야기해 보도록 하겠습니다. p( t ) 를 linear combination 의 형식으로 변경해 보면 다음과 같습니다.

v1 은 a, v2 는 d, a1 은 1, a2 는 t 입니다. t 의 값을 변경시키면 직선 위의 어떤 점이라도 표현할 수 있습니다. 즉 이 linear combination 은 직선이 정의하는 공간을 의미하고 있습니다.

이제 a, b, t 만을 사용하는 표현식을 생각해 봅시다. 가중치 표현을 사용하면 다음과 같이 표현하는 것이 가능합니다. 왜 이런 형태가 가능한 지 궁금하면 [ 2.1. Linear interpolation ] 을 참조하시면 됩니다.

앞서 언급했듯이 n 차원 공간에 n 개의 벡터가 존재한다면 어떤 점이라도 표현할 수 있습니다. 이것 역시 linear combination 의 형태입니다. 그런데 여기에서 특이한 점을 발견할 수 있습니다.

11

위의 조건은 alpha-blending( 알파 블렌딩 ) 과 유사합니다. 알파 블렌딩은 보간하려고 하는 두 색상의 가중치의 합이 1 이어야 하기 때문입니다. 이런 조건 때문에 우리는 자연스러운 블렌딩을 볼 수 있는 것입니다.

이것이 바로 convex combination 을 정의하는 단초입니다. 수학적으로 convex combination 은 다음과 같이 정의됩니다.

Convex combination 은 닫힌 공간을 정의하는 linear combination 입니다. 이것의 면밀한 증명 과정을 알고자 한다면 wikipedia 를 살펴 보시기 바랍니다.

어쨌든 이 convex combination 을 만족하는 점들의 외곽을 이으면, 그것이 바로 convex hull 이 됩니다.

자, 처음의 질문으로 돌아 가서 삼각형의 내부에 점을 찍는 경우를 생각해 봅시다.

어떤 점은 그림 7 에서 처럼 linear combination 으로 표현될 수 있습니다. 그리고 앞에서 언급했듯이 스칼라들의 합이 1 이면 convex combination 이 됩니다. 아마도 정말로 그런지 궁금할 것입니다.

일단 a1 + a2 + a3 = 1 이라고 가정해 봅시다. 그림 8 에서는 먼저 v1 과 v2 의 convex combination 을 구합니다. a1 + a2 <= 1 이므로 당연히 v1 과 v2 를 잇는 직선 위에

존재합니다. 그 다음으로 새로운 점 a1v1 + a2v2 와 v3 에 대해서 convex combination 을

구합니다. a3 <= 1 이므로 당연히 두 점을 잇는 직선 위에 존재합니다.

그림 7. 어떤 점의 linear combination 표현.

12

그림 8. 삼각형 내에서의 convex combination.

이쯤에서 a1 = 3, a2 = 2, a3 = -4 여도 a1 + a2 + a3 = 1 이지 않느냐는 의문을 가지시는 분이

꼭 있을 것 같습니다. 하지만 앞에서 정의한 convex combination 에는 ai >= 0 이라는 조건이 있음을 반드시 기억하시기 바랍니다.

식이 계산 되는 과정을 살펴 보면 몇 가지 사실을 알 수 있습니다. a1 = 1 이면 점은 v1 이고, a1 + a2 = 1 이면 점은 v1 과 v2 사이를 잇는 직선 위에 존재합니다. a1 != a2 != a3 != 0 이면 점은 삼각형 내부에 존재하게 됩니다. 즉, 실제적인 combination 의 요소 개수에 따라서 그 공간이 점, 선, 면으로 확장되어 가고 있음을 알 수 있습니다( 물론 2 차원 내에서의 이야기입니다 ). 조금만 생각해 보시면 이해하실 수 있을 것입니다.

지금까지 살펴 보았듯이, 삼각형의 convex combination 은 함수의 정의역과 치역을 결정하게 됩니다.

여기에서 R 은 실수 집합을 의미합니다.

이제 xxx-combination 이라는 것들의 의미를 어느 정도 이해하고 친숙해졌을 것이라 생각합니다. 이러한 combination 들에 대한 선행학습이 필요한 이유는 뒤에 나올 섹션들에서 좀 더 명확해 질 것입니다.

2. Polynomial & interpolation

Polynomial( 다항식 ) 은 커브를 정의하는 데 있어서 중요한 요소입니다. 여러분은 학교 다니면서 "다항식이 n 차다" 라는 말을 들어 본 적이 있을 것입니다. n 이 1 이면 직선을, 2 면 변곡점이 하나인 곡선을, n 이면 변곡점이 n - 1 개인 곡선을 의미합니다. 다항식 자체로 커브를 의미합니다.

13

다음과 같은 함수가 있다고 합시다.

이 함수의 결과는 그림 9 와 같습니다.

그림 9. 5차 다항식의 결과. 출처 : Polynomial, wikipedia.

Bézier curve( 베지어 커브 ) 나 B-spline curve( B 스플라인 커브 ) 등은 기본적으로 다항식을 이용합니다. 다항식이 quadratic( 2 차 ) 이냐 cubic( 3 차 ) 이냐에 따라서 다양한 이름이 붙습니다; quadratic Bézier curve, cubic Bézier curve, 이런 식으로 이름을 붙입니다. 어려운 이름들이 붙었다고 해서 본질을 망각해서는 안 됩니다. 그러면 더 어려워집니다.

일단 기억이 가물가물한 사람들이 있을 수 있으므로, 다항식에 대해서 정리를 하고 시작하도록 하겠습니다( https://ko.wikipedia.org/wiki/%EB%8B%A4%ED%95%AD%EC%8B%9D 를 참조 ).

다항식이라는 것은 말 그대로 변수를 포함하거나 포함하지 않는 여러 개의 항으로 이루어진 식을 의미합니다. 다음과 같은 예를 들 수 있겠죠.

그런데 다항식 내에는 여러 개의 변수가 존재할 수 있습니다. 그래서 어떤 기준에 의해서 정렬을 해야 보기 편한데요, 위의 식 같은 경우에는 x 를 중심으로 항을 정렬했습니다. 보통 정렬을 할 때는 차수가 높은 것으로부터 낮은 것으로 정렬하는 경향이 있습니다. 보기 편하기 때문입니다.

만약 x 에 대해서 정렬했다고 하면 위의 식은 다음과 같이 해석할 수 있습니다.

14

괄호 안의 식들을 각각 항이라고 부를 수 있으며, 이를 "x 에 대한 다항식" 이라고 부릅니다. 가장 높은 차수가 3 이므로 "x 에 대한 3 차 다항식" 이라고 합니다. x 를 포함하지 않는 항들을 "상수항" 이라고 부릅니다.

우리가 함수로서 자주 사용하는 형태는 변수가 하나인 형태인데요, 이를 계수가 상수인 일변수 다항식이라고 부릅니다( uninvariate polynomial with constant coefficient with respect x ). 일반적으로는 x 에 대한 다항식( polynomial with respect to x )이라고 부릅니다.

n + 1 개의 점, ( x0, f(x0)), (x1, f(x1)), …, (xn, f(xn)) 이 주어졌다고 합시다. 이 때 그 점들을 모두 지나는 다항식을 구하는 것을 보간이라고 합니다. 이러한 보간법을 사용하면 Curve fitting 을 수행할 수 있습니다.

Curve fitting 은 커브나 수학적 함수를 생성하는 절차를 의미합니다. 어떤 데이터들이 주어졌을 때, 그 데이터들의 패턴을 보여 주기 위해서 커브를 만들 필요가 있습니다.

그림 10. 커브 피팅의 예. 출처 : Curve fitting, wikipedia.

Curve fitting 을 하는 방법에는 크게 두 가지가 있다고 합니다; regression, interpolation. Regression 은 데이터가 오차가 있을 경우에 어떠한 경향을 찾아 내는 것을 말한다고 합니다. 그림 11 의 붉은 커브는 regression 의 예라고 할 수 있습니다.

Interpolation 은 알려진 data point 들의 discrete set 으로부터 새로운 점 집합을 생성하는 것을 의미합니다. 한 마디로 비어 있는 중간 점들을 보강해서 채우겠다는 것입니다. 보통 interpolation 에는 보간 다항식을 사용하게 됩니다. 보간의 극단적인 형태가 그림 11 에 나와 있습니다.

15

응용프로그램을 만들다가 보면 두 가지 상황에 모두 직면하게 됩니다. 하지만 3D 프로그래머들은 interpolation 상황을 더 많이 만나게 되므로 이 문서에서는 interpolation 에 집중하도록 하겠습니다.

기본 적인 interpolation 의 예를 들면 다음과 같은 것들이 있습니다; piecewise constant interpolation, linear interpolation, polynomial interpolation, spline interpolation. 이 외에도 수많은 interpolation 이 존재합니다.

다음 섹션들에서는 몇 가지 interpolation 의 핵심 개념에 대해서 설명하고자 합니다.

그림 11. 유한 개의 점 집합으로 보간하는 예. 출처 : Interpolation, wikipedia.

2.1. Linear interpolation

Linear interpolation( 선형 보간 ) 은 lerp 라는 약자로도 잘 알려져 있습니다. 이것은 위에서 언급한 polygonal chain 의 line segment 상의 점을 만드는 데 사용할 수 있습니다.

두 개의 점 ( x0, y0 ) 와 ( x1, y1 ) 이 주어졌을 때, linear interpolation 은 이 점들 사이의

직선을 의미합니다. ( x0, x1 ) 사이의 값 x 에 대해, y 는 다음 항등식에 의해 주어진 직선 위에 존재합니다.

위의 식은 뭔가 복잡해 보이지만, 닮은꼴 삼각형의 비례식에 의해서 결정된 것입니다. 그림 13 을 참조하십시오.

위의 식을 y 에 관해 풀면 다음과 같습니다. 16

여기에서 보간은 ( x0, x1 ) 의 범위에서 수행됩니다. 그러므로 는 시작점과 끝점 사이에

존재하는( 직선 위에 존재하는 ) 어떤 점의 가중치라고 할 수 있습니다.

그림 12. 닮은꼴 삼각형.

이를 프로그래밍하기 쉽게하기 위해서는 함수 형태로 일반화를 할 필요가 있습니다(https://ko.wikipedia.org/wiki/%EC%84%A0%ED%98%95_%EB%B3%B4%EA% B0%84%EB%B2%95 참조 ).

두 점 p1, p2 에서의 데이터 값이 각각 f(p1), f(p2) 일 때, p1, p2 사이의 임의의 점 p 에서 데이터 값 f(p) 는 다음과 같이 계산될 수 있습니다.

2.2. Polynomial interpolation n + 1 개의 겹치지 않는 점이 주어졌을 때, 다항식 보간은 그 점들을 지나는 n 차 이하의 유일한 다항식을 찾는 것을 의미합니다.

17

식이 너무 단순해서 좀 이해하기 힘들 수 있습니다. 저 식은 단순한 정의입니다. 어떠한 점 xi 가 주어졌을 때 yi 를 산출하는 다항식 p 를 표현한 것입니다. 말은 어렵게 써져 있지만, "주어진 점들을 지나는 다항식 찾기" 가 다항식 보간입니다.

말이 보간이지 그냥 다항식을 만드는 것입니다. 그냥 "보간" 이라고 쓰고 "다항식" 이라고 읽는다고 생각하시면 됩니다. 예를 들어 wikipedia 의 어떤 글을 보면 텍스트는 "Newton interpolation" 이라고 써 놓고 링크는 "Newton polynomial" 로 연결해 놓는 경우를 볼 수 있습니다.

참고로 linear interpolation 은 n=1 일 때의 특수한 polynomial interpolation 입니다.

어쨌든 이러한 다항식 보간의 방법에는 매우 여러 가지가 있습니다; Method of undetermined coefficients( 미정 계수법 ), Newton interpolation( 뉴튼 보간법 ), Lagrange interpolation( 라그랑주 보간법 ). 우리가 나중에 살펴 보게 될 B-spline 이니 뭐니 하는 것들도 다 이러한 보간법의 일종이라고 할 수 있습니다.

2.3. Method of undetermined coefficients

Method of undetermined coefficients( 미정계수법 ) 는 말 그대로 정해지지 않은 계수의 값을 결정하는 방법을 이야기합니다. 구글링을 해 보면 상미분방정식이 어쩌고 저쩌고 하는데, 여기에서 저는 그냥 중고등학교 수준의 설명을 하도록 하겠습니다( 솔직히 이해를 못했습니다 ).

우리는 위에서 다항식을 다음과 같이 정의했습니다.

만약 다음과 같이 주어진 k + 1 개의 점을 알고 있다고 한다면, 각 점을 할당해서 연립방정식을 얻을 수 있습니다.

이제 k + 1 개의 미지수와 k + 1 개의 식이 있으니 연립방정식의 해를 구하면 됩니다.

18

하지만 점의 개수가 많아지면 이게 인간이 할 짓이 아닙니다. 프로그램으로 가우스 소거법 적용해야 하는데, 계산 비용이 장난이 아닙니다. 게다가 잘은 모르겠지만 오차도 크다고 합니다.

그래서 좀 더 계산이 단순하고 오차가 적은 보간 다항식을 필요로 하게 되었는데, 그것이 바로 Lagrange interpolation 과 Newton interpolation 입니다.

2.4. Lagrange interpolation

Lagrange polynomial( 라그랑주 다항식은 ) 은 주어진 점 집합을 위한 보간 다항식입니다. xj 가 겹치지 않는 k + 1 개의 점 집합이 다음과 같이 주어졌다고 합시다.

Lagrange form( 라그랑주 형식 ) 보간 다항식은 Lagrange basis polynomial 들에 대한 linear combination 입니다.

Lagrange basis polynomial 은 다음과 같이 정의됩니다.

처음에 겹치는 xj 는 없다고 가정했기 때문에 이며, 위의 식은 문제없이 정의됩니다.

혹시 기억이 잘 안 나는 분들을 위해서 언급하자면, Σ( sigma ) 는 요소들을 더하는 것이고, Π( pi ) 는 요소들을 곱하는 것입니다.

아마 식을 보고 바로 이해하시는 분들은 많지 않을 것 같습니다. 하지만 예제를 보면 좀 더 명확해 집니다.

다항식을 모르는 상태에서 ( 1, 1 ), ( 2, 4 ), ( 3, 9 ) 이라는 점들을 알고 있다고 합시다. 그런데 다음과 같은 문제가 나왔다고 합시다.

"세 점을 지나는 다항식을 구하시오."

매우 머리가 아파집니다. 이때 라그랑주 다항식을 써 먹을 수 있습니다.

19

위의 예제같은 경우에는 실제 함수가 f(x) = x2 인 경우입니다. 그렇다고 점 몇 개 가지고 완벽하게 함수를 다항식을 복구할 수 있다고 생각하시면 안 됩니다. 위의 예제는 우연의 일치일 뿐입니다.

예를 들어 f(x) = x3 의 경우에 나오는 점들을 가지고 라그랑주 보간법을 적용해 보십시오; ( 1, 1), ( 2, 8 ), ( 3, 27 ). 여러분은 6x2 - 11x + 6 이라는 결과를 얻게 될 것입니다. 2 차식이 나오는 이유는 3 개의 점을 사용했기 때문입니다. 그렇지만 그림 13 을 보면 거의 유사한 결과가 나오고 있음을 알 수 있습니다.

그림 13. 라그랑주 보간 결과. f(x) 는 원래 다항식, g(x) 는 보간 다항식.

라그랑주 보간은 원래 함수를 복구하는 방법이 아닙니다. 근사 함수를 만드는 방법입니다. 라그랑주 다항식의 결과는 어떤 샘플들을 가지고 작업을 하느냐에 따라서 다양해 질 수 있습니다. 그 점을 지나가는 유일한 다항식이 아니라는 의미입니다. 하지만 비교적 간단한 방법으로 빠르게 최소차수의 다항식을 구할 수 있기 때문에 많이 사용한다고 합니다.

20

그런데 이 라그랑주 보간법은 기존의 데이터에 새로운 점이 하나만 추가되어도 다항식을 다시 계산해야 하는 문제가 있습니다.

여기서 기억할 것은 "Lagrange form" 이라는 용어입니다. 위와 같은 형식으로 다항식이 써져 있다면 Lagrange form interpolation polynomial 이라는 것입니다. 당연히 나중에 언급할 Newton interpolation 에서도 "Newton form" 이라는 용어가 나옵니다.

2.5. Divided difference

Newton interpolation 을 이해하기 위해서는 먼저 divided difference( 분할 차분 )에 대해서 이해해야 합니다. 아래 내용은 [Chapter 05.03 Newton's Divided Difference Interpolation ] 참조해서 작성되었습니다.

아래 그림과 같이 4 개의 점이 주어졌을 때, y = f(x) 인 3 차 방정식을 구하고 싶다고 합시다. 최종적으로는 그림과 유사하게 보간해주는 3 차 방정식을 얻고 싶은 상황인 것입니다.

2.5.1. Linear interpolation

첫 번째 구간을 보간해 봅시다. 가장 쉽게 생각할 수 있는 것은 linear interpolant( 선형 삽간 함수 ) 를 이용해 점과 점을 이어야 합니다. Interpolant 라는 것은 점과 점 사이를 보간하기 위해서 사용되는 함수를 의미합니다.

(x0, y0 ) 과 (x1, y1) 사이에서 선형 보간 f1(x) 는 다음과 같습니다.

만약 x 가 x0 이라면, 다음과 같은 관계식이 성립합니다.

21

만약 x 가 x1 이라면, 다음과 같은 관계식이 성립합니다.

여기에서 b1 의 값을 구하면 다음과 같습니다.

b0 과 b1 의 값을 원래 식에 할당하면 최종 선형 보간식은 다음과 같습니다.

아래 그림과 같이 보간된 결과가 나오게 됩니다.

2.5.2. Quadratic interpolation

(x0, y0 ) 부터 (x2, y2) 사이에서 보간을 해 봅시다. 변곡점이 하나 있으니 quadratic interpolant( 2 차 삽간 함수 ) 의 형태여야 합니다.

세 점 사이의 2 차 보간 함수 f2(x) 는 다음과 같습니다.

만약 x 가 x0 이라면, 다음과 같은 관계식이 성립합니다.

만약 x 가 x1 이라면, 다음과 같은 관계식이 성립합니다.

22

여기에서 b0 의 값을 할당하면 b1 의 값은 다음과 같습니다.

만약 x 가 x2 라면, 다음과 같은 관계식이 성립합니다.

여기에 지겨운 반복은 건너 뛰고 b0 과 b1 을 할당하고 정리한 결론만 쓰겠습니다.

원래의 식에 b0, b1, b2 를 할당하면 최종 2 차 보간식은 다음과 같습니다.

보간 결과는 아래 그림과 같습니다.

2.5.3. Divided difference & General intepolation

23

여러 분은 위에서 어떤 규칙을 발견할 수 있었으리라 생각합니다. n + 1 개의 점이 주어질 때 다음과 같은 n 차 보간 함수를 만들 수 있습니다.

우리는 위에서 bn 이 특정 패턴에 의해서 결정된다는 것을 확인했습니다. 그런데 아래와 같이

식을 쓰는 것은 매우 고단한 작업입니다. 예상할 수 있겠지만 b3 만 되도 엄청난 양의 표현식이 필요합니다.

나중에는 식을 알아 보는 것도 불가능해지겠죠. 이 때문에 표현식을 단순화하기 위한 표기법이 필요합니다. 그것이 바로 divided difference( 분할 차분 ) 입니다. Difference( 차분 ) 는 함수 값의 차이를 의미합니다. 그리고 divided difference 는 특정 구간에서의 함수 값의 차이를 의미합니다.

이는 f[x] 의 형태로 표현되는데, 이 표현을 사용하면 각각의 계수는 다음과 같이 정의됩니다.

여기에서 m 번째 분할 차분은 다음과 같습니다.

이러한 정의를 통해서 cubic interpolant( 3 차 삽간 함수 ) 를 구하면 다음과 같습니다.

24

그림 14 는 분할 차분법의 개념을 가시화한 것입니다. 지금까지의 논의들을 정리하는데 많은 도움이 될 것이라 생각합니다.

그림 14. Cubic polynomial 에서의 분할 차분.

2.6. Newton interpolation

Newton polynomial( 뉴턴 다항식 ) 도 주어진 점 집합을 위한 보간 다항식입니다.

xj 가 겹치지 않는 k + 1 개의 점 집합이 다음과 같이 주어졌다고 합시다.

Newton form( 뉴턴 형식 ) 보간 다항식은 Newton basis polynomial 들에 대한 linear combination 입니다.

여기에서 Newton basis polynomial 은 다음과 같이 정의됩니다.

그리고 coefficient( 계수 ) 는 다음과 같이 정의됩니다.

25

여기에서 [y0, ..., yj ] 는 분할 차분에 대한 표기입니다. 보통 f[…] 형태로 쓰지만, f 를 붙이지 않고 쓰는 경우도 있다고 합니다.

위의 표현식들을 풀어서 보면 아래와 같습니다. 어디서 많이 본 것 같죠? 그렇습니다. Divided difference 를 다룰 때 이미 본 다항식입니다. 이러한 형태의 다항식을 Newton form 보간 다항식이라고 하는 것입니다.

여기까지 잠깐 정리하자면, 어떠한 삽간 함수들을 사용해서 보간 다항식을 만드느냐에 따라서 보간법의 이름이 바뀌는 것입니다.

이제 spline interpolation 이라는 것에 대해서 다룰 것인데요, 아마 눈치가 빠른 분들은 spline 이라는 삽간함수를 사용할 것이라는 예상을 하실 것입니다.

2.7. Problem of polynomial interpolation

이 섹션은 [ Chapter 05.05 Spline Method of Interpolation ] 를 참고하여 작성되었습니다.

다항식 보간은 n + 1 개의 점을 사용해 n 차 다항식을 찾아 내는 과정을 포함합니다. 앞에서 살펴 봤지만 이를 위해서는 라그랑주 다항식이나 뉴턴 다항식을 사용할 수 있습니다.

그런데 n 이 커지게 되면 그 결과로 나오는 다항식에서 진동( oscillatory )이 커집니다. Runge 는 다음 함수에 기반해 [-1,1] 의 데이터를 보간할 때 이 사실을 발견했습니다.

이 식을 plotting 하면 아래의 그림과 같습니다( 여담이지만 이 plot( 플롯 ) 은 연극의 plot 을 말하는 것이 맞습니다. Plot 은 사건의 논리적인 패턴과 배치를 말하는 것입니다. 수학에서는 graph 나 map 을 그리는 것을 의미합니다. 혹시라도 어떤 다항식의 결과를 출력하는 프로그램을 찾는다면, "graph visualizer" 같은 검색어를 선택하는 것은 좋지 않습니다. "function plotter" 로 검색하시는 것이 좋습니다. 아래 그림도 그런 검색어를 통해 나온 웹사이트에서 출력한 것입니다 ).

26

그림 15. y = 1 / ( 1 + 25x2)

여기에서 등거리에 존재하는 점 6 개를 선택해서 5 차 보간 다항식을 만들도록 하겠습니다.

x

-1.0 0.038461 -0.6 0.1 -0.2 0.5 -0.2 0.5 0.2 0.1 1.0 0.038461

중간과정은 생략하고 결과만 보면 다음과 같습니다.

이 보간식의 결과( 그림 16 )를 보면 원래의 형태와 심한 차이를 보인다는 것을 알 수 있습니다. 이 문제를 해결하기 위해서 더 많은 점들을 넣는 사람들도 있을 것입니다. 하지만 이것은 더 심하게 갈라지는 결과를 산출합니다. Runge 는 -1 < x < -0.726 과 0.726 < x < 1 의 구간에서 다항식의 값이 무한대가 된다는 사실을 발견했습니다( 그림 17 ).

이러한 문제를 해결하기 위해서 등장한 것이 바로 스플라인 보간법입니다. 스플라인 보간법의 가장 일반적인 형태는 linear spline, quadratic spline, cubic spline 입니다.

스플라인 곡선은 주어진 복수의 제어점을 통과하는 부드러운 곡선으로, 인접한 두 점 사이의 구간마다 별도의 다항식을 이용해서 곡선을 정의합니다. 27

그림 16. 붉은색은 f5 의 결과.

그림 17. 다른 고차 다항식들과의 비교.

2.8. Spline interpolation

28

이 섹션은 [ Natural cubic spline ] 과 [ Lecture 19 Polynomial and Spline interpolation ], [ Cubic Spline Interpolation ], [ Cubic Spline Interpolation ]을 참조하여 작성되었습니다.

Polynomial interpolation 은 고차 다항식을 만들 때 진동 문제가 발생한다는 것을 이전 섹션에서 확인했습니다( Runge 의 예제 ). 이 문제를 해결하는 하나의 방법은 구간별로 보간을 수행하는 것입니다. 이것을 스플라인 보간법이라고 합니다.

스플라인이라는 것은 원래 고무 자( elastic ruler )로 여러 개의 미리 정의된 점( knot )들을 통과하면서 구부러져 있습니다. 이는 조선( shipbuilding ) 을 위한 technical drawing( 기술 도안 ) 을 위해서 사용되었으며 손으로 만들어졌습니다.

그림 18. Spline. 출처 : Flat spline, wikipedia.

n + 1 개의 knot 들, { ( xi, yi ) | i = 0, 1, …, n } ,에 의해 만들어진 고무 자를 수학적으로

모델링하기 위한 접근은 모든 { ( xi-1, yi-1 ), ( xi, yi ) } 쌍을 다항식 y = qi( x ), i = 1, 2, …, n 으로 보간하는 것입니다.

만약 1 차 다항식을 사용한다면, 그 결과는 [ 2.5.1. Linear interpolation ] 의 결과와 동일하며, 이것은 polygonal chain 을 형성합니다.

2.8.1. Cubic spline interpolation

[ a, b ] 구간에서 k 차 스플라인 함수 S( x ) 를 정의하면 다음과 같습니다. C 기호는 연속성( continuity )을 의미하는 것으로 몇 개의 구간에서 연속성을 가지느냐를 의미합니다. 이것에 대해서는 [ 2.8.3. Continuity ] 에서 다루도록 하겠습니다.

29

이것을 좀 더 풀어서 다항식의 형태로 나타내면 다음과 같습니다.

그리고 각 구간에서 다음을 만족합니다.

이전 구간의 끝 점과 현재 구간의 시작 점( knots )의 위치, 1 계 도함수, 2 계 도함수가 동일하다는 것은 커브가 연속성을 가진다는 것을 의미합니다.

이제 일반적인 정의를 끝냈으므로 실제로 다항식을 만들어 보도록 하겠습니다.

" 이 주어졌을 때,

cubic spline ineterpolant( 3 차 스플라인 삽간함수를 ) 를 구하시오."

우리는 n 개의 구간을 가지고 있고, 각 구간에서 삽간함수는 3 차 다항식으로 4 개의 계수( coefficient )를 가집니다. 이 때 연립방정식을 이용해 계수를 구하려면 총 4n 개의 방정식을 가지고 있어야 합니다.

우리는 각 구간의 시작점과 끝점에서 다항식의 값이 다음을 만족한다는 것을 알고 있습니다.

여기에서 다음과 같은 결과를 얻을 수 있습니다.

구간이 n 개이니 이러한 식은 2n 개가 나옵니다. 다음으로 1 계 도함수와 2 계 도함수는 다음과 같습니다.

30

그러므로 x1, x2, …, xn-1 인 knot 들에서 커브의 연속성 조건에 의해 다음과 같은 관계가 성립합니다.

이러한 조건이 2( n - 1 ) 개가 나옵니다. 현재까지 4n - 2 개의 식이 나왔습니다.

마지막으로 커브의 양 끝점들과 관련한 식을 얻을 수 있습니다. 이것을 얻는 데는 보통 두 가지 방식이 있습니다; natural( or simple ) boundary condition 과 clamped boundary condition.

Natural boundary condition 은 끝점에 대한 2 계 도함수가 알려져 있을 때 사용합니다. 해당 점에서의 기울기의 변화량이 0 이므로 자연스럽게 계속 연결되는 곡선이 있는 것처럼 보이는 방식인 것으로 보입니다. 정확하게는 잘 모르겠습니다.

그리고 clamped boundary condition 은 다음과 같습니다. 이는 끝점에 대한 1 계 도함수가 알려져 있을 때 사용합니다.

일반적으로 natural boundary condition 을 사용해서 스플라인을 구하는 것으로 보입니다.

어쨌든 우리는 4n 개의 식을 얻었으며, 4n 개의 계수( 미지수 )의 값을 결정하기 위해서 연립방정식을 풀 수 있습니다.

2.8.2. Solving natural cubic spline

이제 natural cubic spline 을 계산하는 방법을 알아 보겠습니다.

에 대해 라고 합시다. 이기 때문에, 우리는

이라 할 수 있습니다. 하지만 다른 들은 미지수입니다.

단순화를 위해서 라고 표기하도록 하겠습니다.

는 범위 내의 3 차 다항식이므로, 이 구간에서 는 선형( 1 차 ) 다항식입니다. 선형 스플라인( polygonal chain )과 유사하게, 다음과 같이 쓸 수 있습니다.

31

(2.8. 1)

여기에서 이며, 이것은 의 기울기입니다.

우리는 식 (2.8. 1) 을 다음과 같이 정리할 수 있습니다.

(2.8. 2)

그러므로 우리가 를 가지고 있다면 스플라인의 2 계 도함수인 를 쉽게 계산할 수 있습니다. 그러나 우리는 스플라인에 관심을 가지는 것이지 그것의 2 계 도함수에 관심을 가지는 것은 아니기 때문에, ( 2.8. 2 ) 를 두 번 적분해서 다음을 획득합니다:

(2.8. 3)

여기에서 와 는 임의의 적분 상수입니다.

와 를 풀기 위해서, 와 이라는 조건을 사용합니다. 이는 다음과 같이 결정됩니다:

그러므로 우리가 를 가지고 있다면 (2.8. 3 ) 의 식을 사용해서 스플라인을 계산할 수 있습니다.

에 대해 를 계산하기 위해서, 우리는 마지막 선형성 조건을 사용할 필요가

있습니다: . 식 ( 2.8. 3 ) 에서 의 도함수를 취함으로써 우리는 다음을 얻게 됩니다:

여기에서 입니다.

그러므로 이 조건은 다음의 결과를 줍니다:

32

그러므로 우리가 ( 에 대해 ) 를 구하기 위해서 해야 할 일은 trigonal linear system of equation 을 푸는 것입니다.

이제 를 계산했으므로, 우리는 주어진 x 와 x 가 놓인 구간에 대한 S( x ) 를 평가할 수 있습니다. 그림 19 는 캐나다 인구를 스플라인을 통해 보간한 결과를 보여 줍니다.

그림 19. 캐나다 인구.

3. Parametric equation & continuity

33

3.1. Parametric equation

프로그래머가 커브를 구현하기 위해서는 일반적인 다항식을 사용하는 것은 불편합니다. 왜일까요?

아주 간단한 예를 들어 보도록 하겠습니다. 우리는 원을 다음과 같이 정의합니다.

"어떤 점( 중심 )에서 등거리에 있는 평면 위의 점들의 집합"

그러면 이를 위한 공식이 필요합니다. 유클리드 기하학에서는 원을 다음과 같이 정의합니다( 귀찮으니 그냥 중심이 원점이라고 가정하겠습니다 ).

여러 분은 이것을 어떻게 화면에 그리겠습니까?

일단 프로그래머 관점에서는 함수가 필요하므로 이를 함수로 바꾸도록 하겠습니다. 일단 x 에 대한 다항식을 만들어야겠죠.

참 뿌듯합니다. 그런데 이걸 실제로 써 먹을 수 있나요?

여기에서 함수의 정의를 다시 떠 올려 봅시다.

"함수는 입력 집합과 출력 집합의 관계를 의미합니다. 그런데 각 입력은 정확하게 하나의 출력과 연결되어야만 합니다."

그림 20. 함수 f 를 도식화.

34

그런데 우리가 만든 f(x) 는 두 개의 출력값과 연결되고 있습니다. 그러므로 우리는 이것을 함수라고 부를 수가 없습니다. 좀 더 전문적으로(?) 들어 가면 이러한 형태를 음함수( implicit function )라고 부르기는 합니다.

이를 함수로 사용하기 위해서는, 출력이 겹치지 않게 함수를 구간으로 나눠야 합니다. 위의 원의 경우에는 음수값이 나오는 구간과 양수값이 나오는 구간이 되겠습니다. 즉 f(x) 와 g(x) 로 나누는 것입니다.

이러면 입력과 출력이 하나인 개별 함수들이 됩니다.

이를 프로그램으로 작성하면 코드 1 처럼 두 번의 loop 을 돌면서 그릴 수 있습니다. 성능은 O( N ) 입니다.

1 int radius = static_cast< int >( r ); 2 3 for( int x = -radius; x <= radius; ++x ) 4 PaintBlack( x, f(x) ); 6 7 for( int x = -radius; x <= radius; ++x ) 8 PaintBlack( x, g(x) ); 코드 1. 음함수로 원 그리기.

또 다른 방법도 있습니다. 반지름이 r 이므로 이것이 차지하는 범위가 x 축으로 [ -r, r ] 만큼 y 축으로 [ -r, r ] 만큼은 안 넘어 갈 것입니다. 그러면 코드 2 처럼 한 라인씩 스캔해 가면서 그릴 수 있습니다. 성능은 O( N2 )입니다.

1 int radius = static_cast< int >( r ); 2 3 for( int y = -radius; y <= radius; ++y ) 4 { 5 for( int x = -radius; x <= radius; ++x ) 6 { 7 if( IsOnCircle( x, y ) ) 8 PaintBlack( x, y ) 9 } 10 } 코드 2. 스캔라인 방식으로 원 그리기.

원의 안쪽이 비어 있기 때문에, 코드 1 처럼 그리게 되면 원이 커질수록 부하가 심해집니다. 중첩된 loop 을 돌고 있기 때문에 엄청난 비용이 들 수 있습니다.

35

또 다른 방법은 매개변수 방정식( parametric equation )을 사용하는 것입니다. 매개변수 방정식은 매개변수( parameter )라고 불리는 변수를 사용해서 원래 방정식의 미지수 값을 찾아 냅니다. 보통 시간이나 비율을 매개변수로 사용합니다.

이 매개변수 방정식을 사용하면 원래 방정식 해 중의하나를 출력값으로 결정하게 됩니다. 원의 경우를 예로 들어 보도록 하겠습니다. 각도의 관점에서 원을 생각해 보도록 하겠습니다.

여기에서 매개변수 방정식은 다음과 같습니다( 간단한 삼각함수 표현이니 따로 설명은 하지 않겠습니다 ).

이 매개변수 방정식을 사용해서 원을 그리는 것은 코드 3 과 같습니다. 이것의 성능은 O( N )입니다.

1 int samples = N; 2 3 for( int i = 0; i <= samples; ++i ) 4 { 6 float angle = 2π / static_cast< float >( samples ); 7 PaintBlack( r * cos( angle ), r * sin( angle ) ); 8 } 코드 3. Parametric equation 으로 원 그리기.

이 경우에는 x 축과의 각도를 매개변수로 사용해서 ( x, y ) 의 위치를 계산하고 있습니다. 이러한 매개변수 방정식을 사용하면 특정 시간에 위치를 찾는다든가 하는 작업을 할 수도 있습니다. 그리고 음함수와는 다르게 하나의 출력값과 매핑되기 때문에 함수를 만드는 것도 용이합니다.

36

그래서 컴퓨터 그래픽스에서는 매개변수 방정식을 사용해서 기하도형들을 표현하는 경우가 많습니다. 이런 표현은 미분 같은 데서도 자주 사용합니다.

매개변수화( parameterization )는 유일하지 않습니다. 그것은 매개변수 방정식을 만드는 사람의 의에 영향을 받습니다. 예를 들어 같은 line 을 정의하기 위해서 다음과 같은 형태들이 존재할 수 있습니다.

첫 번째 식은 p0 에서 시작해 p1 으로 움직이는 형식을 보여 주고, 두 번째는 중심을 기준으로 앞뒤로 움직이는 형식을 보여 줍니다. 그러나 결국에는 같은 라인상에서 움직이게 됩니다.

3.2. Parametric continuity

이 섹션은 [ Parametric Continuity ]를 참고하여 작성되었습니다.

앞에서 여러 개의 점이 주어질 때 구간별로 보간을 수행하는 것이 스플라인이라고 이야기했습니다. 그리고 당연하게도 연속성이 보장된다는 전제를 들었는데요, 사실은 구간별로 보간다항식을 만든다고 해서 연속성이 항상 보장되는 것은 아닙니다.

앞서 봤던 cubic spline interpolation 은 그 정의에서부터 continuity 를 포함하고 있습니다.

여기에서 이라는 표기가 연속성을 의미합니다. cubic spline interpolation 은 3 차 다항식이므로 k = 3 이며, 즉 를 만족하는 보간 다항식을 만들어야 한다는 의미입니다.

여기에서 Ck 를 parametric continuity( 매개변수 연속성 ) 라 부릅니다. 그런데 이 parametric continuity 라는 것은 무엇일까요?

이것은 parametric curve 에 적용되는 개념으로, curve 상에서 매개변수 값들에 대한 smoothness 를 기술합니다. 만약 커브를 통과하는 값의 연속성이 라면 커브는 Cn 연속성을

가졌다고 말할 수 있습니다.

쉽게 말해 미분을 몇 번해야 값이 달라지냐의 문제입니다. 이것을 order of continuity( 정확한 한글 용어는 뭔지 모르겠지만 '연속성 차수' 라 하겠습니다 ) 라고 부릅니다. 일반적으로 다음과 같은 차수가 있습니다.

37

Order Desc C-1 두 구간이 완전히 벌어져 있는 경우입니다. 두 구간이 만났지만, 연속성이 없는 경우입니다. 이것을 Positional Continuity 라 부르기도 합니다.

C0

이 경우에는 다음과 같은 관계가 성립합니다.

두 구간이 만났고, 1 계 도함수가 연속성이 있는 경우입니다. 이것을 Tangential Continuity 라 부르기도 합니다. Tangent 는 만나는 점에서의 기울기입니다.

C1

이 경우에는 다음과 같은 관계가 성립합니다.

두 구간이 만났고, 2 계 도합수까지 연속성이 있는 경우입니다. 이것을 Curvature 2 C Continuity 라고 부르기도 합니다. Curvature 는 tangent 의 변화율입니다.

38

이 경우에는 다음과 같은 관계가 성립합니다. 우리가 cubic spline interpolation 에서 봤던 형태입니다.

일반화된 연속성입니다. 점이 이어져 있으며, n 계 도함수까지 연속성이 있는 Cn 경우입니다.

이것의 차이를 정리한 그림이 아래에 나와 있습니다.

그림 21. Cn 그래프 비교. 출처 : Curves and Surface.

39

위에서 예제로 보여 준 커브들은 나중에 알아 보게 될 Bézier 커브들입니다. 우리가 cubic spline interpolation 을 다룰 때는 C2 라고 가정하고 다항식을 만들었지만, Cn 을 어떻게 정하느냐에 따라 커브의 모양이 달라 질 수 있음을 이해해야 합니다.

3.3.Geometric Continuity

이 글은 [ Geometric continuity ] 를 참고하여 작성되었습니다.

Geoemtric continuity( 정확한 한글 용어는 몰라서 그냥 "기하학적 연속성"이라 표기 ) 는 음함수( implicity function )의 연속성을 의미합니다.

기하학적 연속성은 4 개의 conic section( 원뿔 곡선 ) 들과 연관되어 있습니다. Cone 을 어떤 plane 으로 잘라 내면 그림 22 와 같이 다양한 형태의 shape 이 생깁니다; 원( circle ), 타원( ellipse ), 포물선( parabola ), 쌍곡선( hyperbola ).

그림 22

그런데 타원은 원에 대해서 eccentricity( 이심률 )이 0 에 접근하는 경향이 있고, 포물선에 대해서 이심률이 1 에 접근하는 경향이 있습니다. 그리고 쌍곡선은 포물선에 대해서 이심률이 1 로 떨어지는 경향이 있습니다. 또한 쌍곡선은 라인과 겹치기도 합니다. 즉 원뿔 곡선들 사이에는 연속성이 존재합니다. 이러한 아이디어들이 다른 연속성 개념으로 이어졌습니다. 이것이 그림 23 에 나와 있습니다.

예를 들어, 만약 원과 직선이 같은 모양에 대한 두 개의 표현식이라면, 아마도 라인은 무한한 반지름을 가진 원으로 생각될 수도 있을 것입니다. 그러한 경우라면 x = ∞ 인 점이 원의 점이 되도록 허용함으로써 라인을 닫힌 형태로 만들고, x = +∞ 와 x = -∞ 에 대해서도 동일할 것입니다. 그런 아이디어는 현대의 대수적으로 정의된 함수의 연속성 및 ∞ 에 대한 아이디어를 이끌어 내는 데 도움이 되었습니다.

커브나 서피스( surface ) 는 Gn 연속성을 가졌다고 기술될 수 있는데, 이 n 은 smoothness 의 척도를 증가시킵니다. 커브상의 한 점 양쪽의 세그먼트들을 생각해 봅시다.

40

Order Desc G0 두 구간이 만났지만, 연속성이 없는 경우입니다. G1 두 구간이 만났고, 접점에서 tangent 를 공유하는 경우입니다. G2 두 구간이 만났고, 접점에서 곡률 중심을 공유하는 경우입니다.

그런데 어디선가 많이 들어 봤다 싶은 정의들입니다. Parametric continuity 와 정의가 비슷합니다. 일반적으로 커브가 Cn 연속성을 가지기 위해서 reparameterized 되었다면, Gn 연속성이 존재합니다. 커브에 대한 reparameterization 은 원래의 것과 기하학적으로 동일합니다; 단지 매개변수에 영향을 끼칠 뿐입니다.

그림 23. 은 G2 연속성을 가진 원뿔 곡선들을 정의합니다 p 는 고정되어 있고, ε 는 가변적입니다 ( ε=0 이면 원, ε=0.8 이면 타원, ε=1 이면 포물선, ε=1.2 면 쌍곡선 )

연속성에 관한 것을 좀 더 잘 이해할 수 있게 해 주는 예제 그림들이 있습니다.

41

4. Bé zier curve

이 문서는 [ Bézier curve ] 와 [ CHAPTER 1 Splines and B-splines an Introduction ] 을 참고해서 작성되었습니다.

Bézier( 베지에 ) curve 는 커브에 대해서 잘 모르는 사람들에게도 가장 많이 알려진 커브입니다. 저도 딴 커브는 몰라도 베지에 커브에 대해서는 많이 들어 봤었습니다.

이 베지에 커브는 여러 분야에서 사용되고 있습니다; Adobe Illustrator, CorelDraw, Inkscape 와 같은 벡터 그래픽스 저작도구. PostScript, Asymptote, MetaFont, SVG 와 같은 벡터 그래픽스 시스템. Adobe Flash, Synfig 와 같은 애니메이션 저작 도구.

베지에 커브는 맨 처음 언급했던 convex combination 와 관련이 있습니다. 스플라인이 아닌 다항식 보간을 사용하면, 점에서 많이 벗어난 위치에서 다음과 같은 리본이 생길 수 있습니다.

앞에서 커브를 만들기 위한 다항식들은 특정 basis function 에 대한 linear combination 의 형태를 띠고 있는 것을 볼 수 있었습니다. 그런데 베지에 커브는 이에서 더 나아가 convex combination 을 요구합니다.

42

기억을 되돌려 보면, convex combination 은 linear combination 에 사용되는 계수의 총합이 1 인 경우를 의미합니다. 즉 닫힌 공간 안에 존재한다는 것을 의미합니다. 베지에 커브를 살펴 보면서 그것이 어떤 제약을 만드는지 살펴 보도록 하겠습니다.

4.1. Linear Bé zier curve

c0 과 c1 이 주어졌을 때 선형 베지에 커브는 다음과 같이 정의됩니다.

어디에서 많이 본 식입니다. Alpha-blending 이죠. 위의 식은 c0 과 c1 의 linear combination 을 의미합니다. 그런데 계수를 더하면 ( 1 - t ) + t = 1 이네요. 그러므로 convex combination 입니다.

만약 convex combination 이 아니었다면 B(t) 의 결과는 c0 과 c1 을 지나는 전체 직선을

의미했겠지만, convex combination 으로 정의되었기 때문에 B(t) 의 결과는 항상 c0 과 c1 사이에 존재하게 됩니다.

4.2. Quadratic Bé zier curve

이제 익숙해졌겠지만, quadratic 이면 2 차 다항식을 의미합니다. 점이 3 개가 주어졌으니 2 차식을 만들 수 있겠죠.

평면상에 c0, c1, c2 라는 세 점을 가지고 있고 주어진 점들에 대한 convex combination 을 통해 우리는 부드러운 커브를 만들 수 있습니다. Polynomial curve 를 사용하면 이것이 동작하지 않습니다. 왜냐하면 두 라인 세그먼트가 서로 다른 간격을 가지고 있기 때문입니다. 자연스러운 해결책은 두 라인 세그먼트를 같은 간격으로 정의하는 데서 시작합니다. 말하자면 [ 0, 1 ] 구간입니다. 단순화하면 다음과 같습니다.

이제 convex combination 을 실행하는데 문제가 없는 상태가 됩니다.

43

이것의 생성 과정을 도식화하면 다음과 같습니다.

커브가 그려지는 과정을 보고 싶으시다면, https://en.wikipedia.org/wiki/B%C3%A9zier_curve#Quadratic_curves 를 보시면 됩니다.

여기서도 마찬가지로 convex combination 때문에 커브는 세 점이 이루는 삼각형 내부에서 정의된다는 것을 알 수 있습니다.

만약 여기에서 우리가 명시적 표현식을 두 라인에 대해서 삽입한다면 다음과 같은 결과를 얻을 수 있습니다.

(식 4. 1)

이것은 2 차 베지에 커브라 불립니다; 점 는 커브의 control point 라 불리며, control point 들을 연결하는 piecewise linear curve 는 커브의 control polygon 이라 불립니다. Control point 들을 곱하는 다항식들은 2 차 번스타인 다항식( quadratic )이라 불립니다. 이것의 예가 아래 그림에 나와 있습니다.

커브는 t = 0 에서 c0 이고 t = 1 에서 c2 입니다. 이는 b0,2(0) = 1 이고, b1,2(0) = b2,2(0) =

0 이고, 이와 유사하게 b2,2(1) = 1 이고 b0,2(1) = b1,2(1) = 0 이라는 것을 관찰함으로써

44

대수적으로 검증될 수 있습니다. c0 에서 c1 까지의 라인은 t = 0 에서의 커브에 대한

탄젠트( tangent )의 방향과 비슷합니다. 반면에 c1 에서 c2 까지의 라인은 t = 1 에서의 커브에 대한 탄젠트의 방향과 비슷합니다. 이러한 관찰은 미분 공식에 의해 확정될 수 있습니다.

(식 4. 1) 의 세 개의 항의 합은 1 입니다.

그리고 t 는 [ 0, 1 ] 구간에서 변하므로, 우리는 i = 0, 1, 2 에 대해서 을 얻게

됩니다. 이는 p2,2(t) 가 세 점 에 대한 convex combination 이라는 것을 결정합니다. 이것의 기하학적 해석은 커브가 세 점이 이루는 convex hull 인 삼각형 내부에 존재한다는 것입니다.

4.3. Cubic Bé zier curve

2 차 베지에 커브의 생성 과정은 어떤 차수의 다항식과 어떤 개수의 점들에 대해서도 자연스럽게

일반화될 수 있습니다. 만약 4 개의 점 을 가지고 있다면, 우리는 두 2 차 커브의 가중 평균을 취함으로써 3 차 베지에 커브를 만들 수 있습니다.

이는 명시적 표현식으로 나타내면 다음과 같습니다.

이것의 생성 과정은 아래 그림에 나와 있습니다.

45

아래 그림은 3 차 베지에 커브의 예를 보여 주고 있습니다. 그림에서 리본 모양이 생기기는 하지만 커브 자체는 네 점이 생성하는 convex hull 인 사각 형 안 쪽에 있는 것을 알 수 있습니다.

그림 24. 3차 베지에 커브.

3 차 베지에 커브가 생성되는 과정이 아래 그림에 나와 있습니다.

d 차 베지에 커브를 생성해 봅시다. 우리가 d + 1 개의 control point 를 가지고 있을 때, 최종적인 베지어 커브는 d - 1 차 베지에 커브에 대한 convex combination 으로 이루어집니다.

만약 이것을 확장하면, 귀납적 논증( inductive argument )에 의해 다음을 얻을 수 있습니다.

46

여기에서

입니다.

다항식 집합은 d 차 다항식의 공간을 위한 기저가 됨이 밝혀졌고, 그것은 번스타인 기저( Bernstein basis )라고 불립니다.

2 차의 경우와 마찬가지로 우리는 다음과 같은 결과를 얻게 됩니다.

그리고 [ 0, 1 ] 구간의 모든 t 에 대해 입니다. 결국 pd,d(t) 는 점 가 이루는 convex hull 내에 존재합니다. 커브는 첫 번째와 마지막 control point 들을 보간합니다.

동시에 t = 0 에서의 탄젠트는 c0 에서 c1 으로 가는 방향에 있고, t = 1 에서의 탄젠트는 cd-1

에서 cd 로 가는 방향에 있습니다.

2 차 및 3 차의 경우와 마찬가지로, 점으로 control point 를 사용하는 piecewise linear curve 는 커브의 control polygon 이라 불립니다.

베지에 커브상의 점을 계산하는 데 포함된 완전한 계산식은 다음과 같습니다.

d 를 양의 정수라 하고 d + 1 개의 점 이 주어졌다고 합시다. d 차 베지에 커브 p0,d 상의 점 pd,d(t) 는 다음 계산식에 의해서 결정됩니다. 먼저 i = 0, 1, ..., d 에 대해서 pi,0(t)

= ci 라 하면, pd,d(t) 는 다음과 같이 계산됩니다.

여기에서 i = r, ..., d 이고 r = 1, 2, ..., d 입니다.

5 차 베지에 커브의 예가 아래 그림에 나와 있습니다.

47

그림 25. 5차 베지에 커브.

우리는 [ 0, 1 ] 구간에서 베지에 커브를 정의해 왔지만, 어떠한 비어 있지 않은 구간도 작동 가능합니다. 만약 구간이 [ a, b ] 라고 한다면, 우리는 다음과 같은 형태로 convex combination 을 사용해야만 합니다.

대신에, 동일한 표현으로 우리는 매개변수에 대한 선형 변환을 사용할 수 있습니다; 만약 pd,d(t) 가 [ 0, 1 ] 구간의 베지에 커브라고 한다면,

은 [ a, b ] 구간의 베지에 커브입니다.

고차 베지에 커브가 그려지는 과정을 보고 싶으시다면, https://en.wikipedia.org/wiki/B%C3%A9zier_curve#Higher-order_curves 를 보시면 됩니다.

4.4. Composite Bezier curve

베지에 커브는 다음과 같은 문제점을 가지고 있습니다.  4 차 이상의 고차 다항식들은 복잡하고 계산부하가 높습니다.  복잡도가 올라 가면서, 고차 다항식은 round-off error 에 민감해집니다.  주어진 데이터 집합들 사이의 관계와 커브의 모양이 비직관적이 됩니다.

결국 성능, 결과의 정확성, 편의성, 직관성에서 문제가 발생합니다. 그래서 보통은 2 차나 3 차 다항식을 여러 개의 구간으로 나누어서 처리를 하는 형태를 띠는데요, 다음과 같은 식으로 결합될 수 있습니다.

48

그림 26. composite Bezier curve.

보시면 알겠지만, 이전 구간의 끝점이 다음 구간의 시작점과 이어지는 형태입니다. 그런데 그 다음 구간의 형태에 따라서 연속성이 보장될 수도 있고 그렇지 않을 수도 있습니다. 결국 compsite Bézier curve 는 C0 만을 보장합니다.

n 개의 세그먼트로 구성된 d 차 베지에 커브는 n 개의 control point set 을

사용합니다. 각 세그먼트들은 [ 0, 1 ] 사이에서 정의되도록 하는 것이 일반적이지만, 세그먼트 i 의 범위가 [ i - 1, i ] 로 정의되도록 해서 커브가 [ 0, n ] 범위에서 정의되도록 만드는 것도

가능합니다. 세그먼트를 붙이기 위해서 control point 를 적절히 조정하기 위해서는 으로 만들어서 i - 1 세그먼트와 i 세그먼트가 연속적으로 만나도록 합니다. 그것이 그림 24 에 나와 있습니다. 탄젠트를 접점에서 연속적으로 만듦으로써 결합을 더 부드럽게 할 수 있습니다. 그림 26 의 (b) 에서는 그 예를 보여 줍니다. 이는 다음을 통해서 가능합니다.

2 차 베지에 커브는 TrueType 폰트 기술의 기반을 형성하며, 3 차 베지에 커브는 PostScript 와 Adobe Illustrator 와 같은 그리기 프로그램들의 심장입니다. 다음 그림은 복잡한 베지에 커브의 예를 보여 줍니다. 그것은 Postscript 폰트인 Times Roman 의 문자 S 입니다.

49

5. Spline Curve

이 섹션은 [ CHAPTER 1 Splines and B-splines an Introduction ] 를 참고하여 작성되었습니다.

앞에서 spline 에 대해서 다뤘지만, 거기에서는 연속성 문제가 어떤 식으로 해결되었는 지에 대해서 자세히 다루지는 않았습니다. 이 섹션에서는 스플라인이라는 것이 어떤 식으로 생성되는지 알아 보도록 하겠습니다.

베지에 커브의 단점은 각 구간을 구성하는 다항식들 간에 smoothness 가 존재하지 않는다는 것입니다. 그림 24 를 보면 알겠지만, 구간별로 보간을 수행해도 연속성은 보장되지 않습니다. 연속성을 보장하려면 control point 를 잘 선택해야만 합니다.

그런데 베지에 커브를 생성하는 과정을 약간 손보면 다항식들의 연속성을 자동으로 보장할 수 있음이 밝혀졌습니다. 이러한 piecewise polynomial curve 를 스플라인 커브라 부릅니다.

5.1. Linear spline curve

스플라인 커브의 생성 과정 역시 반복된 평균에 기반합니다. 그러나 우리는 베지에 커브를 약간

일반화할 필요가 있습니다. 그것은 선형 보간을 통해서 이루어집니다. 우리가 두 개의 점 c1 과 c2 를 가지고 있다고 하면, 우리는 직선을 다음과 같이 표현할 수 있습니다.

기존에는 선형 보간식을 쓸 때 제어점과 같은 인덱스를 붙였는데, 여기에서는 다른 인덱스를

붙이고 있습니다. 그 이유는 나중에 밝혀지니 그냥 그러려니 하시면 됩니다. t2 = 0 그리고 t3 = 1 로 설정하면, 우리는 선형 베지에 커브를 얻을 수 있습니다.

몇 개의 점 에 기반하는 piecewise linear curve 는 매우 명확합니다; 우리는 단지 이웃하는 점들의 쌍을 그냥 직선으로 이어 주기만 하면 됩니다. 더 구체적으로 이야기하면,

우리는 이며 인 n 개의 를 선택하고, 커브 f 를 다음과 같이 정의합니다.

은 커브의 control point 라 불립니다. 컨트롤 포인트에서 매개변수 t = 는 커브의 knot 혹은 knot vector 라 불립니다.

50

만약 piecewise constant function 이 다음과 같이

로 정의되었고,

로 설정되었다면, 우리는 f(t) 를 좀 더 간결하게 다음과 같이 작성할 수 있습니다.

이는 고차원의 부드러운 piecewise polynomial curve 를 생성하기 위해서 일반화될 수 있습니다.

5.2. Quadratic spline curves

2 차 베지에 커브의 정의에서, p2,2(t) 는 세 개의 평균을 취함으로써 결정되는데, 가중치는 1 - t 와 t 입니다. 왜냐하면 두 라인 세그먼트와 2 차 커브 자체가 [ 0, 1 ] 구간에 대해서 정의되었기 때문입니다. 스플라인 함수는 다항식 보간과 베지에 커브의 하이브리드입니다. Convex combination 은 유지하지만, 좀 더 일반화된 가중치 평균을 사용합니다.

세 개의 control point 에 기반해 스플라인 커브를 생성하기 위해서, 우리는 네 개의 knot

을 도입하는데, 라는 가정을 깝니다. c1 과 c2 를 잇는 라인을

에 대해 로 표현합니다. 그리고 c2 와 c3 를 잇는 라인을

에 대해 로 표현합니다. 라인 세그먼트에 대한 표현에서 다른 knot 을 선택함으로써 구간 [ t3, t4 ] 는 양쪽 세그먼트의 정의역에 모두 포함됩니다. 이는 두 라인 세그먼트가 2 차 커브를 형성하기 위해서 convex combination 으로 조합될 수 있도록 보장해 줍니다.

여기에서 t 는 [ t3, t4 ] 구간에서 움직입니다. 물론 p 가 t 내의 다항식이기 때문에 t 가 전체 실수 영역에서 움직이도록 놔둡니다. 그러나 세 개의 결합은 더 이상 전체 convex 에 포함되지

않습니다. 그것을 그림 25 가 보여 주고 있습니다. 만약 t2 = t3 = 0 이고 t4 = t5 = 1 이라면 베지에 커브와 다를 것이 없습니다.

51

그림 27. 2차 스플라인 커브의 생성.

베지에 커브처럼 우리는 주어진 점들을 control point 라 부르고, 이웃한 control point 들을 연결함으로써 획득한 piecewise linear curve 는 control polygon 이라 부릅니다.

4 개의 knot 을 사용함으로써 우리는 부드러운 piecewise linear curve 를 얻게 됩니다. 그리고 충분히 많은 control point 와 knot 들을 포함함으로써 거의 모든 종류의 모양에 대한 커브를

만들 수 있습니다. 우리가 n 개의 control point 와 일련의 knot 들을 가지고 있는데, t2 = t3

이고 tn+1 = tn+2 를 허용하는 것만 빼면 knot 들은 증가하고 있다고 가정합시다. 우리는 2 차 스플라인 커브를 다음과 같이 정의할 수 있습니다.

n = 4 일때의 예제가 다음 그림에 나와 있습니다. (a) 는 [ t3, t4 ] 부분이고 (b) 는 [ t4, t5 ]

부분입니다. (c) 는 두 개의 커브를 같은 plot 으로 가지고 온 것입니다. 그것은 t4 에서 부드럽게 만다는 커브인 것으로 보입니다.

52

이전에 언급한 piecewise constant function 을 사용함으로써 우리는 다음과 같이 커브를 작성할 수 있습니다.

2 차 스플라인 커브의 예가 다음 그림에 나와 있습니다. 그림 24 의 3 차 베지에 커브와 같은 control point 를 사용함에도 불구하고 훨씬 부드럽고 control polygon 에 더 근접하는 결과가 나오는 것을 확인할 수 있습니다.

5.3. Spline curves of higher degrees

스플라인 커브의 생성은 더 많은 평균을 생성함으로써 임의의 차수의 다항식으로 일반화될 수 있습니다. 3 차 스플라인 세그먼트는 4 개의 control point 와 6 개의 knot 을 요구합니다.

커브는 두 개의 2 차 세그먼트에 대한 평균입니다.

수식 1

여기에서 t 의 범위는 [ ti, ti+1 ] 입니다. 두 개의 2 차 세그먼트는 각각 [ ti-1, ti+1 ] 과 [ ti, ti+2 ] 구간에서 1 차 세그먼트들에 대한 convex combination 을 수행한 것에 의해 주어집니다.

그리고 세 개의 라인 세그먼트는 각각 [ ti-2, ti+1 ], [ ti-1, ti+2 ], [ ti, ti+3 ] 구간의 점들을 convex

53 combination 한 결과에 의해 주어집니다. 이러한 과정을 통해서 convex combination 이 보장됩니다.

위의 명시적 표현은 고차 다항식으로 가면 갈수록 복잡해집니다. 그래서 다음과 같은 형태로 일반화할 수 있습니다.

수식 2

여기에서 s 는 양의 정수입니다. i 는 control point 와 knot 의 개수에 영향을 줍니다. 그리고 k

는 다항식의 차수를 제공합니다. 그리고 s 는 가중치 (t - ti)/(ti+s - ti) 의 계산에서 knot 사이의 gap 을 제공합니다. 수식 2 를 사용해 수식 1 을 정리하면 수식 3 과 같이 축약됩니다.

수식 3

여기서 알아야 할 것은 마지막 아래첨자( subscript ) 와 위첨자( superscript ) 의 합은 4 라는 것입니다. 이와 유사하게 2 차 스플라인에서는 그 합이 3 이 됩니다. 이 일반적인 패턴을 정리해 보면, d 차 스플라인 커브의 재귀 공식에서 마지막 아래첨자와 위첨자의 합은 d + 1 이 됩니다. 그러므로 스플라인 커브의 차수가 고정되어 있다면, 우리는 위첨자를 없애고 다음과 같이 쓸 수 있습니다.

그림 28. 3차 스플라인 커브 상의 점을 계산.

54

3 차 세그먼트 pi,3(t) 상의 점을 계산하는데 포함되는 모든 식은 그림 28 에서 보이는 것처럼 삼각형 모양으로 정렬됩니다.

범용 d 차 스플라인 커브의 세그먼트는 d + 1 개의 control point 와 2d 개의 knot 을

요구합니다. 이 때 knot 들의 값의 크기는 오름차순으로 정렬되어 있어야 합니다( ti < ti+1 ). d - 1 차인 두 커브의 가중 평균은 다음과 같습니다.

수식 4

이와 유사하게 d - 2 차 커브에 대한 convex combination 을 통해 d - 1 차 커브를 얻는 형태가 아래에 나와 있습니다.

우리가 ti < ti+1 라는 가정을 세웠기 때문에 0 으로 나누기는 발생하지 않습니다. 가장 저수준에서 우리는 d 개의 라인 세그먼트를 가지게 되는데, 이는 control point 들로부터 직접적으로 결정됩니다.

여기까지의 전체 계산식은 다음과 같이 정리됩니다.

d 가 양의 정수이고, d + 1 개의 점 와 2d 개의 knot 이 주어졌다고

합시다. d 차 스플라인 커브 상의 점 는 다음의 계산식에 의해서 결정됩니다. 먼저

에 대해 라고 설정하고 다음을 계산합니다.

수식 5

여기에서 이고 입니다.

n 개의 control point 및 그와 연관된 knot 을 가진 d 차 스플라인 커브는 다음과 같이 주어집니다.

55

이제 여기에 piecewise constant function 을 적용하면 최종 결과는 다음과 같습니다.

일단 d 차 스플라인 커브는 d - 1 차 미분까지는 연속적이라는 것이 확인되었습니다. 이 부분에 대해서는 여기에서 구체적으로 다루지 않겠습니다.

아래 그림은 3 차 스플라인 커브를 보여 줍니다. 이를 그림 25 의 5 차 베지에 커브와 비교해 보면 훨씬 부드럽고 control polygon 과 가까워졌다는 것을 보여 줍니다.

6. Hermite spline

이 섹션은 [ Cubic Hermite spline ] 을 참고해서 작성되었습니다.

Hermite spline 은 보간 다항식이 Hermite form 인 spline curve 를 의미합니다. Hermite 는 "에르미트" 라고 발음됩니다. "허미트", "허밋" 이라고 하시는 분들도 있습니다.

Cubic spline interpolation 에서는 2 계 도함수를 사용하는 예를 보여 줬는데, Hermite spline interpolation 은 1 계 도함수를 사용합니다.

어떠한 구간 에서 이 주어졌다고 합시다. 주어진 구간을 [ 0, 1 ] 로 정규화하기 위해 다음과 같은 식을 만들 수 있습니다. 즉 parameterization 을 수행합니다. 함수의 인자를 x 축의 좌표값이 아니라 구간 내의 비율로 변경해 버린 것입니다.

그리고 나서 이 t 를 사용하는 3 차 보간 다항식을 만듭니다. 아래에서 보이는 다항식의 형태가 Hermite form 입니다.

56

위의 식을 s 에 대해 미분하면 결과는 다음과 같습니다. 위의 식에서 h 는 기저 함수를 의미합니다. 여기에서는 에르미트 기저라고 부릅니다. 그리고 m 은 tangent 를 의미합니다. h 의 값들은 여러 가지 방식으로 표현될 수 있습니다.

expanded factorized Bernstein

이 기저 함수들의 모양을 보면 다음과 같습니다.

그림 29. 4 개의 에르미트 기저 함수들. 이것들의 선형 결합을 통해 보간 수행.

이 때 m 을 어떻게 구하느냐가 관건입니다. 그것을 어떻게 구하느냐에 따라서 에르미트 스플라인의 이름이 바뀌게 됩니다. 즉 에르미트 스플라인의 변종 스플라인들입니다.

57

6.1. Finite difference

가장 단순한 방법으로 세 점의 차이를 구합니다. 이 때 균등한 구간 길이를 요구하지 않습니다.

아래 그림은 tangent 로 finite difference 를 주었을 때의 결과입니다.

6.2. Cardinal spline

Cardinal spline 은 canonical spline( 기본형 스플라인? ) 이라고도 불립니다. 다음과 같이 tangent 를 정의합니다.

여기에서 매개변수 c 는 장력( tension )인데 ( 0, 1 ) 구간을 가집니다. 어떤 관점에서는 이를 tangent 의 길이로 해석합니다. c = 1 이면 모두 0 인 탄젠트를 생성하고, c = 0 이면 Catmull- Rom spline 을 생성합니다.

이 스플라인은 양 끝점에 대해서는 이어지지 않는 스플라인입니다. 아래 그림은 장력을 0.1 로 주고 그린 2D 커브입니다.

6.3. Catmul-Rom spline

58

Cardinal spline 에서 c 를 0 으로 두면, 다음과 같은 결과가 나옵니다. 결국 장력 개념이 없는 스플라인이라고 할 수 있습니다.

이러한 tangent 를 사용하는 스플라인을 Catmul-Rom spline 이라 부릅니다. 이 스플라인은 컴퓨터 그래픽스에서 key frrame 보간을 위해서 자주 사용되는 스플라인이라고 합니다.

이 스플라인에 대해서 이야기할 때는 uniform, chordal, centripetal 이라는 용어가 나옵니다. 이는 구간의 길이를 어떻게 정의하느냐와 관련이 있습니다. 자세한 형태는 아래 그림에 나와 있습니다.

그림 30. 여러 가지 형태의 Catmul-Rom spline. uniform 방식은 loop 문제나 self-intersection 문제를 발생시킬 수 있는데, chordal 방식과 centripetal 방식은 이러한 문제를 해결했다고 합니다.

6.4. Kochanek-Bartels spline

Kocharnek-Bartels spline 은 3 개의 parameter 를 사용합니다.

여기에서 매개변수의 의미는 다음과 같습니다.

변수 의미 설명 t tension. 장력. tangent vector 의 길이. +1  tight. -1  round.

59 b bias. tangent vector 의 주 방향. +1  post shoot. -1  pre shoot. c continuity. Tangent 사이의 날카로움의 변화. +1  inverted corners. -1  box corners.

이것의 예는 다음과 같습니다.

6.5. Monotone cubic interpolation

이 보간법은 보간되고 있는 점들의 monotonicity( 단조성 ) 를 보장하기 위한 보간법입니다. 단조성이라는 것은 주어진 순서를 보장하는 것을 의미합니다. 다시 말해서 반대 방향으로 기울기가 변하는 점이 있어서는 안 된다는 것입니다.

단조롭게 증가 단조롭게 감소 단조롭지 않음

어쨌든 결국 단조롭지 않은 보간을 단조롭게 바꿔 주는 것입니다.

60

자세한 내용은 [ Monotone cubic interpolation ] 에서 확인하시기 바랍니다.

7. B-Spline( Basis spline )

이 섹션은 [ CHAPTER 1 Splines and B-splines an Introduction ] 를 참고하여 작성되었습니다.

우리는 cubic polynomial spline, Bézier spline, Hermite spline 등에 대해서 다뤘습니다. 이쯤되면 이 모든 스플라인의 종류를 이해하고 외워야 하나라는 의문을 가지기 시작할 것입니다. 각 스플라인의 의미를 상기하면 다음과 같습니다.

일단 스플라인은 다항식 세그먼트의 집합으로부터 형성되는 커브인데, 각 세그먼트는 부드럽게 연결됩니다.  만약 하나의 세그먼트만 가지고 있다면 스플라인은 보통 Bézier curve 라 불립니다.  만약 세그먼트가 Bézier form( 번스타인 기저 함수를 사용 )이면 Bézier spline 이라 불립니다. 이 형식은 표준은 아닙니다. 이는 piecewise Bézier curve 를 의미합니다.  만약 다항식 세그먼트의 차수가 3 차이면, cubic polynomial spline 이라 불립니다.  만약 세그먼트가 위치와 도함수로 기술된다면, 그것은 Hermite form spline 이라 불립니다.

각각의 표현은 매우 다양하며 좀 더 세부적으로 들어 가면 매우 다양한 이름의 스플라인이 존재합니다. 이런 스플라인들을 모두 포함할 수 있는 일반적인 형태는 없는 것일까요? 당연히 그런 고민을 하는 연구자들이 있었으며, B-spline 이라는 최종 보스가 등장하게 되었습니다.

우리는 [ 4.3. Cubic Bézier curve ] 에서 베지에 커브가 번스타인 다항식에 대한 convex combination 의 형태로 작성되는 것을 봤습니다. 이 섹션에서는 스플라인에 대해 그와 유사한 표현을 만드는 과정에 대해서 보여 줍니다( 역주 : 이 과정이 이해가 안 가시더라도 걱정하지 마시고, 나오는 최종 형태와 결론만 이해하시면 됩니다. 저도 좀 이해가 안 되는 부분들이 있습니다 ㅠㅠ ).

61

우리는 [ 5.3. Spline curves of higher degrees ] 섹션에서 일반적인 스플라인을 다음과 같이 정의했습니다.

수식 6

B 는 결과가 구간을 넘어 서지 않도록 하기 위한 장치인 piecewise constant function 입니다.

이 표현식이 처음 소개되었을 때, 우리는 이라는 가정을 했습니다( 물론 마지막 knot 은 겹치는 게 허용됩니다 ). 그런데 연속성에 대한 더욱 범용적 형태를 만들기 위해서, 우리는 내부의 knot 들이 겹칠 수도 있어야만 한다는 것을 알게

되었습니다. 예를 들어 인 어떤 i 에 대해 이라고 하면, 이와

연관된 세그먼트 pi,d 는 완전히 중복이며 0 으로 나누기가 발생합니다. 이것은 사실 B 가 0 을 반환하기 때문에 방지되기는 합니다. B 에 대한 좀더 명확한 정의는 이를 더욱 확실하게 해 줍니다.

그래서 수식 6 은 같은 knot 이 여러 번 등장한다고 해도 문제없이 동작합니다. 단지 우리가 0 나누기 문제에 신경을 써야 한다는 것만이 문제입니다.

이제 커브를 control point 의 관점에서 직접적으로 작성하는 방법에 대해서 알게 되었다고 합시다. 수식 4 를 활용해서 다음을 획득할 수 있습니다.

우리는 어떤 i 에 대해 0 나누기 문제를 만나게 됩니다. 해결책은 '0 나누기는 0' 이다라고

선언하는 것입니다. 왜냐하면 우리는 ti = ti+1 일 때의 답이 0 임을 이미 알기 때문입니다.

62

위의 식에서 우리는 식을 복잡하게 만드는 두 개의 '경계 항'을 가지게 됩니다. 그러나 t 가

[ td+1, tn+1 ] 구간에 존재한다고 가정했으므로, 우리는 아래 식을 더할 수 있는데, 이 식은 t 가

[ td+1, tn+1 ] 구간에 존재하는 한 0 이라고 할 수 있습니다.

다음의 함수

를 도입함으로써, 에 대해 커브를 다음과 같이 작성할 수 있습니다.

이는 범용적인 전략을 설명합니다: Control point 가 명시적으로 드러나는 표현식을 가질 때까지

수식 6 에서의 관계식을 차례대로 적용하고 그것의 합들을 재정렬합니다. 그 식들은 Bi,1 에 대한 일반화를 드러내며, i = 1, , ..., d 에 대해 다음과 같이 재귀적으로 정의될 수 있습니다.

수식 7

여전히 우리는 '0 으로 나누기는 0' 이다라는 제약을 사용합니다. ti = ti+r+1 일 때 Bi,r(t) 는

0 이며 t < ti 이거나 t > ti+r+1 일 때 Bi,r(t) = 0 임을 추론할 수 있습니다.

수식 7 을 반복적으로 정의함으로써 나타나는 함수를 추론하는 것을 증명하는 것은, 우리가 일반 절차로 고려하는, 수식 5 에서의 모든 평균을 unwrapping 하는 과정에서 드러납니다. 수식 5 에 대한 r - 1 적용 이후에, 우리가 다음 식을 가지게 되었다고 합시다.

하나 더 적용하면 다음이 산출됩니다.

63

바로 위에서처럼 합 부분의 경계항들에, t < ti 이거나 t > ti+r 일 때 Bi,r-1(t) 가 0 이기 때문에 0 이 되는, 아래 식을 추가할 수 있습니다.

그 결과는 다음과 같습니다.

d - 1 단계 후에, 우리는 다음과 같은 결과를 얻게 됩니다.

수식 5 에 대한 마지막 적용식에서 우리는 j = i - d, ..., i 에 대해서 pj,0(t) = cj 임을 상기할 수 있습니다. 합을 재정렬하고 0 항들을 추가함으로써 우리는 다음과 같은 결과를 얻습니다.

수식 8

이 마지막 단계에서 우리는 두 개의 추가 knot 을 필요로 합니다. 그것의 이름은 t1 과 tn+d+1

인데, 이것들은 B1,d-1 과 Bn+1,d-1, 그리고 B1,d 와 Bn,d 에 의해 사용됩니다. [td+1, tn+1]

64

구간에서 스플라인의 값은 이 knot 들에 대해 독립적입니다. 그러나 일반적으로 전체 knot vector 가 오름차순으로 정렬되도록 하기 위해서 와 를 추천합니다.

이제 우리는 어떤 점과 어떤 함수의 선형결합 형태로 커브를 정의할 수 있게 되었습니다. 이 때

함수를 기저 기저 함수라고 부릅니다. 그러므로 이러한 형태를 띠는 스플라인을 Basis- spline 이라고 부르며, 줄여서 B-spline 이라고 합니다.

8. Nonuniform rational B-Spline( NURBS )

이 섹션은 [ Rational Curves ] 와 [ Non-uniform rational B-Spline ], [ B-splines ], [ B- Splines and NURBS ] 를 참고하여 작성되었습니다.

NURBS( 비균일 유리 B 스플라인, 넙스 ) 는 커브와 서피스를 사용하기 위해서 컴퓨터 그래픽스에서 일반적으로 사용되는 수학적 모델입니다. 그것은 해석학과 모델링된 도형을 다루는데 있어 유연성과 정확도를 제공합니다. 넙스는 computer-aided design( CAD ), 제조업( CAM ), 엔지니어링( CAE ) 등에서 사용됩니다. 넙스 툴은 3D 모델링 및 애니메이션 소프트웨어 패키지에서 등장하기도 합니다.

넙스 커브와 서피스의 편집은 매우 직관적이며 예측가능합니다. 컨트롤 포인트들은 항상 커브/서피스에 직접적으로 연결되거나 그것들이 rubber band( 고무 밴드 ) 에 의해 연결되어 있는 것처럼 동작합니다.

8.1. Nonuniform B-spline

Non-uniform 의 의미가 무엇인지 살펴 보겠습니다.

B-spline 에서 knot vector 를 가진다는 사실은 인지하고 계실 겁니다. 그런데 이 knot vector 를 만들 때, 각 knot 의 차이를 고르게 할 수도 있고 고르지 않게 할 수도 있습니다; uniform, open uniform, nonuniform.

하위 섹션들에서 수식 7 에 대한 언급을 하는데, 일단은 이 페이지와 수식 7 이 있는 페이지가 멀기 때문에 여기에서 식을 한번 언급하고 가도록 하겠습니다. 수식 7 은 스플라인 보간의 재귀적 형태의 일반화입니다.

8.1.1. Uniform knot vector

다음의 조건을 만족시키는 B-spline 을 uniform spline 이라고 합니다.

65

기억이 잘 안 나시는 분을 위해 알려 드리면, A 뒤집어 높은 것은 'Any' 입니다. 즉, '임의의' 라는 의미입니다.

Uniform 의 예를 들면 :

{1, 2, 3, 4, 5, 6, 7, 8}, {0, 1, 2, 3, 4, 5}, {0.0, 0.25, 0.5, 0.75, 1.0}, {-2.5, -1.4, -0.3, 0.8, 1.9. 3.0}.

이제 좀 더 세부적으로 보겠습니다. 예를 들어 ti = i 라고 합시다. 그러면 이는 knot vector 에

대한 scaling 이나 trranslating 이 Bi,r 이 만드는 커브의 모양을 결정하는데 영향을 미치지 않음을 의미합니다. 그래서 knot vector 는 { 0, 1, 2, 3, ..., r + n } 이 되며, 수식 7 은 다음과 같이 단순화됩니다.

8.1.2. Open uniform knot vector

다음과 같은 조건을 만족시키는 B-spline 을 open uniform B-spline 이라고 합니다.

예를 들면 :

{0, 0, 0, 0, 1, 2, 3, 4, 4, 4, 4} if r = 4, {1, 1, 1, 2, 3, 4, 5, 6, 6, 6 } if r = 3.

정리하자면 양 끝의 knot vector 들은 다항식 차수의 개수만큼 반복됩니다. 이는 closed curve 를 만들기 위해서 사용되는 knot 들입니다. Closed curve 를 만들기 위해서는 단지 양 끝단을 서로 이어 주기만 하면 됩니다. Closed curve 를 만들지 않으려면 uniform knot vector 를 사용하면 됩니다.

그런데 closed curve 는 무엇일까요? Closed curve 는 그림 31 처럼 end-point 가 없는 curve 를 말합니다. 다시 말해서 start-point 와 end-point 가 이어져 있어야 합니다. Knot vector 가 겹치지 않는 경우에는 curve 가 control point 를 지나지 않습니다. 그런데 open uniform knot vector 는 시작점과 끝점에서 사용하는 knot vector 들이 중복되고 있기 때문에 커브는 시작점과 끝점을 지나게 됩니다.

66

그런데 만약 시작점과 끝점이 동일하다면( end-point 가 없다면 ), 그것은 closed curve 가 됩니다.

그림 31. closed curve 와 open curve

8.1.3. Non-uniform knot vector

이제 드디어 우리가 관심을 가졌던 non-uniform 에 대한 정의가 나옵니다. 이미 uniform 에 대한 정의를 끝낸 순간 생각이 빠른 분들은 non-uniform 에 대한 정의까지 끝내셨을 거라 생각합니다.

다음과 같은 조건을 만족시키는 B-spline 을 non-uniform B-spline 이라고 부릅니다.

아마도 "같지 않다" 를 생각하셨을 것 같은데, 같을 수도 있습니다. 이에 대해서는 이미 이전 섹션에서 다뤘었죠. 일반화를 위해서는 knot vector 가 같은 경우도 다룰 수 있어야 합니다. 그리고 knot vector 의 요소는 항상 오름차순으로 정렬되어 있어야만 한다는 것은 다시 말할 필요도 없겠죠( 왜 다시 말하고 있을까 ㅡㅡ;; ).

어쨌든 예를 들면 :

{ 1, 3, 7, 22, 23, 23, 29, 50, 50 }, { 1, 1, 1, 2, 2, 3, 4, 5, 6, 6, 6, 7, 7, 7 }, {0.2, 0.7, 0.7, 0.7, 1.2, 1.2, 2.9, 3.6 }

커브의 모양은 knot 들간의 상대적인 관계에 의해 결정됩니다. 하지만 scaling 이나 translating 은 커브의 모양에 영향을 주지는 않습니다.

일단 uniform 도 아니고 open uniform 도 아니라면 무조건 non-uniform 이라고 생각하시면 됩니다. Non-uniform 을 사용하면 다음과 같은 특징을 띠게 됩니다.

67

중첩된 knot 들 : 중첩된 knot 들은 그 knot 들에서의 연속성의 차수를 감소시킵니다. 일반적인 knot 의 연속성은 Cr-1 입니다. 보통은 3 차 이상의 다항식을 사용하므로 C1 은 보장하고 있는 것입니다. 만약 r -1 개 이상의 중첩된 knot 들을 사용한다면 커브의 연속성이 없어집니다. 가까운 knot 들 : knot 들이 다른 knot 들보다 상대적으로 서로 가까워지면, 그것이 연관된 curve 가 control point 와 더 가까워집니다. 먼 knot 들 : knot 들이 다른 knot 들보다 상대적으로 서로 멀어지면, 그것이 연관된 curve 가 control point 와 더 멀어집니다.

Uniform 이나 open uniform 은 curve 의 모양을 변경시키기 위해서 할 수 있는 일이 없습니다. 하지만 non-uniform 의 경우에는 uniform 이나 open uniform 을 자신의 특수한 형태로 만들 수 있습니다. 어떻게 보면 하위집합이라고 할 수 있겠습니다. 그래서 non-uniform B-spline 이 자유로운 curve 편집을 위해 사용되는 것입니다.

8.2. Rational curve

이제 rational 이라는 것의 의미에 대해 알아 봅시다.

다항식을 사용한 매개변수 표현은 3D 에서 표현하기에는 문제가 있습니다. 왜냐하면 음함수로 표현되는 것들( circle, ellipse, hyperbola )을 표현하는데 한계가 있기 때문입니다. 이러한 단점을 극복하는 하나의 방법은 동차 좌표계( homogeneous coordinate )를 사용하는 것입니다. 예를 들어 공간에 커브를 표현할 때 3 개의 함수가 아니라 4 개의 함수를 사용합니다.

여기에서 u 는 [ a, b ] 구간에 있는 매개변수( parameter )입니다. 이 커브를 기존의 방식으로 표현하면 다음과 같습니다.

w(u) = 1 이라면 동차 표현과 기존 표현이 동일합니다.

동차 형식으로 되어 있는 parametric curve 를 rational curve 라 부릅니다. 차이를 확실히 하기 위해서 다항식 형식으로 되어 있는 curve 를 polynomial curve 라 부를 것입니다.

Rational 형식의 능력을 알아 보기 위해서 예를 들어 보도록 하겠습니다. 다음과 같은 매개변수 표현이 있다고 합시다.

68

정의역을 전체 실수라고 합시다. 이제 u 가 음의 무한대에서 양의 무한대로 간다고 합시다. x 와 y 값은 모두 무한대로 갑니다. 다시 말해 이 공식에 의해서 만들어진 커브는 적어도 무한대에 있는 하나의 점을 포함하게 됩니다. 원의 모든 점들은 유한한 영역에 존재하므로, 위의 매개변수 공식에서는 원을 획득할 수가 없습니다. 여기에서 매개변수 표현의 단점이 드러납니다.

이제 다음 공식을 봅시다.

a 와 p 가 모두 0 이 아니라고 가정합시다. 그리고 첫 번째와 두 번째 식을 각각 a 와 p 로 나눕니다.

이제 첫 번째에서 두 번째를 빼서 u2 항을 제거합니다. 그러면 u 는 다음과 같습니다.

마지막으로 이 u 를 첫 번째 공식에 넣습니다.

이것을 정리하면 다음과 같은 형태가 됩니다.

여기에서 새로운 기호들의 의미는 다음과 같습니다.

여기에서 D, E, F 는 필요하지 않습니다. 왜냐하면 원뿔 곡선을 위한 2 차식에서는 필요없는 항들이기 때문입니다. [ 3.3.Geometric Continuity ] 에 있는 그림 23 에 있는 식의 형태를 확인해 보세요.

69

역기에서 B2 - A * C = 0 이기 때문에 이 커브는 포물선을 의미하게 됩니다( B2 < A * C 이면 타원, B2 > A * C 이면 쌍곡선 ).

공통 커브를 위한 rational form

이제 circle 을 위한 rational form 을 찾아 봅시다.

위의 그림은 반지름 1 인 원을 보여 줍니다. 편의를 위해 x 값을 u 값으로 사용한다고 합시다. 결과적으로 (u, 0) 인 점은 x 축에 존재할 것입니다. (u, 0) 인 점과 남쪽 끝에 있는 (0, -1) 사이의 라인을 추가해 봅시다. 이 라인은 원과 2 개의 점에서 겹칩니다. 그 중에 다른 점을 (x(u), y(u)) 라고 합시다. u 는 x 축에서 움직이므로, 그것의 위치는 원 위를 움직이게 됩니다. 유한한 어떤 u 는 그것과 연관된 점을 가지게 됩니다. 무한한 u 는 남쪽 끝의 점과 연관됩니다. 다시 말해, 남쪽 끝에 있지 않은 원 상의 모든 점은 x 축에 있는 u 에 연관됩니다.

위의 라인은 x = uy + u 로 정의됩니다. 그리고 원의 방정식은 x2 + y2 = 1 입니다. 라인 공식을 원의 공식에 넣고, y 에 대해서 풀면 두 개의 근이 나옵니다. 하나는 y = -1 일 겁니다. 왜냐하면 남쪽 끝을 라인이 지나가기 때문입니다. 다른 근은 y = (1 - u2) / (1 + u2) 입니다. y 를 라인 공식에 넣으면 x = 2u / (1 + u2) 이 됩니다. 각 u 에 대해서, 원 상에서 연관되는 점은 다음과 같습니다.

결과적으로, 원은 rational parameterization 을 포함합니다( 역주 : w = 1 + u2 ). u 가 무한대로 이동할 때, x 는 0 에 접근하고 y 는 -1 에 접근합니다( 로피탈 정리를 사용 ).

사실, 이 계산은 우리에게 더 많은 것을 알려 줍니다. 이 원은 t 가 0 에서 2PI 범위에 있을 때 삼각함수 형태인 (cos(t), sin(t)) 를 가지게 됩니다. 그러므로 원 상의 점은 두 개의 다른 표현을 가질 수 있습니다. 그런데 그것의 값은 동일합니다. 즉 (cos(t), sin(t)) = ((2u) / (1 + u2), (1 - u2) / (1 + u2)) 입니다. 그래서 삼각함수는 다음과 같이 parameterized 될 수 있습니다.

70

삼각함수에 대한 parameterization 을 직접 해 보면, 타원과 쌍곡선에 대한 rational parameterization 을 쉽게 찾을 수 있습니다. 쌍곡선 부분을 해 보고 타원은 연습으로 남겨 두겠습니다. 일반적인 형태의 쌍곡선 공식은 다음과 같습니다.

여기에서 a 와 b 는 semi-major axis 와 semi-minor axis 의 길이입니다. 쌍곡선을 위한 올바른 parameterization 은 다음과 같다는 것을 검증하는 것은 쉽습니다.

tan(t) = sin(t) / cos(t) 이고 sec(t) = 1 / cos(t) 이므로, sin(t) 와 cos(t) 를 위한 rational parameterization 에 위의 공식을 넣으면 다음과 같은 삼각함수 형태의 식이 나옵니다.

8.3. Non-Uniform Rational B-Spline

지금까지 non-uniform 과 rational 의 의미를 살펴 보았습니다. 정리하자면 자유로운 편집을 위해서 non-uniform 을 3D Graphics 에 맞는 형태를 위해서 rational 을 채택한 spline 이 NURBS 라 할 수 있겠습니다.

NURBS 커브는 차수, 가중치화된 control point 집합, knot vector 를 사용해 정의됩니다. 사실 수식 8 의 정의가 B-Spline 에 대한 일반적 정의이고, NURBS 의 정의도 이와 다르지 않습니다. 단지 입력값들( 예를 들어 knot vector )이 특이(?)할 뿐입니다. NURBS 커브 편집 과정을 보시려면 다음 링크를 참고하세요; https://en.wikipedia.org/wiki/File:Spline01.gif.

NURBS 커브와 서피스는 B-spline 및 Bézier curve 를 일반화한 것입니다. 가장 중요한 차이라고 한다면 control point 에 가중치가 주어진다는 것이며, 이는 NURBS curve 를 rational 로 만들게 됩니다. Control point 에 대한 2 차원 그리드를 사용함으로써 planar patch 와 section of sphere 를 포함하는 NURBS surface 를 생성할 수 있습니다. 그것들은 두 개의 변수( 보통 s 와 t, 혹은 u 와 v )를 사용해 매개변수화됩니다. 이는 임의의 차원에서 NURBS 매핑을 생성하기 위해 확장될 수 있습니다.

71

NURBS 커브와 서피스는 여러 가지 이유에서 유용합니다:  그것들은 affine transformation 을 수행하는 동안 변치 않습니다. Affinity 를 가진다고 표현할 수 있겠습니다. 이 말은 control point 에 rotation 이나 translation 같은 것들이 적용될 수 있다는 겁니다.  그것들은 standard analytical shape( 예를 들어 원뿔곡선 )과 free-form shape 에 대해 하나의 공용 수학적 형태를 제공합니다.  그것들은 다양한 도형을 설계하기 위한 유연성을 제공합니다.  그것들은 도형을 저장할 때 ( 유사한 기법들에 비해 ) 공간 낭비를 줄여줍니다.  그것들은 수치적 안정성과 정확한 알고리즘에 의해 합리적으로 빠르게 평가될 수 있습니다.

다음 섹션들에서는 NURBS 를 구성하는 요소들에 대해서 좀 더 구체적으로 다루도록 하겠습니다.

8.4. Construction of the basis functions

NURBS 커브에 사용되는 B-spline basis function 들은 보통 다음과 같이 표기됩니다( 지금까지 우리는 B 라고 표기해 왔었습니다 ).

여기에서 i 는 control point 의 offset 과 관련이 있으며, n 은 basis function 의 차수와

관련이 있습니다. Basis function 들에 대한 정의는 n 번 재귀적입니다. 차수 0 함수인 Ni,0 들은

구간별 상수 함수입니다. Ni,n 은 Ni,n-1 과 Ni+1,n-1 의 선형 보간입니다. 나중의 두 함수들은 n

개의 knot 구간에서 0 이 아니며, n - 1 개의 knot 구간에서 겹칩니다. Ni,n 은 다음과 같이 계산됩니다. 아래 식에서 f 와 g 를 weight function 이라 부릅니다.

fi 는 Ni,n-1 이 0 이 아닌 구간에서 0 에서 1 로 증가하며, gi+1 은 Ni+1,n-1 이 0 이 아닌

구간에서 1 에서 0 으로 감소합니다. Ni,1 이 삼각형( triangular ) 형태의 함수이므로, 두 개의 knot 구간이 겹치는 구간에서 0 이 아닙니다( 이것이 합성되는 과정은 그림 31 을 참조하세요 ). 고차 기저 함수들은 더 많은 knot 구간과 연관이 되며, 더 높은 차수를 가집니다. 만약 u 가

매개변수이고, ki 가 i 번째 knot 이 라면 우리는 f 와 g 를 다음과 같이 작성할 수 있습니다. 72

함수 f 와 g 는 각각에 연관된 저차 기저 함수들이 0 이 아닐 때 양수입니다. 이를 n 에 대해 귀납적으로 추론해 보면, n 과 u 의 모든 값들에 대해서 basis function 들은 음수가 아님을 알 수 있습니다. 이는 basis function 의 계산을 수치적으로 안정적으로 만듭니다.

그림 32. 위에서 아래로: [ TOP ] Linear basis function N1,1( blue ) 와 N2,1( green ), [ MIDDLE ] weight functions f 와 g, [ BOTTOM ] 결과 quadratic basis function.

아래의 그림은 { ..., 0, 1, 2, 3, 4, 4.1, 5.1, 6.1, 7.1, ... } 에 대한 linear basis function 과 quadratic basis function 들을 보여 줍니다.

73

하나의 knot 구간이 다른 것들보다 매우 짧다는 것을 알 수 있습니다. 그 knot 구간은 2 차 basis function 으로 가면서 더욱 두드러집니다. 기하학적으로 해석하면, 이것은 curve 가 그것이 연관된 control point 에 더욱 가깝게 접근하고 있음을 의미합니다. 두 개의 knot 이 겹치면 knot 구간은 0 이 되며, 최고점이 정확하게 1 이 됩니다. 이 basis function 은 더 이상 그 점에서 미분될 수 없습니다. 그러한 커브는 이웃한 control point 들이 collinear 하지 않을 때 뾰족한 corner 를 가지게 됩니다.

NUBRS 를 공부하다가 보면 위와 같은 그래프들을 많이 접하게 되는데요, 차수가 높아지면서 다음과 같이 합성됩니다.

74

그림 33. 2차 B-spline 의 basis function 의 예.

그림 34. 3차 B-spline 의 basis function 의 예.

75

8.5. General form of a NURBS curve

이전 섹션에서의 basis function Ni,n 에 대한 정의를 사용하면, NURBS 커브를 다음과 같은 형태로 정의할 수 있습니다.

여기에서 k 는 control point Pi 의 개수입니다. 그리고 wi 는 그것과 연관된 가중치입니다. 분모는 모든 가중치가 1 일 때 1 로 평가되는 정규화 요소입니다. 이는 보통 다음과 같은 형태로 작성됩니다.

여기에서 R 은 rational basis function 이라고 부릅니다.

8.6. General form of a NURBS surface

NURBS 서피스는 두 NURBS 커브들에 대한 tensor product 에 의해 획득됩니다. 그래서 두 개의 독립적인 매개변수를 사용합니다.

여기에서 R 은 다음과 같습니다.

9. Subdivision Surface

이 섹션은 [ Subdivision surface ] 를 참고하여 작성되었습니다.

76

이 섹션에서는 subdivision surface 에 대해서 간단하게 소개만 하도록 하겠습니다. NURBS 가 매우 자유로운 곡선 및 곡면을 표현할 수 있는 수단임에도 불구하고, 실시간 그래픽스에서 사용하기에는 조금 무리가 있습니다. 왜냐하면 대부분의 Graphics API 들은 polygon 기반으로 렌더링을 수행하기 때문입니다.

그런데 NURBS 를 polygon 형태로 바꾸게 된다면 너무 많은 점들을 필요로 하게 됩니다. 그래서 subdivision surface 를 이용하게 됩니다. Subdivision surface 는 말 그대로 아래 그림처럼 표면을 하위분할해 가는 것을 의미합니다.

마치 조각가가 덩어리를 깎아 가면서 세부적인 모양을 만들어 가는 것과 유사합니다.

Subdivision surface 는 재귀적으로 정의됩니다. 이 과정은 polygonal mesh 에서 시작됩니다. 그리고 나서 refinement scheme 이 이 메쉬에 대해 적용됩니다. 이 과정은 그 메쉬를 취해서 그것을 하위분할하고, 새로운 점과 면들을 생성하는 것입니다. 새로운 점들의 위치는 가장 가까운 예전 점들의 위치에 기반해 계산됩니다. 어떤 refinement scheme 에서는 예전 점들의 위치가 ( 새로운 점들의 위치에 기반해서 ) 조정되기도 합니다.

이 과정은 원래의 것보다 더 세밀한 결과를 산출하며, 더 많은 polygonal face 를 포함합니다. 이 결과는 다음 refinement scheme 에 넘겨지고, 이런 과정이 반복됩니다.

Subdivision surface 은 한계는 그것이 무한하게 반복될 수 있다는 것입니다. 그러나 실례를 보면 이 알고리즘은 제한된 횟수만큼만 적용됩니다. 제한된 표면은 Jos Stam 의 기법을 사용해서 계산될 수 있습니다. 이 기법은 재귀적인 refinement 를 줄이는데 필요합니다.

77

Subdivision surface 와 T-spline 은 경쟁적인 기술입니다. 수학적으로 볼 때 subdivision surface 는 특이점( singularities )을 지닌 spline surface 입니다.

Subdivision surface 는 보통 2 개의 카테고리로 나뉩니다: interpolating, approximation. Interpolating scheme 은 원래 메쉬의 원래 점 위치가 유지되는 것을 요구합니다. Approximating scheme 은 그렇지 않습니다; 이는 필요하면 원래 점 위치를 조정할 것입니다. 일반적으로 approximating sceheme 이 더 부드럽지만, 그것은 사용자로 하여금 최적화 단계를 요구하는 정확한 제약을 설정하도록 합니다.

다른 subdivision surface scheme 들도 있습니다. 그것은 처리하는 polygon 유형과 관련이 있습니다. 어떤 함수는 quad 에 대해 수행되며, 어떤 함수는 triangle 에 대해 수행됩니다.

Approximating Scheme 은 다음과 같습니다.  Catmull-Clark ( 1978 ) 은 bi-cubic uniform B-spline 을 일반화하여 자신들의 subdivision scheme 을 만들었습니다. 임의의 초기 메쉬에 대해, 이 scheme 은 제한된 개수의 서피스를 생성하는데, 그것들은 C2 연속성을 모든 곳에서 가집니다. 단 일부 특이한 점들은 C1 연속성을 가지게 됩니다.  Doo-Sabin - bi-quadratic uniform B-spline 서피스의 analytic expression 을 사용하여 임의의 초기 메쉬에 대해 임의의 topology 를 가진 C1 의 제한된 서피스들을 생성합니다.  Loop, Triangles - Loop 는 6 개의 방향 벡터에 대한 quadratic box-spline 에 기반한 subdivision scheme 을 제안했습니다. 이는 특이한 점들에서 C1 연속성을 가지는 것을 제외하면, 모든 곳에서 C2 연속성을 가진 제한된 서피스를 생성합니다.  Mid-Edige subdivision scheme - 생략.  √3 subdivision scheme - 생략.

Interpolating scheme 은 다음과 같습니다.  Butterfly, Triangle - 생략.  Midedge, Quads - 생략.  Kobbelt, Quads - 생략.  Deng-Ma, Quads - 생략.

78