init
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
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
|
||||
Reference in New Issue
Block a user