오늘은 "TRIANGULATE 프로시저 및 TRIGRID 함수의 이해"라는 주제로 두번째 시간입니다. 지난 회 게시물에서는, 기본적인 개념 설명을 위하여 가상의 데이터 포인트 4개를 가정하고 이 포인트들을 연결하는 들로네(Delaunay) 삼각형을 그려 보았습니다. 그리고 데이터 포인트들과는 별개인 임의의 한 포인트에 대한 값을 내삽에 의하여 산출하려면, 이 들로네 삼각형을 바탕으로 TRIGRID함수를 사용해야 한다는 언급을 했었는데요. 오늘은 이 TRIGRID 함수의 사용법을 소개하고 그 결과를 도식적으로 살펴보는 작업들을 해보기로 하겠습니다. 일단 데이터 포인트의 정의 및 기본적인 표출 등에 있어서는, 지난 회에서 소개했던 예제 코드들을 상당 부분 그대로 활용을 하고자 합니다. 그 내용은 다음과 같습니다. 이 예제 코드에 관한 설명은 이미 지난 회에서 충분히 했었기 때문에 여기서는 생략하겠습니다. 이 예제 코드를 실행하면 그 결과는 다음 그림과 같습니다.
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)
TRIANGULATE, x, y, tr, b
HELP, tr
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
기본적으로 데이터 포인트들을 생성하고 이들을 포인트 단위로 표출하였고, 들로네 삼각형까지는 그려진 상태입니다. 이제 내삽값을구하고자 하는 새로운 포인트의 좌표를 다음과 같이 정하고, 이 점의 위치를 표시해 봅시다.
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)
지난 회 게시물에서도 언급했듯이, 포인트의 좌표값을 굳이 저렇게 정의한 이유는 왼쪽 들로네 삼각형의 중앙에 정확히 위치한 포인트에 대하여 내삽값을 산출해보기 위해서입니다. 우리는 이제 이 빨간 점의 위치에서의 값을 기존의 데이터 포인트들을 기반으로 산출해보고자 합니다. 이 작업을 위하여 TRIGRID 함수를 다음과 같이 사용해 보았습니다.
result = TRIGRID(x, y, z, tr, XOUT=[0, xp], YOUT=[0, yp])
HELP, result
PRINT, result
먼저 여기서 TRIGRID 함수가 사용된 방식에 대한 이해가 필요합니다. 위의 TRIGRID 함수내에서 첫번째부터 네번째까지의 인자들은 기존에 이미 정의했거나 산출했던 것들입니다. 즉, x, y, z는 4개의 데이터 포인트들의 위치 및 값에 해당되며, tr은 이를 바탕으로 들로네 삼각형들의 기하학적 정보들을 담도록 TRIANGULATE 프로시저를 실행하여 얻었던 항목입니다. 따라서 x, y, z, tr을 순서대로 인자로 사용하면 됩니다.
그런데 그 바로 뒤에서는 XOUT, YOUT 키워드가 보입니다. 이 키워드에는 내삽 값을 산출하고자 하는 새로운 포인트의 좌표값들이 X, Y 성분별로 투입되어야 합니다. 사실 우리가 내삽값을 구하고자 하는 위치의 좌표는 (xp, yp)이므로, 마음같아서는 XOUT=xp, YOUT=yp와 같이 표기를 하고 싶기는 합니다. 하지만 XOUT, YOUT 키워드에는 적어도 두 개 이상의 값들로 이루어진 배열만 사용이 가능하도록 되어 있습니다. 따라서 TRIGRID 함수가 작동을 하게 하려면, XOUT 키워드에 대해서는 xp외에 또 다른 좌표값이 어떻게든 하나 이상은 포함되어야만 합니다. YOUT도 마찬가지입니다. 따라서 위와 같이 일부터 0이란 값을 추가하여 배열로 만들어서 넣었습니다. 사실 지금은 개념 설명을 위하여 제가 단 하나의 포인트를 정의한 상황이지만, 대개의 경우는 새로운 포인트들 단 하나가 아닌 여러 개를 설정하여 연산을 수행하는 경우가 많긴 합니다.
어쨌든 위와 같은 방식으로 TRIGRID 함수를 실행하면 그 결과인 result를 통하여 얻게 되는 내삽값들을 총 4개가 됩니다. 그 이유는 XOUT=[0, xp], YOUT=[0, yp]이기 때문에, 좌표가 (0, 0), (0, yp), (xp, 0), (xp, yp)인 4개의 포인트들에 대하여 내삽된 값들이 얻어지기 때문입니다. 물론 우리에게는 (xp, yp) 좌표에 대한 내삽값만 필요하겠지요. 위의 예제 코드에서는 result의 값들을 모두출력하도록 되어 있으므로, 실제 출력된 값들을 확인해보면 다음과 같습니다.
0.00000 0.00000
0.00000 3.00000
즉 우리의 관심사인 (xp, yp) 포인트에서의 내삽값은 3.0임을 확인할 수 있습니다. 이미 충분히 예상되었던 결과입니다. 그러면 다음과 같이 TEXT 함수를 사용하여 이 포인트 근방에 내삽값이 표시되도록 해봅시다. 그러면 다음 그림과 같이 데이터 포인트들외에 내값값을 구하고자 하는 포인트의 위치 및 내삽값까지 모두 표출되도록 할 수 있습니다. 이러면 좀 더 보기가 좋겠지요.
txr = TEXT(xp+0.2, yp+0.2, STRING(result[1, 1], FORMAT='(F4.2)'), COLOR='red', /DATA)
그러면 이제는 xp, yp의 값들 다양하게 바꿔가면서 내삽값들을 산출해볼 수 있게 되었습니다. 예를 들어 좌표가 (5, 6)인 포인트에서의 내삽값을 구해보고자 한다면, 위의 예제 코드에서 xp, yp가 정의되는 부분만 다음과 같이 바꿔보면 됩니다. 이 경우에 대한 결과는 다음 그림과 같습니다.
xp = 5.0
yp = 6.0
즉, 4.31이라는 내삽값이 산출되어 있음을 확인할 수 있습니다. 데이터 값이 5.0인 지점에 가까운 상태이므로 충분히 그럴듯한 값이라고 생각이 됩니다. 좌표가 (3, 3)인 경우는 다음과 같이 1.91이라는 값이 산출되는데 역시 나름 의미있는 내삽값이 산출된 것을 보입니다.
xp = 3.0
yp = 3.0
그런데 말입니다. 다음과 같이 좌표가 (3, 4)인 경우에 대하여 연산을 수행해보면 어떤 내삽값이 산출되는가 확인해보세요. 아마 다음그림과 같이 0.0이란 값이 산출되어 있을 것입니다.
xp = 3.0
yp = 4.0
분명히 뭔가 좀 이상한 결과가 나온 것 같습니다. 들로네 삼각형의 약간 외곽이 위치한 점이긴 하지만, 데이터 포인트 값들의 영향권안에 분명히 있기 때문에, 이렇게 0.0이 산출되었다는 것은 뭔가 문제가 있다는 얘기가 되겠지요. 사실 이 문제의 핵심은 TRIGRID 함수를 위에서와 같이 사용하는 경우 내삽(interpolation) 연산만 수행될 뿐 외삽(extrapolation) 연산은 전혀 진행되지 않는다는 것입니다. 즉, 지금과 같이 데이터 포인트가 들로네 삼각형 외곽에 있는 경우에 대해서는 아무런 연산이 진행되지 않으므로 그냥 0.0을 묵시적으로 산출값으로 전달해버리는 셈입니다. 따라서 외삽 연산까지도 수행이 가능하도록 별도의 설정을 해줘야 하는데, 이를 위해서는 TRIGRID 함수를 다음과 같이 사용해야 합니다.
result = TRIGRID(x, y, z, tr, XOUT=[0, xp], YOUT=[0, yp], EXTRAPOLATE=b)
이 내용이 아까와는 어떤 차이가 있을까요? 여기서는 EXTRAPOLATE라는 키워드가 추가적으로 사용이 되었습니다. 그런데 이 키워드에 부여된 값을 보면 b라고 되어 있습니다. 이 b는 어디에 있었을까요? 앞서 소개된 예제 코드의 내용에서 중간을 보면 다음과 같이 TRIANGULATE 프로시저에 등장하는 것을 확인할 수 있습니다.
TRIANGULATE, x, y, tr, b
사실 TRIANGULATE 프로시저를 실행한 후 얻어지는 결과로서, 현재 존재하는 모든 들로네 삼각형들이 합쳐진 집합체의 외곽선을 구성하는 데이터 포인트들의 인덱스들로 이루어진 배열입니다. 이 정보를 TRIGRID 함수에 전달하여 외삽에 사용하도록 해주면 된다는 점을 염두에 두면 됩니다. 이제 TRIGRID 함수가 외삽까지 수행하도록 설정을 한 후 다시 한번 (3, 4) 좌표에 대한 연산을 수행해보면 이제는 다음 그림과 같이 0.0이 아닌 다른 결과가 나오게 됩니다.
xp = 3.0
yp = 4.0
비슷한 방식으로 (3, 6) 좌표에 대한 연산을 수행하면 또 유사한 방식으로 외삽값이 산출됩니다.
xp = 3.0
yp = 6.0
그런데 여기서 또 유념해야 할 것이 있는데요. 다음과 같이 (1, 6) 좌표에 대한 연산을 수행하는 경우입니다. 이 경우에는 다음 그림과 같이 0.0이 산출됩니다.
xp = 1.0
yp = 6.0
그런데 분명히 TRIGRID 함수가 외삽 연산을 할 수 있도록 했는데도 불구하고 결과는 0.0입니다. 그 이유는, 모든 데이터 포인트들의 X축 범위 또는 Y축를 완전히 벗어난 위치에 있는 포인트에 대해서는 외삽 조차도 수행이 되지 않기 때문입니다. 따라서 모든 데이터 포인트들이 이루는 사각형의 영역내에서만 내삽이든 외삽이든 가능하고, 이 영역을 벗어나면 아예 연산 자체가 수행되지 않는다는 점을 기억해둘 필요가 있습니다. 즉 다음 그림의 파란색 선으로 이루어진 사각형 영역이 바로 TRIGRID의 내삽 또는 외삽 연산이 실질적으로 수행 가능한 유효 영역이라고 보면 되겠습니다.
오늘은 TRIGRID 함수의 사용 방법을 매우 단순화된 예제를 통하여 알아보았습니다. 다음 회에서는 좀 더 실전에서 나옴직한 예제, 즉 데이터 포인트들이 좀 더 많은 예제를 사용하여 결과를 산출하고 표출하는 방법에 대하여 알아보기로 하겠습니다.
'IDL > Math' 카테고리의 다른 글
| RANDOMU 함수를 사용한 난수 생성 (Part 2) (0) | 2016.08.01 |
|---|---|
| RANDOMU 함수를 사용한 난수 생성 (Part 1) (0) | 2016.07.28 |
| TRIANGULATE 프로시저 및 TRIGRID 함수의 이해 [1] (0) | 2016.05.04 |
| MPFITELLIPSE 함수를 이용한 타원형 궤적 근사 (0) | 2016.04.25 |
| 세 점을 잇는 원의 궤적을 구하고 그려보기 (0) | 2016.04.22 |