The PROJECT_VOL函数返回三维体数据投影到二维平面形成的图像(类似于X射线)。返回的图像为体数据的半透明影像(体数据中的数值越大返回的图像对应的点越亮)。深度参数和不透明度都会影响图像。体数据投影用到了4x4的转换矩阵,因此,包括透视投影在内的任何投影均可使用。一般情况下,系统使用的视图转换矩阵(!P.T)即为4x4的矩阵。
注意:
VOXEL_PROJ过程实现了与此类似的大部分功能,但速度更快。
这个程序是由IDL语言写的,因此,在IDL的发布库中可以找到project_vol.pro 文件,其中包含了本程序的源代码。
调用方法:
Result = PROJECT_VOL( Vol, X_Sample, Y_Sample, Z_Sample [, /AVG_INTENSITY] [, /CUBIC] [, DEPTH_Q=value] [, OPAQUE=3D_array] [, TRANS=array] [, XSIZE=longword integer] [, YSIZE=longword integer] [, /Z_BUFFER] )
返回值:
返回三维数据在二维平面上的投影。
参数:
Vol
一个三维数据,可以是任何数据类型,但不能是字符串或结构体类型,其中包含了用于投影的数据。
X_Sample
一个长整型数值,用于指定沿X方向上的射线数(即图像X方向上的分辨率)。返回的图像分辨率将为[X_sample, Y_sample]。
Y_Sample
一个长整型数值,用于指定沿X方向上的射线数(即图像Y方向上的分辨率)。返回的图像分辨率将为[X_sample, Y_sample]。为了保证正常的纵横比,Y_sample应该与X_sample相等。
Z_Sample
沿射线方向上的采样数。X_sample, Y_sample和 Z_sample值越高,图像的分辨率越好,同时执行时间也就越长。
关键字:
AVG_INTENSITY
如果设置该关键字用于指定亮度计算时取平均值。默认情况下是最亮度最大值。如果设置了Z_BUFFER关键字则忽略该该关键字。
CUBIC
如果设置该关键字则使用三次插值方法。默认采用双线性插值算法。
DEPTH_Q
设置该关键字表示创建图像时要用到深度对比。该关键字是一个浮点数,介于0.0和1.0之间。该值定义为体数据中最远区域与最近区域的亮度之比。该值为0则表示体数据的背面绘制为黑色,而1.0则表示背面和前面的亮度一样。默认值为1.0 。
OPAQUE
一个三维数组,可以为除字符串和结构体之外的任意类型,大小和维数与Vol一致。这个数组指定每一个体元的不透明度。OPAQUE值为0表示透明。OPAQUE的值是累加的。例如, 如果一条值为50的数据点发出了射线,然后穿过了10半透明的单元格(每一个单元格的值为0,而不透明度值为5),那么射线则完全被遮挡(即返回的图像上将看不到值为50的点)。默认值是全透明的。
TRANS
一个4x4浮点数组,用于投影体数据时作为转换矩阵使用。默认是使用系统视图矩阵 (!P.T)。
XSIZE
返回图像的X尺寸。最后会使用CONGRID使图像变成XSIZE ×YSIZE。默认为当前窗口的X尺寸 (或才Z缓冲区的X尺寸)。如果当前窗口不存在,则默认使用X_sample值。
YSIZE
返回图像的Y尺寸。最后会使用CONGRID使图像变成XSIZE ×YSIZE。默认为当前窗口的Y尺寸 (或才Z缓冲区的Y尺寸)。如果当前窗口不存在,则默认使用Y_sample值。
Z_BUFFER
如果设置该关键字,则投影将会与当前Z缓冲区的内容进行合并。默认是不使用Z缓冲区的内容。
示例程序:
pro PROJECT_VOL_DEMO
device, decomposed = 0
loadct,33
; 加载数据:
RESTORE, FILEPATH('clouds3d.dat', SUBDIR=['examples','data'])
sz = size(clouds)
vx = sz[1] & vy = sz[2] & vz = sz[3]
; 使数值为0的数据取一小值,以显示出立方体的轮廓:
vol = BYTSCL(rain)
vol(where(vol le 5)) = 5
opaque = BYTSCL(rain)
opaque(where(opaque le 5)) = 5
WINDOW, 0, XSIZE=512, YSIZE=512
; 带不透明度参数:
for i = 20, 130, 2 do begin
; 建立视图:
CREATE_VIEW, ax = i, az = 20, xmin = 0, xmax = 55, $
ymin = 0, ymax = 55, zmin = 0, zmax = 32
; 产生并显示图像:
img = PROJECT_VOL(vol, 55, 55, 32, DEPTH_Q=1.0, $
OPAQUE=opaque)
TVSCL, img
endfor
; 全透明:
for i = 20, 130, 2 do begin
T3D, /RESET
T3D, TRANSLATE=[-0.5, -0.5, -0.5]
T3D, SCALE=[0.7, 0.7, 0.7]
T3D, ROTATE=[20, i, 20]
T3D, TRANSLATE=[0.5, 0.5, 0.5]
; 产生并显示图像:
img = PROJECT_VOL(vol, 55, 55, 32, DEPTH_Q=1.0, $
TRANS=(!P.T))
TVSCL, img
endfor
END
图1 示例程序截图