网格矢高(Grid Sag)

网格矢高面的面型是由基本平面、球面、圆锥非球面、多项式非球面或Zernike非球面加上由矢高值矩形阵列定义的附加矢高项来定义的。该面型是通过对矢高值进行线性或双三次样条插值后决定的。离散点处的矢高定义为:

其中,

这里,Zi项为"Zernike Standard矢高"中所述的Zernike Standard项。delx和dely是x,y方向上网格点间的间隔,xdec和ydec是该选择的可选偏心坐标,nx和ny是每个方向上的网格点数目。且nx、ny的值不得小于5。用来定义Zbase的项与用来定义偶次非球面的项相同。注意,由网格点定义的矢高相对于由非球面基面面型定义的矢高而言可能是偏心的。可选项参数9和10是Zernike偏心项,用来定义Zernike表达式相对于表面顶点的偏心。 OpticStudio 在计算该表面的近轴光焦度时,利用顶点曲率半径、非球面系数和网格点数据来计算有效近轴曲率。

导入网格数据

所有数据都必须在OpticStudio外部进行计算并制成表格,按适当的文件格式排列,然后再通过表面属性中的"导入(Import)"功能读取。正确的文件格式如下:

 
nx ny delx dely unitflag xdec ydec 
z dz/dx dz/dy d2z/dxdy nodata
.
.
.
 

该文件的第一行包含7个值,用于定义x、y方向上的格点数目(整数型),x、y方向的增量(浮点型)(假设为正值,只考虑delx和dely的绝对值),表示数据单位的(整数型)标志:0表示毫米,1表示厘米,2表示英寸,3表示米。在x、y方向上格点相对于基面的偏心量(浮点型)。可以对当前镜头单位进行任意比例的缩放。注意矢高和全导数的值都是有量纲的,因此可以缩放,但是一阶导数是无量纲的,因此无法缩放。

该文件中剩余的nx*ny行包括四个数(浮点型)和一个整数(可选)。四个浮点值分别为:矢高、矢高的x导数、矢高的y导数、全导数d/dxdy。可选择的第五个数据项是一个整数标志,用于表示数据是否为无效数据。对于有效的测量数据,nodata标志应为零或空格。对于无效的数据,nodata标志应该为1。

如果nodata标志的值为1,则用0替换整行数据,且只使用矢高数据的基本部分进行计算。如果网格矢高表的所有数据项都不是数字,则将数据项替换成零。

文件中的第一个数据行与表面的左上角相对应,即由-x和+y极值定义的左上角。后面的每个点在整个面上按从左到右的顺序读取。读完nx个点后,读取第nx+1个点作为第2行的第一个值,以此类推,直到nx*ny个点都被读取完成。文件必须是以.DAT扩展名结尾(对NSC物体使用的文件,其扩展名必须以.GRD结尾)的ASCII格式。

对矢高数据点间的双三次插值进行平滑处理时必须用到导数值。这些值不用在线性插值算法上。如果文件中每个点的导数值(dz/dx、dz/dy和d2z/dxdy)都是零,那么OpticStudio会自动用有限差分法估算这些导数值。

网格矢高文件格式也支持注释行。任何以"!"字符开头的行都会被忽略。

双三次样条 vs 线性插值

可以使用这两种插值算法中的任一种算法计算表面上任意点上的矢高。默认使用双三次样条算法,并且提供了一种在矢高和其一阶导数上都平滑的插值。双三次样条是得到合理的平滑数据的首选算法。对于有噪声的伪随机数据,或有尖锐非连续的网格数据,双三次样条可能引起"插值过度(overshoot)",这就意味着面数据的插值可能生成远离网格点的矢高点。对于这些情况,一个线性插值算法可以提供更加有用的结果。双三次样条或线性插值的选择被当作一个参数可由用户选择。

使用网格矢高的建议

有关样条面限制的重要信息,请参阅"关于样条面的注释(Comments about spline surface)"。要使用网格矢高面,首先将表面类型改成网格矢高。然后从表面属性对话框中的"导入(Import)"部分选择DAT文件名。数据将被载入内存,但并不显示在镜头数据编辑器中。不显示数据的原因在于点的数量可能相当的大。一旦网格文件被载入,值就可通过使用表面数据报告(Surface Data Report)来检查。之后,数据被存储在镜头文件中,并且初始DAT文件被忽略。如果DAT文件必须改变,则需要在表面属性对话框中使用导入功能重新加载文件。

网格大小只受可用内存的限制。网格的每个点需要4个8字节的双精度值和1个l字节的值,或者总共33字节。一个225×225的栅格文件需要大约2Mb的内存。使用带有很多点的网格矢高面可能会降低文件编辑和读写的速度。加快编辑速度的一个方法是关闭OpticStudio中的"磁盘多步存储(disk multi step)"撤销功能。请参见"OpticStudio配置选项"(从设置选项卡)的"编辑器"部分。

双三次样条插值算法平滑到三阶,且在格点上有精确结果,对于合理平滑的表面面型一般不需要很大的网格文件。然而,与所有的低阶样条表面模型类似,网格矢高面可能永远不能建模接近高阶非球面的表面。因为没有分段数目合理的三阶多项式能精确地遵守高阶形状。网格矢高表面用于建模任意低阶面型,不会产生高阶波动。

网格矢高面在网格边缘外不做定义。网格区域外的光线追迹被当作光线丢失错误对待。最好将网格的有效数据部分设为比光线照射区域大一些。尤其不要将网格定义为与光束截面一样大。因为正好在网格边缘的光线不会按预期去追迹。

为了建模极度弯曲光学元件的网格矢高面,例如快速反射镜,最好使用基面曲率半径和圆锥系数来定义原始面形,然后用网格矢高数据定义与原始面型间的偏差,而不是用网格数据定义整个表面。原因是OpticStudio可以使用基面的曲率半径和圆锥系数去找到光线与表面交点的"初始估算值(first guess)"。然后使用附加网格矢高数据迭代出精确解。对OpticStudio来说,如果基面是平面,找到大角度入射光线与极度弯曲网格矢高面的交点不仅很困难,而且速度很慢。

GRIDSAMP.C,一个C语言程序的例子,位于<objects>\Grid Files文件夹中(参阅"文件夹(Folders)")。此示例程序显示了创建网格DAT文件的正确方法;例子中使用的是球面。此外,GRIDSAMP程序也显示了在只知道表面矢高公式的解析式时,怎样用有限差分来计算导数。

不能对网格数据进行优化和公差分析。

网格矢高面的参数定义

参数# 定义
0 插值方法。使用0表示双三次样条插值,1表示线性插值。请参阅"双三次方样条 vs 线性插值(Bicubic spline vs. linear interpolation)"。
1 - 8 α1-α8
9 Zernike X方向偏心,以镜头单位表示
10 Zernike Y方向偏心,以镜头单位表示
13 项数(最大231)
14 归一化半径。坐标由该值归一化。
15-245 Zernike多项式1-231的相应系数,以镜头单位表示。

下一部分: