function plot_3d_grid_voxel_function_fixed(nx, ny, nz, dx, dy, dz, data) % 使用自定义voxel函数绘制三维网格(每个网格单一颜色) % 输入参数: % nx, ny, nz - 各方向的网格数 % dx, dy, dz - 各方向的网格尺寸向量 % data - 物理量数据,维度为(nx, ny, nz) % 计算每个网格的中心坐标 x_center = zeros(nx, 1); x_center(1) = dx(1)/2; for i = 2:nx x_center(i) = x_center(i-1) + (dx(i-1) + dx(i))/2; end y_center = zeros(ny, 1); y_center(1) = dy(1)/2; for i = 2:ny y_center(i) = y_center(i-1) + (dy(i-1) + dy(i))/2; end z_center = zeros(nz, 1); z_center(1) = dz(1)/2; for i = 2:nz z_center(i) = z_center(i-1) + (dz(i-1) + dz(i))/2; end % 创建图形 figure('Position', [100, 100, 1000, 800]); hold on; % 设置颜色映射 colormap jet; caxis([min(data(:)), max(data(:))]); % 绘制每个体素 alpha_val = 0.9; % 透明度 for i = 1:nx for j = 1:ny for k = 1:nz % 绘制体素 - 传递当前网格的值 voxel_fixed([x_center(i), y_center(j), z_center(k)], ... [dx(i), dy(j), dz(k)], ... data(i, j, k), alpha_val); 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 function voxel_fixed(center, size, value, alpha) % 绘制单个体素的辅助函数(每个面使用相同颜色) % center: [x, y, z] 中心坐标 % size: [dx, dy, dz] 尺寸 % value: 物理量值 % alpha: 透明度 % 计算8个顶点 x = center(1) + [-size(1)/2, size(1)/2]; y = center(2) + [-size(2)/2, size(2)/2]; z = center(3) + [-size(3)/2, size(3)/2]; % 创建8个顶点 vertices = [x(1), y(1), z(1); x(2), y(1), z(1); x(2), y(2), z(1); x(1), y(2), z(1); x(1), y(1), z(2); x(2), y(1), z(2); x(2), y(2), z(2); x(1), y(2), z(2)]; % 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, ... 'EdgeColor', 'none'); end