MATLAB 循环拟合:每隔 10 个单位的 x 值拟合平面
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 著作权归作者所有。请勿转载和采集!