* 캣멀-롬 스플라인
- 3차 허밋 스플라인에서 시작(U)과 끝(V) 지점의 속도 벡터를 결정하기 위한 특정한 값을 가진 스플라인
+ 새로운 스플라인 이라기 보다는 3차 허밋 스플라인을 구현하기 위한 기술
+ 각 지점을 통과하는 곡선을 구현하기 좋다.
+ 캣멀-롬 스플라인은 컴퓨터 그래픽스로 용어이다.
네 개의 점 사이를 보간하여 곡선을 표현할 수 있다.
해당 공식을 사용한다.
* 코드예제
import numpy
import pylab as plt
def CatmullRomSpline(P0, P1, P2, P3, nPoints=100):
"""
P0, P1, P2, and P3 should be (x,y) point pairs that define the Catmull-Rom spline.
nPoints is the number of points to include in this curve segment.
"""
# Convert the points to numpy so that we can do array multiplication
P0, P1, P2, P3 = map(numpy.array, [P0, P1, P2, P3])
# Calculate t0 to 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)
# Only calculate points between P1 and P2
t = numpy.linspace(t1,t2,nPoints)
# Reshape so that we can multiply by the points P0 to P3
# and get a point for each value of 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):
"""
Calculate Catmull Rom for a chain of points and return the combined curve.
"""
sz = len(P)
# The curve C will contain an array of (x,y) points.
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
# Define a set of points for curve to go through
Points = [[0,1.5],[2,2],[3,1],[4,0.5],[5,1],[6,2],[7,3]]
# Calculate the Catmull-Rom splines through the points
c = CatmullRomChain(Points)
# Convert the Catmull-Rom curve points into x and y arrays and plot
x,y = zip(*c)
plt.plot(x,y)
# Plot the control points
px, py = zip(*Points)
plt.plot(px,py,'or')
plt.show()
이와 같은 그래프가 그려지는 예제로, 점 사이 곡선을 그려주는 것을 확인 할 수 있다.
반응형
'IT > 공부 정리' 카테고리의 다른 글
MQTT, MQTT Protocol란 (0) | 2023.06.16 |
---|---|
[UNITY/C#] Catmull-Rom 스플라인을 사용하여 곡선 및 텍스처에 적용하기 (1) | 2023.03.19 |
[UNITY/C#] C#고급 프로그래밍 (0) | 2023.03.09 |
[UNITY] C# list 사용법 (2) | 2023.02.24 |
[UNITY] C# 중급 프로그래밍 (0) | 2023.02.18 |