仿真模拟闪耀光栅

仿真生成闪耀光栅,相位范围为(0,2*pi),可以自由更改光栅尺寸、条纹倾角、像素间隔和周期长度。

matlab代码:

function result=blazed_grating(res,theta,pitch,cycle)
%res:矩阵大小
%theta:条纹与x轴正向夹角(弧度制)
%pitch:像素间隔
%cycle:周期长度
theta=mod(theta,2*pi);
new_theta=mod(theta,pi);
%以矩阵的(1,1)点为原点建立坐标系
A=0;B=-1;
if new_theta==pi/2
    A=1;B=0;
else
    A=tan(new_theta);
end
x=0:res(2)-1;
y=0:res(1)-1;
[x,y]=meshgrid(x,y);
dis=(A*x+B*y)/sqrt(A^2+B^2)*pitch;%点到直线的距离
if theta>=pi
    dis=-dis;
end
phase=mod((dis-min(min(dis)))/cycle,1)*2*pi;
result=phase;
end

python代码:

def blazed_grating(res, theta, pitch, cycle):
    # res:光栅矩阵的尺寸(二维输入,更高维度没有测试)
    # theta:条纹与x轴正向夹角(弧度制)
    # pitch:周期长度
    # cycle:像素间隔
    # return:返回一个二维的numpy矩阵,值为闪耀光栅的相位,变化范围为0~2pi
    theta %= 2 * math.pi
    new_theta = theta % (2 * math.pi)
    # 以光栅矩阵的(1,1)点为原点建立坐标系
    # 条纹与过原点的直线(Ax+By=0)平行
    A = 0
    B = -1
    if new_theta == math.pi / 2:  # 竖直方向
        A = 1
        B = 0
    else:
        A = numpy.tan(new_theta)
    x = numpy.linspace(0, res[1] - 1, res[1])
    y = numpy.linspace(0, res[0] - 1, res[0])
    x, y = numpy.meshgrid(x, y)
    dis = (A * x + B * y) / numpy.sqrt(A * A + B * B) * pitch  # 光栅矩阵矩阵的每个点到(1,1)所在直线的实际距离
    if theta >= math.pi:  # 光栅逆向排列
        dis = -dis
    phase = ((dis - numpy.min(dis)) / cycle) % 1 * 2 * math.pi
    return phase
  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点点 星光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值