글목록

2022년 10월 8일

베지어 곡선(Bezier)을 모양을 유지하면서 점 추가/분할하기

파워포인트에 삽입되는 모든 곡선의 각 segment들은 베지어 곡선이며, '점편집' 메뉴를 이용해서 시작 및 끝점과 제어점을 수정할 수 있습니다.



만약, 아래와 같이 점을 곡선의 중간 지점에 추가하고자 한다면, 곡선의 모양이 찌그러지면서 사용자가 원하는대로 수정되지 않습니다. 심지어는 새로 추가한 점 뿐만 아니라, 점을 삽입하려는 segment의 앞, 뒤 점까지 뒤틀리면서 모양이 엉망이 됩니다.



Powerpoint에 포함되는 도형들이 벡터형 방식이라, 점 편집 기능만 충분히 편리하게 해주면 좋겠지만, 위의 예와 같이 Powerpoint를 이용하여 곡선형 도형을 작업하는 매우 번거롭고 귀찮은 작업입니다. 따라서, Powerpoint에서 도형 작업은 특수한 방법을 사용하지 않으면 작업하기가 어렵고, 결국 벡터형 그래픽을 지원해주는 소프트웨어를 이용하여, SVG 파일이나 메타파일로 만들어 삽입하는 방법이 그나마 도형 작업을 쉽게하는 방법이 될 것입니다.


만약, 점 편집을 자유롭게 할 수만 있다면 Powerpoint는 충분히 좋은 그래픽 도구가 될 수도 있습니다. CAD 수준의 정밀도를 바라지는 않지만, 간단한 개념도 정도를 그리는 수준에서 별도의 소프트웨어 도움없이도 쉽게 작업이 가능해질 수 있습니다.


1개의 Bezier 곡선에 현재 모양을 그대로 유지하면서 점을 추가할 수 있을까요? Powerpoint에서는 1개의 곡선을 정의하기 위해서는 시작점과 2개의 제어점, 끝점으로 구성되는 Cubic Bezier 곡선을 사용합니다. 따라서, 곡선상의 임의의 점을 삽입하는 문제는, 제어점을 어떻게 지정해줄 것인가하는 문제로 귀결됩니다.

이번 글에서는 이 문제에 대한 수학적인 증명과 제어점의 변동에 대해 설명드릴 예정입니다. 다만, 매크로 코드는 포함하지 않았습니다. 원리를 알면 계산용 함수는 쉽게 구현이 가능할 것이기 때문입니다.



위와 같이 P1, P4를 끝점으로 하고, P2, P3를 제어점으로 하는 빨간색 곡선을 가정해보겠습니다. 이 곡선상의 임의의 점 P에 점을 하나 추가한다고 하겠습니다.

Bezier 곡선의 매개 변수를 T라고 하고, S=1-T로 정의하면, 임의의 점 P의 좌표는 아래와 같이 정의됩니다. 이때, P를 그리그 위해서는 P1~P2를 연결하는 선을 T:S로 분할하는 점 P2', P2~P3를 T:S로 분할하는 점과 P2'을 다시 T:S로 분할하는 점 P3'과 P4'(=P)의 좌표는 아래와 같이 정의됩니다.



이제 P1~P4'을 끝점으로 하고, P2', P3'을 제어점으로 하는 cubic Bezier 곡선상에 있는 임의의 점 p를 아래와 같이 풀어주면, p는 P1, P2, P3, P4로 생성된 Bezier 곡선상의 한 점임을 계산할 수 있습니다.

따라서, 매개변수 T값을 지정하여 P2', P3', P4'만 계산해주면, P4' 위치에 점을 삽입할 수 있게 됩니다. 물론, 위의 계산 결과는 P1~P4' 구간의 곡선이며, P4'~P2 구간에 대한 계산도 동일한 방식으로 수행할 수 있습니다.

즉, Powerpoint에서 매크로를 이용하여 node 정보 (P1, P2, P3, P4)를 읽어온 후, (P1, P2', P3', P4', P5', P6', P4) 좌표를 계산하고, Shapes.AddCurve method를 이용하여 곡선을 생성해주면 원래 곡선에 1개의 점을 추가한 도형이 생성됩니다.


얼핏 생각해보면, 분할점 P4'만 계산한 후, 이미 있는 도형에 점을 삽입하는 방식이 되면 좋겠습니다만, 안타깝게도 Powerpoint 매크로에서는 제어점을 추가하는 method가 없으며, 강제로 점을 추가하게 되면  작업창에서 점 편집을 이용할 때와 마찬가지로 곡선의 모양이 뒤틀릴 수 있으며, 작업량이 100개 이상으로 많다면 속도가 급격히 느려지는 문제가 있어서, 각 점 P2'~P6'에 대해 계산한 후 곡선을 새로 생성하는 방식을 추천드립니다.



많이 본 글 :