맨위로가기

캣멀롬 스플라인

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

1. 개요

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

더 읽어볼만한 페이지

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

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()



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com