function plot_3d_grid_patch_optimized(nx, ny, nz, dx, dy, dz, data) % 使用patch一次性绘制所有网格(优化版本) % 输入参数: % 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 % 创建网格顶点坐标 [X_edges, Y_edges, Z_edges] = ndgrid(x_edges, y_edges, z_edges); % 重新排列顶点 vertices = [X_edges(:), Y_edges(:), Z_edges(:)]; % 创建每个体素的8个顶点索引 n_cells = nx * ny * nz; faces = zeros(n_cells * 6, 4); % 每个体素6个面,每个面4个顶点 face_colors = zeros(n_cells * 6, 1); % 顶点编号方式:按照(i,j,k)顺序 % 每个体素的8个顶点索引 % v1: (i,j,k) % v2: (i+1,j,k) % v3: (i+1,j+1,k) % v4: (i,j+1,k) % v5: (i,j,k+1) % v6: (i+1,j,k+1) % v7: (i+1,j+1,k+1) % v8: (i,j+1,k+1) face_idx = 1; for i = 1:nx for j = 1:ny for k = 1:nz % 计算当前体素的8个顶点索引 idx = @(ii, jj, kk) (ii-1)*(ny+1)*(nz+1) + (jj-1)*(nz+1) + kk; v1 = idx(i, j, k); v2 = idx(i+1, j, k); v3 = idx(i+1, j+1, k); v4 = idx(i, j+1, k); v5 = idx(i, j, k+1); v6 = idx(i+1, j, k+1); v7 = idx(i+1, j+1, k+1); v8 = idx(i, j+1, k+1); % 当前体素的值 cell_value = data(i, j, k); % 底面 (k层) faces(face_idx, :) = [v1, v2, v3, v4]; face_colors(face_idx) = cell_value; face_idx = face_idx + 1; % 顶面 (k+1层) faces(face_idx, :) = [v5, v6, v7, v8]; face_colors(face_idx) = cell_value; face_idx = face_idx + 1; % 前面 (j层) faces(face_idx, :) = [v1, v2, v6, v5]; face_colors(face_idx) = cell_value; face_idx = face_idx + 1; % 后面 (j+1层) faces(face_idx, :) = [v4, v3, v7, v8]; face_colors(face_idx) = cell_value; face_idx = face_idx + 1; % 左面 (i层) faces(face_idx, :) = [v1, v4, v8, v5]; face_colors(face_idx) = cell_value; face_idx = face_idx + 1; % 右面 (i+1层) faces(face_idx, :) = [v2, v3, v7, v6]; face_colors(face_idx) = cell_value; face_idx = face_idx + 1; end end end % 创建图形 figure('Position', [100, 100, 1000, 800]); % 绘制所有面 patch('Vertices', vertices, 'Faces', faces, ... 'FaceVertexCData', face_colors, ... 'FaceColor', 'flat', ... 'CDataMapping', 'scaled', ... 'EdgeColor', 'none', ... 'FaceAlpha', 0.9); % 设置属性 colorbar; colormap jet; 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'); end