matlab 拟合三维平面

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)

最后获得平面的方向量;

当然你想要别的也可以修改;

你可能感兴趣的:(matlab,算法,机器学习,人工智能)