OSLO提供另一个光线型评价函数,要比Geniierf简单的多,但是它这里还是用一点小技巧,其实称不上技巧,给人的感觉是多此一举,故弄玄虚。。。首先类似的,弹出参数输入对话框,从其字面容易猜到,这是关于轴上点与一个轴外点的像差项,其五个参数的意义是:Axis fymax是轴上点y方向渐晕,Offazis fob是离轴视场点的比例坐标,Offaxis fymin、Offaxis fymax分别是其y、x方向的渐晕,Offaxis fx是从该视场要追迹的光线的孔径比例坐标。
此外,点击对话框后,系统执行oprays_template(Axis fymax...)命令,该命令只是作为产生操作数模板所用,并不真正产生操作数,而是将全局数组OCM里的一些数组元素设为操作数,而并未为OCM数组进行具体操作,真正执行的是在优化过程系统回调执行opcb_rays(void)命令,该函数没有参数,其实是oprays_template命令将自己的参数悄悄地传给了它,即oprays_template里干了 这个:
sprintf(nbrstr, "opcb_rays %.2f %.2f %.2f %.2f %.2f",
axis_fymax, offaxis_fob, offaxis_fymin, offaxis_fymax, offaxis_fx);
sno6(nbrstr);
opcb_rays里又干了这个:
get_system_note(6);
将实参转为字符型传来传去,其帮助文档里自吹为什么技术!我汗。。。接下来看看opcb_rays都算了些什么东西吧:
get_system_note(6);
strtoken(tmpstr,system_note, " ");
if (!strcmp(tmpstr, "opcb_rays"))
{
for (ic = 1; ic < 6; ic++)
{
strtoken(tmpstr, "", " ");
ocm[ic] = atof(tmpstr);
}
}
//上面很明显,将五个参数传入到了OCM[i](i~5)中了
ssbuf_reset(1,2,1e20);
// paraxial data
paraxial_trace();
Ocm[6] = ssb(1,1); // py
Ocm[7] = ssb(1,2); // pu
Ocm[8] = ssb(1,4); // pyc
Ocm[9] = ssb(1,5); // puc
paraxial_constants();
Ocm[10] = ssb(2,1); // focal length (ang. mag.)
ssbuf_reset(1,12,1e20);
//上面一段代码是获取一些要用到的近轴参数
//下面开始计算轴上点的一些儿像差项了
// on axis
set_object_point(0);
Ocm[11] = ssb(3,3); // axis focus shift
trace_fan(y,all,2,.7*Ocm[1],Ocm[1],0);//这个命令其实是画光扇图用的,这里用来追迹光线,其优点大概是一次可追迹很多条吧;这里只追迹了两条子午光线
Ocm[12] = ssb(5,5); // axis FY zone dy //这两条的孔径比例坐标是0.7*Axis_fymax和Axis_fymax,即边缘的与0.7孔径的,下面的所谓zone项像差就是带光的吧,即0.7孔径的
Ocm[13] = ssb(5,8); // axis FY zone opd
Ocm[14] = ssb(5,9); // axis FY zone dmd
Ocm[15] = ssb(5,10); // axis FY zone osc
Ocm[16] = ssb(4,5); // axis FY edge dy
Ocm[17] = ssb(4,8); // axis FY edge opd
Ocm[18] = ssb(4,9); // axis FY edge dmd
Ocm[19] = ssb(4,10); // axis FY edge osc
//下面是轴外视场点
// off-axis
set_object_point(Ocm[2]);
/*这个命令会追迹从轴外视场点发出的一条参考类型的光线(多是主光线),视场点由field point里的电子表格编辑由此能得到其与像面的交点(YC,XC),子午、弧矢场曲(YFS,XFS),OPL,及参考球面波的半径*/
Ocm[20] = ssb(8,1); // off-axis FY 0 yc
Ocm[21] = ssb(8,3); // off-axis FY 0 yfs
Ocm[22] = ssb(8,4); // off-axis FY 0 xfs
trace_fan(y,all,2,Ocm[3],Ocm[4],0);//追迹两条光线,孔径比例坐标分别为offaxis_fymin和 offaxis_fymax,即上下边缘,当然其渐晕是在field point set电子表格里设置的
Ocm[23] = ssb(9,5); // off-axis upper FY dy
Ocm[24] = ssb(9,8); // off-axis upper FY opd
Ocm[25] = ssb(9,9); // off-axis upper FY dmd
Ocm[26] = ssb(10,5); // off-axis lower FY dy
Ocm[27] = ssb(10,8); // off-axis lower FY opd
Ocm[28] = ssb(10,9); // off-axis lower FY dmd
trace_fan(x,all,1,Ocm[5],Ocm[5],0);//再追迹一条孔径坐标为offaxis_fx的弧矢光线,以得到下面弧矢面的像差项
Ocm[29] = ssb(11,5); // off-axis skew dy
Ocm[30] = ssb(11,6); // off-axis skew dx
//至此,所有光线已追迹完毕,用户可以利用这些追迹结果再来定义自己的像差项,只要将其存到OCM[33]以后的数组元里,当然还要自己添加到评价函数里
//下面就是两个例子,当然是OSLO自己搞进去的,一是有用,二也是师范下
// insert user defs here
Ocm[31] = 0.5*(Ocm[23] + Ocm[26]); // tangential coma
Ocm[32] = Ocm[20] - Ocm[8]; // distortion
//下面将opd dmd单位由波长转为透明单位
if (opdw) // convert wavelengths to distance units
{
w2d = wv[1]/(1000.0*uni);
Ocm[13] *= w2d;
Ocm[14] *= w2d;
Ocm[17] *= w2d;
Ocm[18] *= w2d;
Ocm[24] *= w2d;
Ocm[25] *= w2d;
Ocm[27] *= w2d;
Ocm[28] *= w2d;
}
if (chkap) apck on;
ssbuf_reset(-ssb_row_sav, 12);
set_preference(output_text, on);
综上,此光线型评价函数默认产生了以下的操作数:
轴上点:全孔径和0.7孔径的dy、opd、dmd、osc
轴外点:上下边缘的dy、opd、dmd,弧矢光的dy、dx,由此衍生的子午彗差和畸变(由field point set里的渐晕默认设置可知,此处得上下边缘就是0.7孔径)