ワイヤーフレーム

さらに, 3次元空間内で線を引いたり, 面を定義してトーンをつけたりするこ とも可能です. 下の図は, 球面調和関数をワイヤフレームで表現するものです. この2次元スカラー場を図示するのに, 縦横に張ったワイヤの凹凸として3次元的に表現しています. データの値の大小がワイヤを張った面の高低となって, 視覚的にデータを把握しやすくなります.

3d06.f90
program sample_3d06

  use dcl
  integer,parameter :: nx=37, ny=37
  real,parameter ::  xmin=   0,  xmax=360,  ymin= -90,  ymax= 90
  real,parameter :: vxmin=-0.4, vxmax=0.4, vymin=-0.3, vymax=0.3
  real,parameter ::  zmin=-1.9,  zmax=1.9
  real,parameter :: vzmin=-0.2, vzmax=0.2
  real,parameter :: pi=3.14159, drad=pi/180

  real :: alon(nx), alat(ny), p(nx,ny)
  real :: xp(3), yp(3), zp(3)

    do i=1,nx
      alon(i) = xmin + (xmax-xmin)*(i-1)/(nx-1)
    end do
    do j=1,ny
      alat(j) = ymin + (ymax-ymin)*(j-1)/(ny-1)
    end do

    do j=1,ny
      slat = sin(alat(j)*drad)
      do i=1,nx
        p(i,j) = 3*sqrt(1-slat**2)*slat*cos(alon(i)*drad)-0.5*(3*slat**2-1)
      end do
    end do

    call DclOpenGraphics()
    call DclNewFrame

!-- x-y plane ----

    call DclSetWindow(  xmin,  xmax,  ymin,  ymax )
    call DclSetViewPort( vxmin, vxmax, vymin, vymax )
    call DclSetTransNumber( 1 )
    call DclSetTransFunction

    call DclSet2DPlane( 1, 2, vzmin)
    call DclSet3DEyePoint( -1.1, -1.1, 2.5 )
    call DclSet3DObjectPoint(  0.0,  0.0, 0.0 )
    call DclSet3DProjection

    call DclDrawAxis( 'bt', 10., 60. )
    call DclDrawTitle( 'b', 'longitude', 0. )
    call DclDrawAxis( 'lr', 10., 30. )
    call DclDrawTitle( 'l', 'latitude', 0. )

!-- x-z plane ----

    call DclSetWindow(  xmin,  xmax,  zmin,  zmax )
    call DclSetViewPort( vxmin, vxmax, vzmin, vzmax )
    call DclSetTransNumber( 1 )
    call DclSetTransFunction

    call DclSet2DPlane( 1, 3, vymax)
    call DclSet3DProjection

    call uzinit
    call DclDrawAxis( 't', 10., 60. )
    call DclSetParm( 'AXIS:labelxb', .false. )
    call DclDrawAxis( 'b', 10., 60. )
    call DclDrawAxis( 'lr', 0.2, 1.0 )
    call DclDrawTitle( 'l', 'amplitude', 0. )

!-- y-z plane ----

    call DclSetWindow(  ymin,  ymax,  zmin,  zmax )
    call DclSetViewPort( vymin, vymax, vzmin, vzmax )
    call DclSetTransNumber( 1 )
    call DclSetTransFunction

    call DclSet2DPlane( 2, 3, vxmax)
    call DclSet3DProjection

    call uzinit
    call DclDrawAxis( 'tb', 10., 30. )
    call DclSetParm( 'AXIS:labelyl', .false. )
    call DclDrawAxis( 'lr', 0.2, 1.0 )

!---------------- 3-d ------------------

    call DclSet3DViewPort(vxmin, vxmax, vymin, vymax, vzmin, vzmax)
    call DclSet3DWindow( xmin,  xmax,  ymin,  ymax,  zmin,  zmax)
    call DclSet3DLogAxis(.false., .false., .false.)
    call DclSet3DTransNumber(1)
    call DclSet3DTransFunction

    do j=ny-1, 1, -1
     do i=nx-1, 1, -1
      xp(1) = alon(i)
      yp(1) = alat(j)
      zp(1) = p(i,j)
      xp(2) = alon(i)
      yp(2) = alat(j+1)
      zp(2) = p(i,j+1)
      xp(3) = alon(i+1)
      yp(3) = alat(j+1)
      zp(3) = p(i+1,j+1)

      call DclDraw3DLine( xp, yp, zp )

      xp(1) = alon(i+1)
      yp(1) = alat(j+1)
      zp(1) = p(i+1,j+1)
      xp(2) = alon(i+1)
      yp(2) = alat(j)
      zp(2) = p(i+1,j)
      xp(3) = alon(i)
      yp(3) = alat(j)
      zp(3) = p(i,j)

      call DclDraw3DLine( xp, yp, zp )
     end do
    end do

    call DclCloseGraphics

end program



関連リンク

DclSet3DTransFunction
(SCSTRF)
3次元正規変換の変換関数を確定する.
DclSet3DViewPort
(SCSVPT)
3次元正規変換のビューポートを設定する.
DclSet3DWindow
(SCSWND)
3次元正規変換のウインドウを設定する.
DclSet3DLogAxis
(SCSLOG)
3次元座標の対数軸を設定する.
DclSet3DTransNumber
(SCSTRN)
3次元正規変換の変換関数番号を設定する.
DclDraw3DLine
(SCPLU,SCPLZU)
3次元ユーザー座標系で折れ線を描く.

* 括弧の中は、対応するf77インターフェイス名.