贝塞尔

[复制链接]
匿名  发表于 4 天前
% 参数设置
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);  % 5 行 10 列的子图
% 对intensity_xz进行水平翻转,这里使用 fliplr 函数,它可以对矩阵进行左右翻转(水平翻转)
intensity_xz_flipped = fliplr(intensity_xz);
imagesc(x, [0 z_max], intensity_xz_flipped);  % 显示在 xz 平面上的强度分布
colormap('parula');
axis on; % 打开坐标轴
xlabel('x (m)'); % 添加 x 轴标签
ylabel('z (m)'); % 添加 y 轴标签
% 获取当前图像的坐标轴范围
xlim_val = xlim;  % x 轴范围
ylim_val = ylim;  % y 轴范围
% 在图像上添加文字注释
text(mean(xlim_val), mean(ylim_val)*0.2, '10°', ...
    'HorizontalAlignment', 'center', 'FontSize', 10, 'Color', 'yellow');  % 在图像上添加文字
% 调整坐标轴位置,去除不必要的空白
%set(gca, 'Position', [0 0 1 1]);  % 设置坐标轴位置为图形窗口的整个区域
% 手动设置图形窗口为正方形
set(gcf, 'Position', [100, 100, 800, 200]);  % 确保窗口宽度和高度相同
这段代码生成图片的xz轴反了,请帮我修改一下,使生成图片的xz坐标逆转一下
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 4 天前 | 显示全部楼层
xxm 发表于 2025-03-27 10:36
% 参数设置
lambda = 840e-9; % 光波长 (单位:米)
k ...


要逆转生成图片中的 x 和 z 坐标,可以简单地调整 `imagesc` 函数的参数和使用 MATLAB 中的 `flip` 功能。不需要对数据进行水平翻转(如 `fliplr`),而是直接在绘图时更改坐标轴顺序。

以下是修改后的代码片段:

  1. % 绘制强度分布(xz平面的切片)
  2. figure(1);
  3. % 使用 imagesc 时,直接传递 z_samples 作为第一维,x 作为第二维,并且不进行 data 的方向翻转
  4. imagesc(z_samples, x, intensity_xz');  % 使用转置的强度矩阵来正确显示 xz 分布

  5. colormap('parula');
  6. axis on;
  7. xlabel('z (m)');  % z 轴作为水平轴
  8. ylabel('x (m)');  % x 轴作为垂直轴
  9. colorbar;
  10. % 获取当前图像的坐标轴范围
  11. xlim_val = xlim;  
  12. ylim_val = ylim;  
  13. % 在图像上添加文字注释
  14. text(mean(xlim_val), mean(ylim_val)*0.2, '10°', ...
  15.     'HorizontalAlignment', 'center', 'FontSize', 10, 'Color', 'yellow');

  16. % 调整 z 轴为从中心点扩展
  17. set(gca, 'YDir', 'normal');  % 保证 y 轴方向正常,即从下到上
  18. set(gca, 'XDir', 'reverse');  % 反转 x 轴方向
复制代码


### 修改说明:

1. **使用转置**:利用 `intensity_xz'`,将矩阵进行转置来对应 `z_samples` 的顺序,这是因为在 `imagesc` 中,第一个参数被用作横轴,第二个参数被用作纵轴。
   
2. **轴反转**:
   - 使用 `set(gca, 'XDir', 'reverse')` 来反转 `z` 轴,保证它从中心对称展开。
   - 使用 `set(gca, 'YDir', 'normal')` 保持 `x` 轴方向正常显示。

这样处理后,你可以看到 `z` 轴在水平位置,而 `x` 轴是垂直坐标,符合从中心扩展方向的显示要求。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 4 天前
% 参数设置
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);  % 5 行 10 列的子图
% 对intensity_xz进行水平翻转,这里使用 fliplr 函数,它可以对矩阵进行左右翻转(水平翻转)
% intensity_xz_flipped = fliplr(intensity_xz);
% imagesc(x, [0 z_max], intensity_xz_flipped);  % 显示在 xz 平面上的强度分布
imagesc(z_samples, x, intensity_xz);

colormap('parula');
axis on; % 打开坐标轴
xlabel('z (m)'); % 添加 x 轴标签
ylabel('x (m)'); % 添加 y 轴标签
colorbar;
% 获取当前图像的坐标轴范围
xlim_val = xlim;  % x 轴范围
ylim_val = ylim;  % y 轴范围
% 在图像上添加文字注释
text(mean(xlim_val), mean(ylim_val)*0.2, '10°', ...
    'HorizontalAlignment', 'center', 'FontSize', 10, 'Color', 'yellow');  % 在图像上添加文字
% 调整坐标轴位置,去除不必要的空白
% set(gca, 'Position', [0 0 1 1]);  % 设置坐标轴位置为图形窗口的整个区域


% 调整 z 轴为从中心点扩展
set(gca, 'YDir', 'normal');  % 保证 y 轴方向正常,即从下到上
% set(gca, 'XDir', 'reverse');  % 反转 x 轴方向


% 手动设置图形窗口为正方形
set(gcf, 'Position', [100, 100, 800, 200]);
如何将图片进行左右翻转,坐标轴不变
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 4 天前 | 显示全部楼层
xxm 发表于 2025-03-27 10:48
% 参数设置
lambda = 840e-9; % 光波长 (单位:米)
k ...


如果你希望对图像进行左右翻转而保持坐标轴不变,可以直接使用 MATLAB 的 `flip` 函数对图像数据进行操作,而不影响坐标轴的设置。在这种情况下,你可以在不改变 `imagesc` 函数调用的前提下,修改代码如下:

  1. % 参数设置
  2. lambda = 840e-9; % 光波长 (单位:米)
  3. k = 2 * pi / lambda; % 波数
  4. n = 1.451; % 介质的折射率
  5. cone_angle = 10 * pi / 180; % 锥的底角 (单位:弧度)
  6. z_max = 10e-3; % 模拟传播的最大距离 (单位:米)
  7. N = 512; % 图像的分辨率
  8. dx = 3.45e-6; % 每个像素的尺寸 (单位:米)
  9. dy = dx; % 假设为正方形像素

  10. % 空间坐标系
  11. x = (-N/2:N/2 - 1) * dx;
  12. y = (-N/2:N/2 - 1) * dy;
  13. [X, Y] = meshgrid(x, y);  % 修正变量名
  14. Rxy = sqrt(X.^2 + Y.^2); % 径向坐标

  15. % 锥透镜的相位调制
  16. phi_cone = k * Rxy * cone_angle * (n-1); % 锥透镜的相位因子

  17. % 初始平面波场
  18. U0 = exp(1i * zeros(size(X))); % 平面波,初始相位为0

  19. % 通过锥透镜调制光波
  20. U_coned = U0 .* exp(-1i * phi_cone); % 平面波经过锥透镜调制

  21. % 计算频率空间 (角谱传播)
  22. fx = (-N/2:N/2-1) / (N * dx); % 频率坐标
  23. fy = fx;
  24. [Fx, Fy] = meshgrid(fx, fy);  % 修正变量名
  25. F = sqrt(Fx.^2 + Fy.^2); % 频率空间的径向坐标

  26. % 传播传递函数,考虑传播距离 z_max
  27. H = @(z) exp(1i * k * z * sqrt(1 - (lambda * F).^2)); % 角谱传播传递函数,动态传递

  28. % 设置传播距离的采样点(例如,模拟从 0 到 z_max 的多个传播距离)
  29. z_samples = linspace(0, z_max, 50); % 50 个传播距离

  30. % 对每个传播距离进行计算并可视化
  31. intensity_xz = zeros(N, length(z_samples)); % 预分配空间
  32. for i = 1:length(z_samples)
  33.     z = z_samples(i);
  34.    
  35.     % 计算传播到 z 处的场
  36.     U_freq = fftshift(fft2(U_coned)); % 2D 傅里叶变换
  37.     U_freq = U_freq .* H(z); % 应用传播传递函数
  38.     U_propagated = ifft2(ifftshift(U_freq)); % 逆傅里叶变换回到空间域

  39.     % 提取 y = 0 处的 xz 平面数据
  40.     y_idx = ceil(N / 2);  % 选择 y = 0 处,即 Ny 中心
  41.     U_xz = U_propagated(:, y_idx);  % 提取 xz 平面的数据

  42.     % 计算强度分布 |U(x, 0, z)|^2并保存
  43.     intensity_xz(:, i) = abs(U_xz).^2;  % 直接存入预分配的矩阵
  44. end

  45. % 绘制强度分布(xz平面的切片)
  46. figure(1);

  47. % 图像左右翻转使用 flip
  48. intensity_xz_flipped = flip(intensity_xz, 2);  % 对列进行翻转,相当于左右翻转

  49. % 使用原始坐标绘图
  50. imagesc(z_samples, x, intensity_xz_flipped);  
  51. colormap('parula');
  52. axis on;
  53. xlabel('z (m)');
  54. ylabel('x (m)');
  55. colorbar;

  56. % 获取当前图像的坐标轴范围
  57. xlim_val = xlim;
  58. ylim_val = ylim;

  59. % 在图像上添加文字注释
  60. text(mean(xlim_val), mean(ylim_val)*0.2, '10°', ...
  61.     'HorizontalAlignment', 'center', 'FontSize', 10, 'Color', 'yellow');

  62. % 确保窗口宽度和高度相同
  63. set(gcf, 'Position', [100, 100, 600, 600]);  % 示例设置: [位置从左, 位置从下, 宽度, 高度]
复制代码


### 说明:
1. **`flip` 函数**:使用 `flip(intensity_xz, 2)` 对强度矩阵进行左右翻转(在列方向上),这样图像左右翻转,但不影响坐标轴的设置。
2. **`set(gca, 'YDir', 'normal')`**:确保绘图坐标轴正常显示。
3. **`set(gcf, 'Position', ...)`**:调整图像窗口大小,根据需要自行设置位置和大小。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

123
发帖

快速回帖

您需要登录后才可以回帖 登录 | 立即注册 手机动态码快速登录

本版积分规则

关于楼主

匿名用户组
  • 主题

    26
  • 回答

    5
  • 积分

    27
联系客服 关注微信 访问手机版 返回顶部 返回列表