clc;clear all;
data = load( 'data.txt');
xx=data(:,1);
yy=data(:,2);
zz=data(:,3);
[m,n]=size(data);
plot3(xx,yy,zz); hold off;
bestnorm=zeros(1,3);
Norm=zeros(1,3);
inierror=0;
for i=1:20000
#随机取三个点
index=randi([1 200],1,3);
if index(1)==index(2) || index(1)==index(3)||index(2)==index(3)
continue;
end
point1=data(index(1),:);
point2=data(index(2),:);
point3=data(index(3),:);
#判断是否三点在同一直线上
p1_vector=point1-point2;
p2_vector=point1-point3;
p1_vector_length=norm(p1_vector);
p2_vector_length=norm(p2_vector);
cosT=(sum(p1_vector.*p2_vector))/(p1_vector_length*p2_vector_length);
if cosT==1
continue;
end
#计算法向量
Norm(1)= p1_vector(2)*p2_vector(3) - p1_vector(3)*p2_vector(2);
Norm(2) = -(p1_vector(1)*p2_vector(3) - p1_vector(3)*p2_vector(1));
Norm(3) = p1_vector(1)*p2_vector(2) - p1_vector(2)*p2_vector
#统计平面上点的个数
err=0;
for j=1:m
point=data(j,:)-point1;
if data(j,:)==point1
continue;
end
cosTs=(sum(point.*Norm))/(norm(Norm)*norm(point));
distance= norm(point)*abs(cosTs);
if distance<1
err=err+1;
end
end
#保留点个数最大的平面
if err>inierror
inierror=err;
p=point1;
bestnorm = Norm;
end
end
bestnorm=bestnorm./norm(bestnorm)
最后获得平面的方向量;
当然你想要别的也可以修改;