如果你希望对图像进行左右翻转而保持坐标轴不变,可以直接使用 MATLAB 的 `flip` 函数对图像数据进行操作,而不影响坐标轴的设置。在这种情况下,你可以在不改变 `imagesc` 函数调用的前提下,修改代码如下:
- % 参数设置
- lambda = 840e-9; % 光波长 (单位:米)
- k = 2 * pi / lambda; % 波数
- n = 1.451; % 介质的折射率
- cone_angle = 10 * pi / 180; % 锥的底角 (单位:弧度)
- z_max = 10e-3; % 模拟传播的最大距离 (单位:米)
- N = 512; % 图像的分辨率
- dx = 3.45e-6; % 每个像素的尺寸 (单位:米)
- dy = dx; % 假设为正方形像素
- % 空间坐标系
- x = (-N/2:N/2 - 1) * dx;
- y = (-N/2:N/2 - 1) * dy;
- [X, Y] = meshgrid(x, y); % 修正变量名
- Rxy = sqrt(X.^2 + Y.^2); % 径向坐标
- % 锥透镜的相位调制
- phi_cone = k * Rxy * cone_angle * (n-1); % 锥透镜的相位因子
- % 初始平面波场
- U0 = exp(1i * zeros(size(X))); % 平面波,初始相位为0
- % 通过锥透镜调制光波
- U_coned = U0 .* exp(-1i * phi_cone); % 平面波经过锥透镜调制
- % 计算频率空间 (角谱传播)
- fx = (-N/2:N/2-1) / (N * dx); % 频率坐标
- fy = fx;
- [Fx, Fy] = meshgrid(fx, fy); % 修正变量名
- F = sqrt(Fx.^2 + Fy.^2); % 频率空间的径向坐标
- % 传播传递函数,考虑传播距离 z_max
- H = @(z) exp(1i * k * z * sqrt(1 - (lambda * F).^2)); % 角谱传播传递函数,动态传递
- % 设置传播距离的采样点(例如,模拟从 0 到 z_max 的多个传播距离)
- z_samples = linspace(0, z_max, 50); % 50 个传播距离
- % 对每个传播距离进行计算并可视化
- intensity_xz = zeros(N, length(z_samples)); % 预分配空间
- for i = 1:length(z_samples)
- z = z_samples(i);
-
- % 计算传播到 z 处的场
- U_freq = fftshift(fft2(U_coned)); % 2D 傅里叶变换
- U_freq = U_freq .* H(z); % 应用传播传递函数
- U_propagated = ifft2(ifftshift(U_freq)); % 逆傅里叶变换回到空间域
- % 提取 y = 0 处的 xz 平面数据
- y_idx = ceil(N / 2); % 选择 y = 0 处,即 Ny 中心
- U_xz = U_propagated(:, y_idx); % 提取 xz 平面的数据
- % 计算强度分布 |U(x, 0, z)|^2并保存
- intensity_xz(:, i) = abs(U_xz).^2; % 直接存入预分配的矩阵
- end
- % 绘制强度分布(xz平面的切片)
- figure(1);
- % 图像左右翻转使用 flip
- intensity_xz_flipped = flip(intensity_xz, 2); % 对列进行翻转,相当于左右翻转
- % 使用原始坐标绘图
- imagesc(z_samples, x, intensity_xz_flipped);
- colormap('parula');
- axis on;
- xlabel('z (m)');
- ylabel('x (m)');
- colorbar;
- % 获取当前图像的坐标轴范围
- xlim_val = xlim;
- ylim_val = ylim;
- % 在图像上添加文字注释
- text(mean(xlim_val), mean(ylim_val)*0.2, '10°', ...
- 'HorizontalAlignment', 'center', 'FontSize', 10, 'Color', 'yellow');
- % 确保窗口宽度和高度相同
- set(gcf, 'Position', [100, 100, 600, 600]); % 示例设置: [位置从左, 位置从下, 宽度, 高度]
复制代码
### 说明:
1. **`flip` 函数**:使用 `flip(intensity_xz, 2)` 对强度矩阵进行左右翻转(在列方向上),这样图像左右翻转,但不影响坐标轴的设置。
2. **`set(gca, 'YDir', 'normal')`**:确保绘图坐标轴正常显示。
3. **`set(gcf, 'Position', ...)`**:调整图像窗口大小,根据需要自行设置位置和大小。
--- 光学专家Gpt |