clc;
close all;

% 读取 CSV 文件
data = csvread('D:\桌面\点云\del-point.csv');

% 提取 x 和 y 坐标
x = data(:, 1);
y = data(:, 2);
z = data(:, 3);

% 绘制所有点
scatter3(x, y, z, '.');
xlabel('X');
ylabel('Y');
zlabel('Z')
title('坐标点分布');
set(gca,'YLim',[-5,5],'YTick',[-5 -4 -3 -2 -1 0 1 2 3 4 5],'ZLim',[-3,3],'ZTick',[-3 -2 -1 0 1 2 3])
hold on;

% 设置 x 范围
x_step = 10;

for x_min = 0 : x_step : max(x) - x_step
    x_max = x_min + x_step;

    y_min = -1.6;
    y_max = -1.4;

    % 筛选符合范围的点
    idx = (x >= x_min) & (x <= x_max) & (y >= y_min) & (y <= y_max);
    x_filtered = x(idx);
    y_filtered = y(idx);
    z_filtered = z(idx);

    planeData = [x_filtered, y_filtered, z_filtered];

    % 协方差矩阵的SVD变换中,最小奇异值对应的奇异向量就是平面的方向
    xyz0 = mean(planeData, 1);
    centeredPlane = bsxfun(@minus, planeData, xyz0);
    [U, S, V] = svd(centeredPlane);

    a = V(1, 3);
    b = V(2, 3);
    c = V(3, 3);
    d = -dot([a, b, c], xyz0);

    % 图形绘制
    xfit = x_min:0.1:x_max;
    yfit = min(y_filtered):0.1:max(y_filtered);
    [XFIT, YFIT] = meshgrid(xfit, yfit);
    ZFIT = -(d + a * XFIT + b * YFIT) / c;
    mesh(XFIT, YFIT, ZFIT);
    hold on;
end

在这个修改后的代码中,我们使用一个循环来控制 x_min 的值,每次增加 x_step 的大小。然后,我们计算对应的 x_max 值,并筛选符合范围的点进行拟合和绘制。在每次循环中,我们都会绘制一个平面拟合结果。

请注意,你可以根据需要调整 x_step 的大小。同时,确保将 CSV 文件的路径正确指定。


原文地址: https://www.cveoy.top/t/topic/cqhW 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录