如何把非球面转化为菲涅尔面?

菲涅尔透镜在日常生活中很常见,比如PIR透镜、VR镜片、Flash透镜。。。那我们如何将非球面转化为等价的菲涅尔面呢?如下所示,这是我用python编写的一个小程序,用来把非球面转化为等sag的菲涅尔面,那我们今天就来讲讲这个思路,怎么来达成这个效果。
第一部分:输入相关参数
Step1,给定非球面系数。比如我们这里,R=-27,K=-1。
Step2,给定表面的尺寸。通常表面是旋转对称的,那我们只需要把一半尺寸进行转换就可以。例如这个表面直径是40,那我们需要处理的大小就是D=20。
Step3,给定计算的步长。由于面是由一个个点构成的,因此要绘制这个曲线,就需要给定计算的步长,步长可以在一定范围灵活选择。比如我这里选择step=0.002
Step4,给定需要的sag深度。为了绘图更加直观,我这里距离sag=1.0
第二部分:计算过程
step1,计算非球面对应的点坐标
y = np.arange(0, D+step, step)
def ASP_Surf_Sag(y, R, K=0, A4=0, A6=0, A8=0。。):
c = 1/R
Surf_Sag = c*y**2/(1+(1-(1+K)*c**2*y**2)**0.5) + A4*y**4 + A6*y**6 + A8*y**8 。。
return Surf_Sag
x = ASP_Surf_Sag(y, R, K)
其中,y对应非球面的纵坐标,x对应非球面的横坐标,也就是每个点对应的sag值。
step2,对非球面的sag缩进量进行标记
deep_x = (-1)*(abs(x) % Sag)
也就是说,用实际sag去和需要的sag进行取余运算,就得到fresnel的sag量
第三部分:绘制图形
step1,确定显示界面的尺寸,并设定图面标题
plt.figure(figsize=(6,7.5))
ax1 = plt.subplot(1,2,1)
ax2 = plt.subplot(1,2,2)
plt.suptitle(‘Fresnel Surface Convert Tool’)
step2,绘制非球面图形
plt.sca(ax1)
plt.plot(x,y)
plt.xlim(-8,0)
plt.ylim(0,20)
plt.title(‘Asphere Surface’)
step3,绘制菲涅尔图型
plt.sca(ax2)
plt.plot(deep_x,y)
plt.xlim(-8,0)
plt.ylim(0,20)
plt.title(‘Fresnel Surface’)
step4,把绘制的图形显示出来
plt.show()
谢谢大家!
第一个问题来了~~~
实际加工的时候,每个齿都是有一定拔模角的,那假设我们现在每个齿有5°的拔模角,那这个转换工具又该怎么写呢?以下为5°拔模角的效果图,大家动手来试试吧!
第二个问题来了~~~
除了这种等sag的菲涅尔面,有时候也存在等pitch的面,就是菲涅尔的齿距相等,这个时候每个齿的深度是不一样的,结果如下所示,这种面型要怎么转换呢,大家来试试吧。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注