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