MATLAB三维凸包绘制

MATLAB三维凸包绘制方法详解


一、基础实现流程

核心步骤

  1. 生成/加载三维点云数据
  2. 计算凸包几何结构
  3. 可视化原始点与凸包表面

代码

% 生成随机三维点云(20个点)
n = 20;
points = rand(n,3)*10;

% 计算凸包拓扑结构
K = convhull(points);

% 绘制原始点云
figure;
plot3(points(:,1), points(:,2), points(:,3), 'ko', 'MarkerSize', 8, 'LineWidth', 1.5);

% 绘制凸包表面
hold on;
trisurf(K, points(:,1), points(:,2), points(:,3), ...
    'FaceColor', 'cyan', 'EdgeColor', 'm', 'FaceAlpha', 0.5);
axis equal;
grid on;
xlabel('X'); ylabel('Y'); zlabel('Z');
title('三维凸包可视化');
hold off;

二、关键参数解析

参数 说明 示例值
convhull 计算凸包的顶点索引,返回矩阵K的每行表示一个三角形面片的顶点索引 K = convhull(X)
trisurf 绘制三角网格表面,支持颜色映射和透明度调整 FaceAlpha=0.6
FaceColor 设置表面颜色(支持预定义颜色或RGB值) 'cyan'
EdgeColor 设置网格边线颜色 'none''r'
MarkerSize 控制原始数据点的显示大小 10

三、高级功能实现

1. 凸包体积计算
% 计算凸包体积和表面积
[V, A] = convhull(points);
disp(['凸包体积: ', num2str(V)]);
disp(['表面积: ', num2str(A)]);
2. 简化凸包结构

通过'Simplify'参数减少冗余顶点:

K_simplified = convhull(points, 'Simplify', true);
3. 动态凸包更新

实时更新点云并重建凸包:

% 初始化点云
points = rand(10,3);

% 创建图形窗口
h = figure;
ax = axes('Parent', h);
plot3(ax, points(:,1), points(:,2), points(:,3), 'ko');

% 动态添加点并更新凸包
for i = 11:30
    new_point = rand(1,3)*10;
    points = [points; new_point];
    
    % 重新计算凸包
    K = convhull(points);
    
    % 更新图形
    cla(ax);
    plot3(ax, points(:,1), points(:,2), points(:,3), 'ko');
    hold(ax, 'on');
    trisurf(K, points(:,1), points(:,2), points(:,3), 'FaceColor', 'yellow');
    hold(ax, 'off');
    drawnow;
end

参考代码 matlab画三维凸包 youwenfan.com/contentcnc/80033.html

四、可视化优化技巧

  1. 颜色映射增强:

    colormap(jet); % 选择渐变色
    colorbar;      % 显示颜色条
    
  2. 光照效果设置:

    lighting phong; % 设置光照模型
    material dull;  % 材质属性调整
    
  3. 多视角展示:

    view(3);        % 默认三维视角
    rotate3d on;    // 开启交互式旋转
    

五、应用场景示例

  1. 点云分析:

    % 加载点云数据
    ptCloud = pcread('teapot.ply');
    points = ptCloud.Location;
    
    % 计算凸包
    K = convhull(points);
    
    % 可视化
    pcrender(ptCloud);
    hold on;
    trisurf(K, points(:,1), points(:,2), points(:,3), 'FaceAlpha', 0.3);
    
  2. 几何建模:

    • 通过凸包生成基础几何体

    • 结合

      stlwrite
      

      导出为STL文件:

      [tri, X] = stlread('model.stl');
      [K, points] = convhull(X);
      stlwrite('convex_hull.stl', points, K);
      
posted @ 2025-08-13 15:58  小前端攻城狮  阅读(34)  评论(0)    收藏  举报