캣멀롬 스플라인

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

캣멀롬 스플라인은 네 개의 제어점과 노트를 사용하여 정의되는 곡선이다. 이 곡선은 주어진 점들을 부드럽게 연결하며, 0에서 1 사이의 알파 값을 통해 다양한 형태를 가질 수 있다. 파이썬으로 구현된 코드 예제를 통해 캣멀롬 스플라인의 사용법을 확인할 수 있다.

캣멀롬 스플라인
개요
종류스플라인 보간
개발자에드윈 캣멀
로멜 에.롬
발표1974년
관련 항목컴퓨터 그래픽스
스플라인 (수학)
3차 베지어 곡선
에르미트 곡선
B-스플라인
상세 정보
정의3차 스플라인, 각 제어점에서의 접선은 인접한 세그먼트의 연결선을 반으로 나눈 값이다.
연속성C1 연속
장점구현 용이
낮은 계산 비용
시각적으로 부드러운 곡선 생성
단점제어점 위치 변경에 따른 전역적 곡선 형태 변화 가능성
📚 더 읽어볼만한 페이지
  • 스플라인 - 스플라인 보간법
    스플라인 보간법은 주어진 데이터 점들을 부드럽게 연결하는 곡선을 생성하는 방법으로, 원래 기술 도면을 그릴 때 사용된 탄성 자에서 유래되었으며, 수학적으로는 일련의 다항식을 사용하여 곡선을 모델링하고, 3차 스플라인을 포함한 다양한 형태가 존재하며, 컴퓨터 그래픽스 등 다양한 분야에서 활용된다.
  • 스플라인 - B-스플라인 곡선
    B-스플라인 곡선은 제어점을 연결하여 부드러운 곡선을 생성하는 수학적 표현 방식이며, B-스플라인 기저 함수와 제어점의 선형 결합으로 표현되고, 매듭의 배치에 따라 균일, 개방 균일, 비균일 B-스플라인으로 분류되며, CAD, 컴퓨터 그래픽스 등 다양한 분야에서 활용된다.

2. 정의

배리와 골드만의 피라미드 공식
배리와 골드만의 피라미드 공식

캣멀롬 알고리즘에서의 노트 매개변수화
캣멀롬 알고리즘에서의 노트 매개변수화

점은 \mathbf{P}_i = [x_i \quad y_i]^T와 같이 표현하기로 하자. 네 개의 점 \mathbf{P}_0, \mathbf{P}_1, \mathbf{P}_2, \mathbf{P}_3과 노트 t_0, t_1, t_2, t_3으로 정의되는 곡선 일부 C(캣멀롬 스플라인)는 다음과 같이 표현할 수 있다:

:\mathbf{C} = \frac{t_{2}-t}{t_{2}-t_1}\mathbf{B}_1+\frac{t-t_1}{t_{2}-t_1}\mathbf{B}_2

이는 다음과 같다.

:\mathbf{B}_1 = \frac{t_{2}-t}{t_{2}-t_0}\mathbf{A}_1+\frac{t-t_0}{t_{2}-t_0}\mathbf{A}_2
:\mathbf{B}_2 = \frac{t_{3}-t}{t_{3}-t_1}\mathbf{A}_2+\frac{t-t_1}{t_{3}-t_1}\mathbf{A}_3
:\mathbf{A}_1 = \frac{t_{1}-t}{t_{1}-t_0}\mathbf{P}_0+\frac{t-t_0}{t_{1}-t_0}\mathbf{P}_1
:\mathbf{A}_2 = \frac{t_{2}-t}{t_{2}-t_1}\mathbf{P}_1+\frac{t-t_1}{t_{2}-t_1}\mathbf{P}_2
:\mathbf{A}_3 = \frac{t_{3}-t}{t_{3}-t_2}\mathbf{P}_2+\frac{t-t_2}{t_{3}-t_2}\mathbf{P}_3

또한

:t_{i+1} = \left[\sqrt{(x_{i+1}-x_i)^2+(y_{i+1}-y_i)^2}\right]^{\alpha} + t_i

노트 매개변수화에서 \alpha가 0부터 1 사이의 범위를 가지고 i = 0,1,2,3 일 때 t_0 = 0 이다. 구심적(centripetal) 캣멀롬 스플라인에서 \alpha 값은 0.5이다. \alpha = 0일 때, 곡선은 표준(uniform) 캣멀롬 스플라인의 모양을 가진다. \alpha = 1일 때, 코달(chordal) 스플라인의 모양을 가진다.

3. 코드 예제

python
import numpy
import pylab as plt

def CatmullRomSpline(P0, P1, P2, P3, nPoints=100):
"""
P0, P1, P2, P3는 캣멀롬 스플라인을 정의하는 (x, y) 점 쌍이어야 합니다.
nPoints는 이 곡선 세그먼트에 포함할 점의 개수입니다.
"""
# 점들을 numpy 배열로 변환하여 배열 곱셈을 할 수 있도록 합니다.
P0, P1, P2, P3 = map(numpy.array, [P0, P1, P2, P3])

# t0부터 t4까지 계산합니다.
alpha = 0.5
def tj(ti, Pi, Pj):
xi, yi = Pi
xj, yj = Pj
return ( ( (xj-xi)2 + (yj-yi)2 )0.5 )alpha + ti

t0 = 0
t1 = tj(t0, P0, P1)
t2 = tj(t1, P1, P2)
t3 = tj(t2, P2, P3)

# P1과 P2 사이의 점만 계산합니다.
t = numpy.linspace(t1,t2,nPoints)

# P0부터 P3까지의 점들과 곱하여 t의 각 값에 대한 점을 얻을 수 있도록 형태를 변경합니다.
t = t.reshape(len(t),1)

A1 = (t1-t)/(t1-t0)*P0 + (t-t0)/(t1-t0)*P1
A2 = (t2-t)/(t2-t1)*P1 + (t-t1)/(t2-t1)*P2
A3 = (t3-t)/(t3-t2)*P2 + (t-t2)/(t3-t2)*P3

B1 = (t2-t)/(t2-t0)*A1 + (t-t0)/(t2-t0)*A2
B2 = (t3-t)/(t3-t1)*A2 + (t-t1)/(t3-t1)*A3

C = (t2-t)/(t2-t1)*B1 + (t-t1)/(t2-t1)*B2
return C

def CatmullRomChain(P):
"""
일련의 점들에 대한 캣멀롬 스플라인을 계산하고 결합된 곡선을 반환합니다.
"""
sz = len(P)

# 곡선 C는 (x, y) 점들의 배열을 포함합니다.
C = []
for i in range(sz-3):
c = CatmullRomSpline(P[i], P[i+1], P[i+2], P[i+3])
C.extend(c)

return C

# 곡선이 통과할 점들의 집합을 정의합니다.
Points = 0,1.5],[2,2],[3,1],[4,0.5],[5,1],[6,2],[7,3

# 점들을 통과하는 캣멀롬 스플라인을 계산합니다.
c = CatmullRomChain(Points)

# 캣멀롬 곡선 점들을 x와 y 배열로 변환하고 플롯합니다.
x,y = zip(*c)
plt.plot(x,y)

# 제어점을 플롯합니다.
px, py = zip(*Points)
plt.plot(px,py,'or')

plt.show()