ISOSURFACE过程的算法是对SHADE_VOLUME算法的扩展。它返回使用由有向的四边形分解得到的按一定结构存储的多个三角片组成的等值面。这个算法也可以用来从任意(非规整)四边形网格体数据中获取等值面。如果给定可选的辅助数组,辅助数组用于在输出的顶点上插值并返回。辅助数组在顶点处可以有多个值。主要的维数可以是任意尺寸,只要接下来的维中的数值与输入数组中的元素匹配即可。
调用方法
ISOSURFACE, Data, Value, Outverts, Outconn [, GEOM_XYZ=array, TETRAHEDRA=array] [, AUXDATA_IN=array, AUXDATA_OUT=variable] [, PROGRESS_CALLBACK=string] [, PROGRESS_METHOD=string] [, PROGRESS_OBJECT=objref] [, PROGRESS_PERCENT=percent{0 to 100}] [, PROGRESS_USERDATA=value]
参数
Data
输入的三维标量数组,用于得到三维等值面。
Value
输入的标量值,用于指定等值面的值。
Outverts
一个用于返回的包含[3, n]浮点数组的变量,表示组成三角形组成的表面的各个顶点。
Outconn
一个用于返回的包含多边形连接值的数组(详见IDLgrPolygon的 POLYGONS关键字)。如果没有提取到多边形,则该关键字的值为数组[–1]。
关键字:
AUXDATA_IN
输入的辅助数据,其最后最后一维为数据的个数。
注意:如果指定了AUXDATA_IN则必须指定AUXDATA_OUT关键字。
AUXDATA_OUT
设置该关键字用于返回辅助数据在Outverts处的采样值。
注意:如果指定了AUXDATA_OUT则必须指定AUXDATA_IN关键字。
GEOM_XYZ
一个用于输入的[3,n]的顶点坐标数组(Data数组中的一个值对应一个坐标)。这个数组用于定义每一个元素的空间位置。如果忽略该关键字,则Data必须是三维的且假定三维网采样网格点是均匀的。
注意:如果指定了GEOM_XYZ关键字,则TETRAHEDRA也必须指定。
PROGRESS_CALLBACK
设置该关键字为一标量字符串,其内容为某一IDL函数的名称,用于ISOSURFACE产生等值面的过程中每隔PROGRESS_PERCENT调用一次该函数。PROGRESS_CALLBACK函数返回0时通知ISOSURFACE 停止产生等值面,这会导致ISOSURFACE返回一个顶点和一个为[-1]的连接数组,即表示一个空的多边形;如果返回任意非0值即表示继续产生等值面。
PROGRESS_CALLBACK函数必须指定一个的参数Percent,ISOSURFACE将会设置该为一个从0到100的整数。PROGRESS_CALLBACK函数还可以指定一个可选关键字USERDATA, ISOSURFACE将会将其设置为PROGRESS_USERDATA关键字指定的值。
下面的代码将会显示一个进度条回调代码:
FUNCTION myProgressCallback, percent,USERDATA = myStruct
oProgressBar = myStruct.oProgressBar
; 这个方法将会更新进度条,如果用户不点击取消按钮则返回TRUE
keepGoing = oProgressBar->UpdateProgressValue(percent)
RETURN, keepGoing
END
PROGRESS_METHOD
设置该关键字为一标量字符串,其内容为方法函数的名称,ISOSURFACE会在产生等值面的过程中调用该方法。如果设置了该关键字,则PROGRESS_OBJECT关键字必须设置为某个类的对象的引用,且该类必须已经定义了(PROGRESS_METHOD)指定的方法。PROGRESS_METHOD 回调的方法函数与PROGRESS_CALLBACK关键字中描述的要求一样,只是此方法函数定义为一个类的方法:
FUNCTION myClass::myProgressCallback, percent, USERDATA = myStruct
PROGRESS_OBJECT
设置该关键字为一对象的引用,该对象所属的类定义了PROGRESS_METHOD 关键字指定的方法。如果设置了该关键字,PROGRESS_METHOD关键字也必须设置。
PROGRESS_PERCENT
设置该关键字为一个0到100之间的标量,用于指定完成多少百分比调用一次回调函数。默认值为5,即每隔5%调用一次回调函数,而在其它百分比时不调用回调函数。例如,该关键字指定为5,则ISOSURFACE会等值面计算完成0%,5%,10%, ..., 95%和100% 时调用回调函数。
PROGRESS_USERDATA
设置该关键字为任意的IDL变量,该变量将会由ISOSURFACE函数传递给回调函数。如果指定了该关键字,则回调函数定义时必须能够接受此关键字。
TETRAHEDRA
一个输入数组,存储了四边形的连接数组。如果不指定该关键字,则默认输入的三维数组是均匀采样的三维数组。如果指定该关键字,则输入的数组不一定必须是三维数组。每一个四边形由连接数组中的四个数值表示。数组中的每四个数值对应了一个四边形的四个顶点。
示例程序:
pro isosurface_demo
; 加载数据:
RESTORE, FILEPATH('clouds3d.dat', SUBDIR=['examples','data'])
; 获取等值面:
isosurface, rain, 0.2, vert, con, AUXDATA_IN = clouds, AUXDATA_OUT = out
; 建立视图并显示:
SCALE3, XRANGE=[0,55], YRANGE=[0,55], ZRANGE=[0,35], AX=0, AZ=45
TV, POLYSHADE(vert, con, /T3D)
end
程序的结果如图1所示。
图1 等值面图