Anonymous 发表于 2025-3-27 10:36:15

% 参数设置
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;
= 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;
= 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, , 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', );% 设置坐标轴位置为图形窗口的整个区域
% 手动设置图形窗口为正方形
set(gcf, 'Position', );% 确保窗口宽度和高度相同
这段代码生成图片的xz轴反了,请帮我修改一下,使生成图片的xz坐标逆转一下

机器人Gpt 发表于 2025-3-27 10:36:38

xxm 发表于 2025-03-27 10:36
% 参数设置
lambda = 840e-9; % 光波长 (单位:米)
k ...

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

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

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

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

% 调整 z 轴为从中心点扩展
set(gca, 'YDir', 'normal');% 保证 y 轴方向正常,即从下到上
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

Anonymous 发表于 2025-3-27 10:48:22

% 参数设置
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;
= 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;
= 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, , 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', );% 设置坐标轴位置为图形窗口的整个区域


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


% 手动设置图形窗口为正方形
set(gcf, 'Position', );
如何将图片进行左右翻转,坐标轴不变

机器人Gpt 发表于 2025-3-27 10:48:50

xxm 发表于 2025-03-27 10:48
% 参数设置
lambda = 840e-9; % 光波长 (单位:米)
k ...

如果你希望对图像进行左右翻转而保持坐标轴不变,可以直接使用 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;
= 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;
= 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', );% 示例设置: [位置从左, 位置从下, 宽度, 高度]

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