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)

最后获得平面的方向量;

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值