IDL/Math

세 점을 잇는 원의 궤적을 구하고 그려보기

이상우_IDL 2016. 4. 22. 12:28
728x90

오늘 다뤄볼 주제는 2차원 공간상에 존재하는 세 개의 점들을 이어주는 원을 구하고 이를 그려보는 작업입니다. XY축으로 이루어진 공간상에 세 개의 점(Point)들이 있는 경우, 궤적이 이 세 점을 모두 거쳐가는 원은 기하학적으로 반드시 존재하게 되어 있습니다. 예를 들어 다음과 같은 X, Y 좌표를 갖는 세 개의 점들이 있다고 합시다. 일단 이 좌표들을 이용해서 그림을 그려서 이 점들의 분포 양상을 볼 수 있는데, 다음과 같은 예제 코드를 실행하면 됩니다.


x = [2.8, 7.1, 5.9]

y = [6.2, 4.4, 8.3]

win = WINDOW(DIMENSIONS=[500, 400])

pl = SCATTERPLOT(x, y, SYMBOL='circle', /SYM_FILLED, $

  XRANGE=[0, 10], YRANGE=[0, 10], /CURRENT)


여기서는 SCATTERPLOT이라는 NG 체계의 그래픽 함수를 사용하였습니다. 물론 그냥 PLOT 함수를 사용해도 이러한 그림은 충분히 그릴 수 있습니다. 만약 PLOT 함수를 사용할 경우에는 LINESTYLE 속성을 6으로 설정함으로써 점들간의 선이 그려지지 않게만 해주면 됩니다. 어쨌든 이렇게 그려진 그림은 다음과 같습니다.



이제 이 세 점들을 이어주는 원을 구할 차례인데요. IDL에서는 이러한 역할을 수행하는 CIR_3PNT라는 프로시저가 있어서 이것을 사용하면 됩니다. 이 프로시저는 세 점을 거치는 원의 반경 및 중심좌표를 계산해주는 역할을 합니다. 다음과 같은 방식으로 사용하면됩니다. 이 때 세 점의 X 및 Y 좌표값 배열인 x, y가 입력인자로 사용되어야 하고, 그 뒤에 붙는 r, xc, yc라는 변수를 통해서 반경 및 중심좌표 값들을 돌려받는 방식입니다.


CIR_3PNT, x, y, r, xc, yc

PRINT, r, xc, yc


일단 이렇게 돌려받은 중심좌표 값을 사용해서 원의 중심을 먼저 표시해 봅시다. 이를 위하여 다음과 같이 SYMBOL 함수를 하였습니다. 이렇게 하면 다음 그림과 같이 중심점이 진홍색 심볼로 표시됩니다.


cp = SYMBOL(xc, yc, 'circle', /SYM_FILLED, SYM_COLOR='crimson', /DATA)



이번에는 원의 궤적을 그려볼 차례입니다. 원의 궤적을 그리기 위해서는 NG 체계의 그래픽 함수인 ELLIPSE를 사용하는 방법도 있겠지만, 저는 그냥 아주 원론적인 방법을 사용해보기로 하겠습니다. 즉, 원의 궤적을 이루는 점들의 좌표를 구하고 이를 POLYLINE 함수에 사용하여 직접 선을 그리는 방법을 사용하고자 합니다. 이를 위하여, 다음과 같이 원의 중심에 대하여 0~360도 범위의 1도 간격의 각도별로 궤적상의 점들의 좌표를 구하고 이를 POLYLINE 함수에 투입하는 방법을 사용하였습니다. 그 결과는 다음 그림과 같습니다.


degs = FINDGEN(361)

cxp = xc+r*COS(degs*!DTOR)

cyp = yc+r*SIN(degs*!DTOR)

cc = POLYLINE(cxp, cyp, COLOR='forest green', THICK=2, /DATA)



물론 이 그림상에서 보면 원형이 진정한 원(Circle)의 형태가 아닌 것처럼 보이긴 합니다. 그것은 원이 그려진 좌표계의 가로/세로 비율이 그래픽창의 크기에 맞춰진 상태이기 때문입니다. 이 때문에 마치 형태가 왜곡된 것처럼 보이는군요. 만약 이러한 왜곡 없이 진정한 원형의 모습으로 나타내려면, X축 및 Y축의 스케일이 서로 일치해야 합니다. 이렇게 하려면 다음과 같이 ASPECT_RATIO라는 속성의 값을 1로 처리함으로써, 바탕이 되는 플롯의 XY 스케일을 서로 일치시켜주면 됩니다. 그 결과는 다음 그림과 같습니다.


pl.ASPECT_RATIO = 1



물론 이와 같이 XY 축의 스케일을 서로 일치시켜 놓으면, 그래픽창의 가로/세로 스케일과 맞지 않는 경우가 생길 수 있다는 점은 감안해야 합니다. 이러한 문제는 그래픽창의 가로/세로 크기도 조절하거나 X, Y축의 범위를 적절히 조정해주는 방식으로 충분히 해결이 가능합니다.


이와 같이 CIR_3PNT를 활용하면 세 개의 점들을 이어주는 원의 궤적에 관한 기하학적 정보들을 얻을 수 있습니다. 만약에 점들의 갯수가 세 개가 아닌 그 이상이 되면 어떻게 될까요? 그 경우에는 모든 점들을 완벽하게 이어주는 원을 찾는 것이 어려울 수도 있습니다. 물론 완벽하게 이어주는 것이 아니라 가장 그럴싸한 원을 찾는 것은 가능할 수도 있겠지요. 이 문제는 나중에 기회가 되면 다뤄보기로 하겠습니다. 그리고 차원이 하나 더 확장된 버전도 있습니다. 즉, 3차원 공간상에서 기하학적으로 네 개의 점들을 반드시 거쳐가는 구체(Sphere)에 대한 정보를 전달해주는 SPH_4PNT라는 프로시저도 있다는 점 참조해 두시면 좋을 것 같습니다.

LIST