如何在Matlab的2D投影图上绘制z轴的最小与最大值
解决MATLAB中3D网格投影后标注Z轴极值的问题
问题分析
你的代码存在几个关键问题:
- 变量名冲突:使用
min和max作为变量名会覆盖MATLAB的内置函数,可能导致后续代码出错。 - 坐标不匹配:在
view(0,0)(沿X轴侧视)的视角下,2D绘图的X轴对应原始网格的Y坐标,Y轴对应原始网格的Z坐标。你直接用Z轴极值作为X坐标、固定范围[0,1]作为Y坐标,完全不符合当前视图的投影逻辑。 - 未定位实际极值点:你只获取了Z轴的极值数值,但没有找到这些极值对应的网格顶点在投影视图中的实际位置。
修正后的代码
以下是完整的修正方案,包含两种标注方式(标记极值点/绘制极值水平线):
clc; clear all; % 读取网格数据 mesh = readSurfaceMesh("Mesh.ply"); Vertices = mesh.Vertices; Faces = mesh.Faces; % 获取Z轴极值(避免覆盖内置函数) min_z = min(Vertices(:,3)); max_z = max(Vertices(:,3)); % 绘制3D网格并切换到侧视视角 figure; p = patch('Faces', Faces, 'Vertices', Vertices); view(0, 0); % 头部深度侧视图 hold on; axis equal; % 保持坐标轴比例,避免变形 % --- 方式1:标记Z轴极值对应的顶点 --- % 找到Z轴最小和最大值的顶点索引 idx_min = find(Vertices(:,3) == min_z); idx_max = find(Vertices(:,3) == max_z); % 获取这些顶点在侧视图中的坐标(Y为X轴,Z为Y轴) y_min = Vertices(idx_min, 2); z_min = Vertices(idx_min, 3); y_max = Vertices(idx_max, 2); z_max = Vertices(idx_max, 3); % 绘制极值点标记 plot(y_min, z_min, 'ro', 'MarkerSize', 10, 'LineWidth', 2); plot(y_max, z_max, 'go', 'MarkerSize', 10, 'LineWidth', 2); % --- 方式2:绘制贯穿头部宽度的极值水平线(可选)--- % 获取头部Y坐标的范围(侧视图的X轴范围) y_range = [min(Vertices(:,2)), max(Vertices(:,2))]; % 绘制最小Z值水平线 plot(y_range, [min_z, min_z], 'r--', 'LineWidth', 2); % 绘制最大Z值水平线 plot(y_range, [max_z, max_z], 'g--', 'LineWidth', 2); % 添加图例和标签(可选) legend('网格', 'Z最小值点', 'Z最大值点', 'Z最小值线', 'Z最大值线'); xlabel('头部宽度(Y轴)'); ylabel('头部高度(Z轴)'); title('头部网格侧视图及Z轴极值标注');
关键说明
view(0,0)的投影逻辑:该视角下,网格的Y坐标对应2D图的X轴(左右方向),Z坐标对应2D图的Y轴(上下方向),X坐标会被投影忽略。- 极值点定位:通过
find函数找到对应Z极值的顶点,确保标记点准确落在网格上。 - 坐标轴比例:添加
axis equal避免视图变形,保证标注位置的准确性。
内容的提问来源于stack exchange,提问作者Sanket Jain
相关产品推荐
相关产品推荐

