function plot_3d_grid_voxel_full(nx, ny, nz, dx, dy, dz, data) % 绘制三维笛卡尔网格全充满的体素图(每个网格单一颜色) % 输入参数: % nx, ny, nz - 各方向的网格数 % dx, dy, dz - 各方向的网格尺寸向量 % data - 物理量数据,维度为(nx, ny, nz) % 计算每个网格的边界坐标 x_edges = zeros(nx+1, 1); x_edges(1) = 0; for i = 1:nx x_edges(i+1) = x_edges(i) + dx(i); end y_edges = zeros(ny+1, 1); y_edges(1) = 0; for i = 1:ny y_edges(i+1) = y_edges(i) + dy(i); end z_edges = zeros(nz+1, 1); z_edges(1) = 0; for i = 1:nz z_edges(i+1) = z_edges(i) + dz(i); end % 创建图形窗口 figure('Position', [100, 100, 1000, 800]); hold on; % 设置颜色映射 colormap jet; caxis([min(data(:)), max(data(:))]); % 绘制每个体素 alpha_value = 0.9; % 透明度 for i = 1:nx for j = 1:ny for k = 1:nz % 获取当前体素的边界 x_min = x_edges(i); x_max = x_edges(i+1); y_min = y_edges(j); y_max = y_edges(j+1); z_min = z_edges(k); z_max = z_edges(k+1); % 获取当前体素的物理量值 value = data(i, j, k); % 创建体素的8个顶点 vertices = [x_min, y_min, z_min; x_max, y_min, z_min; x_max, y_max, z_min; x_min, y_max, z_min; x_min, y_min, z_max; x_max, y_min, z_max; x_max, y_max, z_max; x_min, y_max, z_max]; % 创建6个面的顶点索引 faces = [1 2 3 4; % 底面 5 6 7 8; % 顶面 1 2 6 5; % 前面 2 3 7 6; % 右面 3 4 8 7; % 后面 4 1 5 8]; % 左面 % 关键修改:使用 'flat' 确保每个面单一颜色 % 并且为每个面指定相同的颜色值 patch('Vertices', vertices, 'Faces', faces, ... 'FaceColor', 'flat', ... % 'flat' 确保每个面单一颜色 'FaceVertexCData', value * ones(size(faces, 1), 1), ... % 所有面使用相同颜色值 'CDataMapping', 'scaled', ... 'FaceAlpha', alpha_value, ... 'EdgeColor', 'none'); end end end % 设置图形属性 colorbar; xlabel('X'); ylabel('Y'); zlabel('Z'); title('三维笛卡尔网格全充满物理量分布(每个网格单一颜色)'); axis equal; view(3); grid on; box on; % 设置光照 lighting gouraud; light('Position', [1 1 1], 'Style', 'infinite'); light('Position', [-1 -1 -1], 'Style', 'infinite'); hold off; end