IDL/New Graphics

PLOT3D에서 육면체(Cube) 심볼을 사용해보자

이상우_idl 2017. 2. 13. 20:59
728x90
반응형

제가 예전에 NG 체계의 PLOT3D 함수에서 구체(Sphere)를 심볼로 사용하는 방법에 관하여 설명했던 게시물을 여기에 올린 적이 있었습니다. 그 취지는 PLOT3D 함수가 표출하는 그림은 XYZ축을 갖는 3차원 공간임에도 불구하고, 지원되는 심볼들은 2차원 평면 기반의 것들 뿐이었기 때문에, 3차원 공간상에서 3차원다운 심볼들을 사용하는 방법을 소개하기 위함이었습니다. 그래서 이 게시물에서는 구체심볼을 구현하기 위하여 ORB라는 함수를 사용할 수 있다는 언급을 드린 바 있습니다.


오늘 소개할 내용은 기본 골격은 이 게시물의 내용과 크게 다르지 않습니다. 다만 구체 심볼 대신 육면체(Cube) 심볼을 사용하는 방법을소개하고자 합니다. 그래도 새로 작성하는 게시물인 만큼 예제 그림은 지난번과는 좀 다르게 그려보기로 하겠습니다. 다음과 같은 방식으로 XYZ 각 방향의 좌표값들로 구성된 px, py, pz 배열들을 생성해 봅시다. 이 내용은 IDL 도움말에서 제공되는 PLOT3D 함수에 관한 내용에 소개된 예제를 약간 변형해 본 것입니다.


t = [0:40:0.4]

px = COS(t/4)*(1+t/10)

py = SIN(t/4)*(1+t/10)

pz = 4*SIN(t/2)


일단 먼저 ORB 함수를 사용하여 구체 심볼의 형태로 표출을 해보기 위하여 PLOT3D 함수를 다음과 같은 방식으로 사용해 보았습니다. 세부 속성 설정을 위하여 다양한 속성들이 사용되고 있음을 참조하시기 바랍니다. 이러한 과정을 통하여 표출된 그림의 모습은 다음과 같습니다.


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

scp = PLOT3D(px, py, pz, AXIS_STYLE=2, THICK=2, COLOR='green', $

  XRANGE=[-5, 5], YRANGE=[-5, 5], ZRANGE=[-5, 5], $

  SYM_OBJECT=ORB(), SYM_SIZE=2, SYM_COLOR='magenta', $

  XTICKINTERVAL=1, YTICKINTERVAL=1, ZTICKINTERVAL=1, $

  XMINOR=0, YMINOR=0, ZMINOR=0, $

  XTICKLEN=0.02, YTICKLEN=0.02, ZTICKLEN=0.02, $

  ASPECT_RATIO=1, ASPECT_Z=1, LINESTYLE=6, CLIP=0, /CURRENT)



이제 육면체 심볼을 사용해서 표출을 해보고자 하는데요. 사실 IDL 자체적으로는 이러한 옵션을 제공하고 있지는 않습니다. 따라서 큐브형 폴리곤을 생성하는 작업을 유저가 직접 해야 한다는 문제가 생깁니다. 그래서 이 기능은 제가 직접 만들어 보았습니다. 이 기능을 사용하기 위해서는 아래에 첨부 및 링크를 해놓은 cube.pro라는 파일을 받아놓기만 하면 됩니다. 이 파일을 작업 디렉토리에 또는 경로 설정된 디렉토리안에 넣어두면 언제든 불러서 쓸 수 있습니다.


cube.pro


파일 받기


이제 이 기능을 사용하여 큐브형 폴리곤의 형태로 심볼들을 표출하기 위하여, 위의 예제코드의 내용을 다음과 같이 변경해서 사용해 보았습니다. 위의 예제코드와 아래 예제코드의 차이점은 SYM_OBJECT 속성에 CUBE()가 사용되었고 SYM_SIZE의 값을 3으로 변경한 두가지 뿐입니다. 이와 같은 방법을 사용하여 표출된 그림의 모습은 다음과 같습니다.


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

scp = PLOT3D(px, py, pz, AXIS_STYLE=2, THICK=2, COLOR='green', $

  XRANGE=[-5, 5], YRANGE=[-5, 5], ZRANGE=[-5, 5], $

  SYM_OBJECT=CUBE(), SYM_SIZE=3, SYM_COLOR='magenta', $

  XTICKINTERVAL=1, YTICKINTERVAL=1, ZTICKINTERVAL=1, $

  XMINOR=0, YMINOR=0, ZMINOR=0, $

  XTICKLEN=0.02, YTICKLEN=0.02, ZTICKLEN=0.02, $

  ASPECT_RATIO=1, ASPECT_Z=1, LINESTYLE=6, CLIP=0, /CURRENT)



보시다시피 각각의 데이터 포인트들이 큐브형 폴리곤의 형태로 표출되어 있음을 확인할 수 있습니다. 심볼이 구체일 때와 비교했을 때 심볼 자체의 크기를 SYM_SIZE 속성으로 조정하는데 있어서 약간의 조절만 해주면 적절한 크기로 심볼들을 표출하는 것이 얼마든지 가능합니다. 따라서 관심있으신 유저들께서는 위에 첨부한 cube.pro 파일을 받아서 사용하시면 되겠습니다.


표출 방식들에 관하여 좀 더 언급해 본다면, 이와 같이 PLOT3D 함수로 3차원 공간을 표출하는데 있어서 위의 그림에서처럼 XYZ 공간이 박스의 형태로 표출된 것은 AXIS_STYLE 키워드의 값을 2로 설정했기 때문입니다. 이 키워드의 디폴트 값은 1입니다. 따라서 이 키워드의 값을 1로 설정하거나 아예 키워드 자체를 사용하지 않음으로써 디폴트 설정으로 표출하면 그 모습은 다음 그림과 같습니다.


scp = PLOT3D(px, py, pz, AXIS_STYLE=1, THICK=2, COLOR='green', $

  XRANGE=[-5, 5], YRANGE=[-5, 5], ZRANGE=[-5, 5], $

  SYM_OBJECT=CUBE(), SYM_SIZE=3, SYM_COLOR='magenta', $

  XTICKINTERVAL=1, YTICKINTERVAL=1, ZTICKINTERVAL=1, $

  XMINOR=0, YMINOR=0, ZMINOR=0, $

  XTICKLEN=0.02, YTICKLEN=0.02, ZTICKLEN=0.02, $

  ASPECT_RATIO=1, ASPECT_Z=1, LINESTYLE=6, CLIP=0, /CURRENT)



그리고 AXIS_STYLE의 값을 처음에 했던 것처럼 다시 2로 설정하되, 추가적으로 다음과 같은 방식으로 일부 축 라인들을 제거할 수도 있습니다. 이 경우의 표출 결과는 다음 그림과 같습니다.


scp = PLOT3D(px, py, pz, AXIS_STYLE=2, THICK=2, COLOR='green', $

  XRANGE=[-5, 5], YRANGE=[-5, 5], ZRANGE=[-5, 5], $

  SYM_OBJECT=CUBE(), SYM_SIZE=3, SYM_COLOR='magenta', $

  XTICKINTERVAL=1, YTICKINTERVAL=1, ZTICKINTERVAL=1, $

  XMINOR=0, YMINOR=0, ZMINOR=0, $

  XTICKLEN=0.02, YTICKLEN=0.02, ZTICKLEN=0.02, $

  ASPECT_RATIO=1, ASPECT_Z=1, LINESTYLE=6, CLIP=0, /CURRENT)

scp.AXES[2].HIDE = 1

scp.AXES[6].HIDE = 1

scp.AXES[7].HIDE = 1

scp.AXES[8].SHOWTEXT = 1

scp.AXES[8].TICKFONT_SIZE = 9



그리고 다음과 같이 PERSPECTIVE 키워드를 사용하여 좀 더 원근감있는 모습으로 표출하는 것도 가능합니다. 이 경우의 모습은 다음 그림과 같습니다.


scp = PLOT3D(px, py, pz, AXIS_STYLE=2, THICK=2, COLOR='green', $

  XRANGE=[-5, 5], YRANGE=[-5, 5], ZRANGE=[-5, 5], $

  SYM_OBJECT=CUBE(), SYM_SIZE=3, SYM_COLOR='magenta', $

  XTICKINTERVAL=1, YTICKINTERVAL=1, ZTICKINTERVAL=1, $

  XMINOR=0, YMINOR=0, ZMINOR=0, $

  XTICKLEN=0.02, YTICKLEN=0.02, ZTICKLEN=0.02, $

  ASPECT_RATIO=1, ASPECT_Z=1, LINESTYLE=6, CLIP=0, /PERSPECTIVE, /CURRENT)

scp.AXES[2].HIDE = 1

scp.AXES[6].HIDE = 1

scp.AXES[7].HIDE = 1

scp.AXES[8].SHOWTEXT = 1

scp.AXES[8].TICKFONT_SIZE = 9



이 그림을 보면 여백 조정이 좀 더 필요할 것으로 보이는데요. 다음과 같이 MARGIN 키워드를 추가적으로 사용해주면 어느 정도 충분한 여백의 확보가 가능합니다.


scp = PLOT3D(px, py, pz, AXIS_STYLE=2, THICK=2, COLOR='green', $

  XRANGE=[-5, 5], YRANGE=[-5, 5], ZRANGE=[-5, 5], $

  SYM_OBJECT=CUBE(), SYM_SIZE=3, SYM_COLOR='magenta', $

  XTICKINTERVAL=1, YTICKINTERVAL=1, ZTICKINTERVAL=1, $

  XMINOR=0, YMINOR=0, ZMINOR=0, $

  XTICKLEN=0.02, YTICKLEN=0.02, ZTICKLEN=0.02, $

  ASPECT_RATIO=1, ASPECT_Z=1, LINESTYLE=6, CLIP=0, /PERSPECTIVE, $

  MARGIN=[0.1, 0.3, 0.1, 0.1], /CURRENT)



참고로 언급한다면, 큐브형 폴리곤을 생성하는 역할을 하는 cube.pro 프로그램의 경우 내부적으로는 MESH_OBJ라는 프로시저를 사용하여 큐브 형태의 폴리곤 렌더링을 수행합니다. 물론 큐브형 외에 또 다른 형태의 폴리곤들을 구성하여 심볼로 활용하는 것도 얼마든지 가능합니다. 다만 폴리곤의 형태가 복잡할 경우 꼭지점(Vertex)들의 갯수가 늘어나기 때문에 다량을 표출할 경우 시스템 퍼포먼스에 지장을 약간 줄 가능성도 있음을 유의해야 합니다.

cube.pro
0.0MB
반응형