IDL/Math

TRIANGULATE 프로시저 및 TRIGRID 함수의 이해 [1]

이상우_IDL 2016. 5. 4. 23:43
728x90

오늘 언급하고자 하는 주제는 IDL에서 2차원 내삽에 있어 자주 사용되는 TRIANGULATE 프로시저 및 TRIGRID 함수에 관한 내용입니다. 이 함수들은 2차원 공간상에 분포하는 데이터 포인트들이 있을 때, 데이터가 없는 지점에서의 값을 산출하는 역할을 합니다. 내부적으로는 Delaunay Triangulation 또는 들로네 삼각법이라고 부르는 기법이 사용되는데, 예전에 이러한 기법에 기반을 둔 SPH_SCAT 함수에 관하여 이 블로그에서 관련 게시물을 올린 적이 있었습니다. 하지만 이 게시물에서는 SPH_SCAT 함수가 이러한 기법을 사용한다는 언급만 간단히 한 다음, 함수 자체의 사용법 위주로 소개를 했었는데요. 오늘은 이 Delaunay Triangulation이라는 기법 자체에 좀 더 촛점을 맞춰서 소개해보고자 합니다. TRIANGULATE 및 TRIGRID가 바로 이 기법 자체에 더 가까운 기능을 수행하므로, 이들의 사용법과 함께 설명을 해보기로 하겠습니다. 다만, 자세한 설명을 위하여 내용이 다소 길어질 것 같기 때문에 몇 차례에 걸쳐서 나누어 올리도록 하겠습니다.


이 기법은 2차원 공간상에 불규칙적으로 분포하는 데이터 포인트들이 있는 상태에서 또 다른 포인트에서의 값을 산출하기 위하여 사용됩니다. 따라서 설명을 위해서는 불규칙한 분포를 하는 데이터 포인트들이 많은 예제 데이터를 사용하는 것이 좋을 수도 있겠지만, 개념에 대한 명확한 이해를 위해서는 매우 간단한 사례부터 보는 것이 좋을 것이라 생각합니다. 그래서 다음과 같이 4개의 데이터 포인트들이 존재하는 상태를 가정해 보겠습니다. 이 4개의 포인트들의 X, Y 좌표 및 데이터값에 해당되는 배열들은 다음과 같습니다. 그리고 PLOT 및 TEXT 함수를 사용하여 데이터 포인트들 및 그 값을 함께 표출하였습니다.


v = 3/COS(60*!DTOR)*SIN(60*!DTOR)

x = [2, 8, 5, 11]

y = [2, 2, v+2, v+2]

z = [1, 3, 5, 1]

win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)

pl = PLOT(x, y, XRANGE=[0, 12], YRANGE=[0, 9], ASPECT_RATIO=1, LINESTYLE=6, $

  SYMBOL='circle', SYM_SIZE=2, SYM_COLOR='black', /SYM_FILLED, $

  SYM_FILL_COLOR='green', /CURRENT)

FOR j = 0, N_ELEMENTS(x)-1 DO $

  tx = TEXT(x[j]+0.2, y[j]+0.2, STRING(z[j], FORMAT='(F3.1)'), /DATA)



이 그림에서 보이는 4개의 포인트들의 좌표값을 보면 v라는 변수를 사용해서 다소 요상하게 좌표값을 준 것이 눈에 띄는데요. 이것은 들로네 삼각법에 대한 개념 이해를 쉽게 하기 위하여 의도적으로 설정해본 것입니다. 이와 같이 4개의 포인트들이 존재하는 상태에서다음과 같이 데이터값이 존재하지 않는 특정한 지점에 대하여 데이터값을 산출해보고자 합니다. 이 지점의 좌표는 다음 예제 코드의 내용과 같고, 여기서는 SYMBOL 함수를 사용하여 표시해 보았습니다. 사실 이 지점의 좌표값도 그리 평범하지는 않은데, 데이터 포인트들의 경우와 마찬가지로 차후에 개념 이해를 좀 더 쉽게 하기 위한 사전 포석이라고 봐두시면 됩니다. 하여간 이 지점의 위치를 그림으로 보면 다음과 같습니다.


xp = 5.0

yp = 3/COS(30*!DTOR)*SIN(30*!DTOR)+2

sy = SYMBOL(xp, yp, SYMBOL='circle', SYM_SIZE=2, SYM_COLOR='black', /SYM_FILLED, $

  SYM_FILL_COLOR='red', /DATA)



이제 이 붉은색 포인트에서의 값을 주변의 데이터값들을 기반으로 계산하기 위해서 들로네 삼각법이 등장합니다. 여기서는 들로네 삼각형이라는 개념이 등장하는데, 원래 있던 데이터 포인트들을 기반으로 세 개씩의 포인트들로 이루어진 삼각형들을 마치 세포들처럼 촘촘히 그려줄 수 있습니다. 이러한 삼각형들을 들로네 삼각형이라고 합니다. 지금 우리가 다루고 있는 4개의 데이터 포인트들에 대해서는 들로네 삼각형들이 다음 그림과 같이 얻어집니다.



즉, 이 그림에서 보는 바와 같이 들로네 삼각형들은 선들이 서로 겹치지 않게 그려져야 합니다. 따라서 우리가 다루고 있는 4개의 포인트들에 대해서는 총 2개의 들로네 삼각형이 존재합니다. 물론 데이터 포인트가 더 많다면 들로네 삼각형의 갯수도 더욱 많아지게 됩니다. 그런데, 위와 같은 들로네 삼각형의 형태를 어떻게 얻었는가에 대한 궁금증이 나올 수 있는데, 바로 TRIANGULATE 프로시저가 그 역할을 합니다. 즉, TRIANGULATE 프로시저는 주어진 데이터 포인트들에 대한 모든 들로네 삼각형들의 기하학적 연결성 정보를 산출하는 역할을 합니다. 실제로 위와 같은 들로네 삼각형들의 연결성 정보를 얻기 위하여 사용된 코드의 내용은 다음과 같습니다.


TRIANGULATE, x, y, tr, b

HELP, tr


여기서 핵심적인 역할을 하는 TRIANGULATE 프로시저는 포인트들의 X, Y 좌표값을 담은 배열인 x, y만을 입력인자로 받으면 됩니다. 그 뒤에 붙는 tr, b는 산출되어 돌려받는 인자들입니다. 들로네 삼각형을 구하는데 있어서는 포인트들의 X, Y 좌표만 필요할 뿐, 포인트마다의 데이터값은 전혀 필요가 없기 때문입니다. 그러면 이렇게 돌려받은 tr, b의 정체는 무엇일까요? 우선 tr부터 보면 이것은 들로네 삼각형들의 연결성 정보를 담은 2차원 배열의 형태를 갖습니다. 이 예제에서 얻어진 tr의 경우 3X2의 형태를 갖는 정수값 배열이 됩니다. 왜 3X2의 형태를 갖느냐 하면, 2는 들로네 삼각형의 갯수에 해당되고 3은 각 삼각형을 구성하는 포인트들의 인덱스에 해당되기 때문입니다. 개념이 다소 복잡하게 느껴질 수도 있습니다. 중요한 것은, 이 정보를 활용하면 들로네 삼각형들을 위의 그림과 같이 실제로 그려볼 수가 있게 된다는 것입니다. 이렇게 들로네 삼각형들을 실제로 그려보기 위하여 POLYGON 함수를 사용했는데, 그 내용은 다음 예제코드와 같습니다.


sz = SIZE(tr, /DIM)

FOR j = 0, sz[1]-1 DO BEGIN

  vtx = x[tr[*, j]]

  vty = y[tr[*, j]]

  pg = POLYGON(vtx, vty, FILL_BACKGROUND=0, /DATA)

  pg.Order, /SEND_TO_BACK

ENDFOR


이와 같은 들로네 삼각형을 얻는 목적은, 어떤 특정한 포인트에 대한 데이터값을 내삽할 때 바로 그 포인트가 속한 들로네 삼각형을 이루는 세 개의 데이터 포인트들의 값이 내삽이 투입되도록 하기 위해서입니다. 따라서 앞서 표시했던 그 붉은색 포인트의 경우 이 포인트를 커버하는 들로네 삼각형은 다음 그림에서 붉은색 선으로 그려진 삼각형이 됩니다. 이 삼각형을 구성하는 세 포인트의 데이터값들(1.0, 3.0, 5.0)을 기반으로 내삽을 수행하여 이 붉은색 포인트에서의 값을 산출하게 됩니다.



그런데 이 붉은색 선으로 된 들로네 삼각형을 보면 그 형태가 정삼각형임을 눈치채셨는지 모르겠습니다. 사실 들로네 삼각형들이 이렇게 기하학적으로 정확한 정삼각형이 되도록 하기 위하여, 데이터 포인트의 좌표값들을 앞에서와 같이 다소 평범하지 않는 값이 되도록 설정해본 것입니다. 그리고 붉은색 포인트의 삼각형 내에서의 위치 자체도, 삼각형의 세 꼭지점으로부터 똑같은 거리에 존재하도록 하였습니다. 이렇게 하면 개념 이해가 좀 더 쉬울 것으로 보이기 때문입니다. 그러면 이 붉은색 포인트에서의 내삽 값은 얼마가 될까요? 어차피 삼각형의 세 포인트로부터 모두 동일한 거리에 있기 때문에, 각 데이터 포인트로부터 받는 영향의 정도는 다 똑같을 것입니다.  즉, 각 데이터 포인트를중심으로 하는 동일한 반경의 원 세 개를 표시한 다음 그림을 보면 이해가 빠를 것 같습니다.



따라서 붉은색 포인트에서의 내삽 값이 얼마가 될지는 쉽게 추산이 가능합니다. 삼각형 세 포인트에서의 z값이 각각 1.0, 3.0, 5.0이기 때문에, 결국은 이 값들의 평균값인 3.0이 됩니다. 따라서 내삽 값은 3.0이 될 것임을 추측해 볼 수 있습니다. 그렇다면 이러한 내삽을 실제로 수행하는 역할은 무엇이 하느냐가 또 다른 관심사가 될텐데요. 바로 TRIGRID 함수가 여기서 등장하게 됩니다. 그래서 다음 회에서는 이 TRIGRID 함수를 사용해서 들로네 삼각법 기반의 내삽 연산을 수행하는 방법에 관해서 구체적으로 소개하기로 하겠습니다.

LIST