Spline의 정의와 속성
What is spline?
스플라인(Spline) 이란 원래 "목수들이 부드러운 곡선을 긋기 위해 사용하던 얇은 금속 띠" 라고 한다.[4] 그러나 현대에는 여러 개의 제어점(CP, Control Point)에 영향을 받는 다항식으로 표현된 곡선이라고도 말한다. 대충 상상을 하면 긴 철사를 꺾지 않으면서 중간 중간 원하는 위치에 고정하면 철사의 강성에 따라 다양한 spline 곡선이 나온다.
Control Point, Order, Degree and Segment
제어점은 곡선의 모양을 제어하는 특징점이라 할 수 있는데, 점의 추가, 삭제, 변경 등을 통해서 곡선의 형상을 제어한다. 스플라인 함수의 위수(Order) $k$는 다항식 근사를 위해 사용하는 점의 갯수이며 차수(Degree) $d$는 다항식의 차수이다. 다. 인접한 한 쌍의 제어점 사이는 구간(Segment)라고 부른다.[4]
What is knot?
스플라인 곡선은 매개변수 t에 대한 함수로 정의하며, 구간 상에 여러 제어점을 정의하여 스플라인 곡선을 분절하는데, 이를 매듭(노트, Knot)라고 한다.[6] 곡선을 끌어당기도록 묶는 매듭이라고 생각하면 이해하기가 좋다. 여기서 Periodic knot는 다른 제어점과 마찬가지로 시작 제어점과 종료 제어점을 지나지 않으며, Non-Periodic knot는 시작 제어점과 종료 제어점을 지난다. Non-Periodic knot는 시작/종료 제어점에 knot를 추가하여 시작/종료 제어점을 지나게 된다.
Interpolating Spline - Approximating Spline
스플라인은 제어점의 통과여부에 따라서 나뉘는데, 제어점을 통과한다면 보간 스플라인(Interpolating Spline), 통과하지 않는다면 근사 스플라인(Approximating Spline)이라 한다. 스플라인 곡선의 부드러움을 위해 곡선이 제어점을 통과하지 않으며, 대신 제어점은 스플라인 곡선을 끌어당기는 역할을 한다.[4]
정리
제어점의 갯수를 $n$이라 하면 다음을 만족한다.
차수 Degree $d$ = 위수 Order $k$ - 1, $d=k-1$
매듭, 노트의 갯수 $m$ = 제어점의 갯수 $n$ + 위수 $k$, $m=n+k$
B-Spline의 Python 예제
Python을 이용한 3차 B-Spline을 만든 깃헙 저장소[5]는 Non-Periodic knot를 사용하는 것을 볼 수 있다. 코드는 scipy에서 제공하는 interpolate를 사용하여
아래 코드는 3차 B-Spline 예제를 수정하여 원하는 차수에 대해서 B-Spline을 그리도록 수정하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
%matplotlib tk
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
plist = [(3 , 1), (2.5, 4), (0, 1),
(-2.5, 4),(-3, 0), (-2.5, -4),
(0, -1), (2.5, -4), (3, -1),]
ctr =np.array(plist)
x=ctr[:,0]
y=ctr[:,1]
plt.close()
l=len(x)
Order = 2
t=np.linspace(0,1,l-(Order-1),endpoint=True)
t=np.append(np.zeros(Order),t)
t=np.append(t,np.zeros(Order)+1)
tck=[t,[x,y],Order]
u3=np.linspace(0,1,(max(l*2,70)),endpoint=True)
out = interpolate.splev(u3,tck)
plt.plot(x,y,'k--',label='Control polygon',marker='o',markerfacecolor='red')
plt.plot(out[0],out[1],'b',linewidth=2.0,label='B-spline curve')
plt.legend(loc='best')
plt.axis([min(x)-1, max(x)+1, min(y)-1, max(y)+1])
plt.title('Cubic B-spline curve evaluation')
plt.show()
|
cs |
1. B-spline curve, https://ocw.snu.ac.kr/sites/default/files/NOTE/223.pdf
2. 김성환, "B-spline curve," CAD응용설계[CAD(2)]/강의자료-곡선과곡면, 2009, https://masw.tistory.com/attachment/cfile29.uf@14125D174B09FA25488987.pdf
3. 이규열, "Part 2. 곡선, 곡면," 전산 선박 설계 강의자료, 2006, https://ocw.snu.ac.kr/node/2053
4. 박동규, "14장 스플라인," http://ivis.kr/images/0/07/14_%EC%8A%A4%ED%94%8C%EB%9D%BC%EC%9D%B8.pdf
5. Python-B-spline-example, https://github.com/kawache/Python-B-spline-examples
6. https://www.cs.utexas.edu/~bajaj/graphics2012/cs354/supp-lectures/Lec11-supp2.pdf
7. 비균일 유리 B-스플라인, https://ko.wikipedia.org/wiki/%EB%B9%84%EA%B7%A0%EC%9D%BC_%EC%9C%A0%EB%A6%AC_B-%EC%8A%A4%ED%94%8C%EB%9D%BC%EC%9D%B8
8.
'개인공부' 카테고리의 다른 글
기타 악보 따기 - When you want to piss off a classical music teacher (0) | 2022.07.31 |
---|---|
비슷하지만 미묘하게 다른 표현 (0) | 2022.04.30 |
Keep some sentense (0) | 2022.04.13 |
-- (0) | 2022.03.13 |
무향 칼만 필터 정리, Unscented Kalman Filter - 작성중 (0) | 2021.03.07 |