세 점을 지나는 곡선

2014. 10. 26. 18:03Programming/Algorithm

반응형

  세 지점을 지나는 곡선을 만드는 문제는 생각보다 난제였다. 우선 세 점을 지나는 원을 구하면 구했지, 세 점을 지나는 곡선에 관심을 갖는 사람이 적었다. 게다가 세 점을 지나는 곡선을 쓸만한 데가 어디 있겠는가. 사실상 두 포인트를 찍어 직선을 긋고, 드래그를 이용해서 곡선을 그리는 방식이 덜 직관적일 수는 있겠지만, 부드러운 곡선을 만들어내기는 굉장히 쉽다.


  뭐가 어찌됐건, 나는 세 지점을 지나는 곡선이 필요했다. 내게 주어진 정보는 세 점을 지나는 원의 알고리즘, 타원을 이용하여 곡선을 그리는 방법 등이었다. 그러나 애석하게도 둘 다 세 점을 지나는 곡선을 그리는 방법에는 적합치 않았다.


  우선 세 점을 지나는 원의 경우는 원하는 형상의 곡선이 그려지지 않는다. 당연히 세 점을 지나는 원을 그린 후, 일정 영역을 잘랐으니 그 곡선이 이쁘게 나올리 만무하다. 여하튼 이러한 사유로 세 점을 지나는 원은 기각된다.


  다음으로 세 점을 지나는 타원의 경우에는 좀 더 큰 문제가 있었다. 세 점을 지나는 타원을 그리는 것 까지는 방정식을 세운 후 가우스 소거법을 이용해서 구할 수 있었다. 이 과정에서 무시할 수 없는 양의 오차가 있었던 것도 문제였지만, 더 큰 문제는 점을 이동시켰을 때 발생했다. 우선 단축 혹은 장축의 양 끝점을 구하기 무척 난해했다. 게다가 드래그 한 포인트를 할 때마다 어느게 장축이고 어느게 단축인지까지 판별해야했다. 코드로 짜기는 커녕, 종이 위에 연필로 수식을 계산하는데도 한계가 있었다.


  결국 마지막으로 생각해낸 것이 베지어 곡선을 응용한 방법이었다. 베지어 곡선은 두 개의 점과, 그 사이에 주어진 점들을 이용하여 곡선을 그린다. 다만 시점 t에서 인접한 두 점을 t:(1-t)로 내분한 것이 해당 곡선의 자취가 된다. 이로 인해서 베지어 곡선의 차수가 올라가면 올라갈수록 계산량이 많아진다는 문제와, 시점과 종점을 제외하면 곡선이 점을 지나지 않는다는 문제가 있었다. 


  그래서 2차 베지어 곡선을 수정해서, 중간점을 시점 t=1/2에서 곡선의 자취라고 가정한 후, 가상의 중간점을 잡은다음 곡선을 그리는 방법을 고안해냈다. 물론 약간의 문제점이 있었다. 세 점을 지나는 곡선은 사실상 무한개이기 때문에, 하나의 곡선을 특정해낼 수가 없었다. 이러한 곡선들 중 하나의 곡선을 특정해내기 위해 생각해낸 조건이 t=1/2였다. 문제점은 여기서 발생한다. 곡선의 기울기가 가장 큰 지점이 항상 t=1/2인 시점이 아니란 것이 바로 그 문제였다. 따라서 어느정도 직관적이긴 하나, 특정 영역에서는 의도하지 않은 곡선이 만들어지게 되는 것이다.


  '이정도면 OK'라는 사인을 받아서 더 이상 연구하지는 않았으나, 외국에서 수학에 대한 박사과정을 밟고 있는 지인에게 물어본 결과 무려 무한급수를 이용하면 구할 수도 있을지 모른다는 얘기였다. 과연 내 인생에서 이 '세 지점을 지나는 곡선'을 정확하게 그리는 알고리즘을 구현해낼 수 있을지는 참으로 의문이다.

반응형