베지어 곡선

Sch·2021년 8월 24일

이 글은 2021년 7월 16일 노션에 작성한 것을 그대로 가져온 것입니다.

배경

대부분의 디자인 프로그램에는 곡선을 그리기 위한 도구가 있고, 그중에서 가장 많이 사용하는 것이 바로 베지어 곡선이다. 2019년에 제로켄이 베지어 곡선에 대해 알려준 적이 있고, 수학적으로 곡선을 나타내는 방식이라는 점에서 내가 탐구하지 않고는 지나갈 수 없는 주제라고 생각하여, 베지어 곡선에 대해 알아보았다.

2차 베지어 곡선.
위 그림은 2차 베지어 곡선의 모양에 대해 간단히 알려준다.

베지어 곡선

베지어 곡선은 세 점에서 시작한다. 세 점은 곡선을 시작할 점 1개, 곡선을 끝낼 점 1개, 그리고 곡선의 모양을 수정할 점 1개로 이루어진다. 각각의 점을 P1,P3,P2P_1, P_3, P_2이라고 하겠다.

위 그림에서 변수 t의 변화 양상은 선형이 아니다.

이때, 각각의 점들을 순서대로 잇는 곡선의 한 선분에 대해, t=0t=0일 때 시점 PnP_n, t=1t=1일 때 종점 Pn+1P_{n+1}까지 선형으로 움직이는 점 QnQ_n이 있다고 하자. PPnn개 있는 경우에는 이러한 QQn1n-1개 생긴다. 즉, 지금과 같은 상황에는 Q2Q_2까지 있다.

이때, 두개의 점 PP와 변수 tt를 통해 QQ를 도출해낸 것과 같이, 두개의 QQ와 변수 tt를 사용하면 새로운 점 RR을 만들어낼 수 있다.

이때 생기는 점 RR의 자취를 모아 집합으로 나타내면 하나의 그래프를 형성하는데, 이 그래프를 베지어 곡선이라고 한다.

위 예제에서는 초기값 PP를 3개의 점으로 나타냈는데, 초기값인 PP가 4개가 되면 2개의 RR이 나오기 때문에 이 RR들의 자취를 또 SS라는 점으로 보간해주어야 하며, 이때 만들어지는 곡선도 베지어 곡선이나, 3번 보간한다는 뜻에서 3차 베지어 곡선이라고 한다.

즉, 위에서 본 PP가 3개인 곡선은 2차 베지어 곡선이다.

수학으로 전개

위 장에서 사용한 변수의 이름을 그대로 사용하겠다. 단, 여기서는 점을 벡터를 다루듯이 할 것이다. 즉, 임의의 두 2차원 점 A=(Ax,Ay),B=(Bx,By)A=(A_x,A_y), B=(B_x,B_y)에 대해 임의의 연산 ABA \cdot B를 다음과 같이 정의한다.

AB=(AxBx,AyBy)A \cdot B = (A_x\cdot B_x,A_y\cdot B_y)

이때, 함수 nrm(v,l1,l2)\text{nrm}(v,l_1,l_2)를 정의한다. 이 함수는 v=l1v=l_1일 때 00, v=l2v=l_2일 때 11을 가지며, l1l_1부터 l2l_2까지를 연속적으로 움직이는 vv에 대해 함숫값이 선형으로 움직인다는 특징을 가진다. 이를 수학으로 표현하면 다음과 같다.

nrm(v,l1,l2)=vl1l2l1\text{nrm}(v,l_1,l_2)={v-l_1 \over l_2-l_1}

또한 이 함수의 역함수 nrm1(n,l1,l2)\text{nrm}^{-1}(n,l_1,l_2)를 정의한다. 이 함수는 nn[0,1][0,1]에서 선형으로 움직일 때 함숫값이 [l1,l2][l_1,l_2]에서 선형으로 움직인다. 이를 수학으로 표현하면 다음과 같다.

nrm1(n,l1,l2)=v=nrm1(nrm(v,l1,l2),l1,l2)=nrm1(vl1l2l1,l1,l2)=vl1l2l1(l2l1)+l1=nΔl+l1\begin{aligned} \text{nrm}^{-1}(n, l_1,l_2)&=v\\ &=\text{nrm}^{-1}(\text{nrm}(v, l_1,l_2),l_1,l_2) \\ &=\text{nrm}^{-1}({v - l_1 \over l_2 - l_1}, l_1, l_2) \\ &={v - l_1 \over l_2 - l_1}(l_2-l_1)+l_1 \\ &=n\Delta l+l_1 \\ \end{aligned}

이 함수를 이용하면 QQ를 구할 수가 있다. 임의의 자연수 nn에 대해

Qn=nrm1(t,Pn,Pn+1)=t(Pn+1Pn)+Pn+1\begin{aligned} Q_n&=\text{nrm}^{-1}(t,P_n,P_{n+1}) \\ &=t(P_{n+1}-P_n)+P_{n+1} \\ \end{aligned}

이다. 이때, 2차 베지어 곡선을 위해서는 위와 같은 방식의 계산을 한 번 더 진행해야 하므로 RnR_n에 대해 전개하면 다음과 같다.

Rn=nrm(t,Qn,Qn+1)=t(Qn+1Qn)+Qn=t[{t(Pn+2Pn+1)+Pn+2}{t(Pn+1Pn)+Pn+1}]+t(Pn+1Pn)+Pn+1\begin{aligned} R_n&=\text{nrm}(t,Q_n,Q_{n+1}) \\ &=t(Q_{n+1}-Q_n)+Q_n \\ &=t\left[\left\{t(P_{n+2}-P_{n+1})+P_{n+2}\right\}-\left\{t(P_{n+1}-P_n)+P_{n+1}\right\}\right]+t(P_{n+1}-P_n)+P_{n+1} \end{aligned}

이때 2차 베지어 곡선은 R=R1R=R_1의 자취와 같으므로

R=nrm(t,Q1,Q2)=t(Q2Q1)+Q1=t[{t(P3P2)+P2}{t(P2P1)+P1}]+t(P2P1)+P1=t[tP3tP2+P2tP2+tP1P1]+tP2tP1+P1=t2P3t2P2+tP2t2P2+t2P1tP1+tP2tP1+P1=t2(P3P2P2+P1)+t(P2P1+P2P1)+P1=t2(P3+P1)+2t(P2P1)+P1\begin{aligned} R&=\text{nrm}(t,Q_1,Q_2) \\ &=t(Q_2-Q_1)+Q_1 \\ &=t\left[\left\{ t(P_3-P_2)+P_2 \right\}-\left\{ t(P_2-P_1)+P_1 \right\}\right]+t(P_2-P_1)+P_1 \\ &=t\left[ tP_3-tP_2+P_2-tP_2+tP_1-P_1 \right]+tP_2-tP_1+P_1 \\ &=t^2P_3-t^2P_2+tP_2-t^2P_2+t^2P_1-tP_1+tP_2-tP_1+P_1 \\ &=t^2(P_3-P_2-P_2+P_1)+t(P_2-P_1+P_2-P_1)+P_1 \\ &=t^2(P_3+P_1)+2t(P_2-P_1)+P_1 \end{aligned}

t[0,1]t\in[0,1]에서 그리는 자취이다.

손으로 베지어 곡선 그리기

중학교 2학년 때에 옵아트(op art, optical art)에 대해서 알아보면서, 두개의 선분을 nn등분한 뒤 그 점들을 이어 나타나는 면들에 서로 이웃하는 면과 다른 색을 칠하는 과정으로 면으로 채워진 곡면을 그림으로 나타낸 적이 있다.

이것 역시 베지어 곡선의 특성을 이용해서 미술적인 조형을 나타낸 예시라고 할 수 있겠다.
profile
https://me.shtelo.org/

0개의 댓글