3个回答
展开全部
%点X,Y,Z到平面Ax+By+Cz+D=0的距离为
%d(ABCD,XYZ)=|AX+BY+CZ+D|/sqrt(A^2+B^2+C^2)
%ABCD四个变量只有三个是互相独立的
%设A=cos(a);B=sin(a)*cos(b);C=sin(a)*sin(b)
%那么A^2+B^2+C^2=1,距离公式化简为
%d(abc,XYZ)=|cos(a)*X+sin(a)*cos(b)*Y+sin(a)*sin(b)*Z+c|
%现在有已知点序列X,Y,Z,求参数 a b c
%先构造一个函数fun(p) 输入参数为p,其中p(1)=a,p(2)=b,p(3)=c
%使用 lsqnonlin求得p,使得sum((fun(p))^2)最小
fun=@(p) cos(p(1))*X+sin(p(1))*cos(p(2))*Y+sin(p(1))*sin(p(2))*Z+p(3);
p = lsqnonlin(fun,[0 0 0]);
A=cos(p(1));B=sin(p(1))*cos(p(2));C=sin(p(1))*sin(p(2));D=p(3);
%d(ABCD,XYZ)=|AX+BY+CZ+D|/sqrt(A^2+B^2+C^2)
%ABCD四个变量只有三个是互相独立的
%设A=cos(a);B=sin(a)*cos(b);C=sin(a)*sin(b)
%那么A^2+B^2+C^2=1,距离公式化简为
%d(abc,XYZ)=|cos(a)*X+sin(a)*cos(b)*Y+sin(a)*sin(b)*Z+c|
%现在有已知点序列X,Y,Z,求参数 a b c
%先构造一个函数fun(p) 输入参数为p,其中p(1)=a,p(2)=b,p(3)=c
%使用 lsqnonlin求得p,使得sum((fun(p))^2)最小
fun=@(p) cos(p(1))*X+sin(p(1))*cos(p(2))*Y+sin(p(1))*sin(p(2))*Z+p(3);
p = lsqnonlin(fun,[0 0 0]);
A=cos(p(1));B=sin(p(1))*cos(p(2));C=sin(p(1))*sin(p(2));D=p(3);
追问
感谢大神~~~请问这个能加一条语句显示点云与拟合平面的图像吗?
追答
其实其他两个回答也是对的,只是不能满足一些特殊情况
WM_THU的回答,在D=0时,会有问题
tianxiawulang的回答在 C=0时,也会有问题
一般情况下,如果确保平面不是和z轴平行的话,
还希望画出图像,用tianxiawulang的会简便一点
fun=@(p,x,y) p(1)*x+p(2)*y+p(3);
para=lsqcurvefit(@(p,data) fun(p,data(:,1),data(:,2)),[1 1 1],[X Y],Z);
%拟合为 Z=para(1)*X+para(2)*Y+para(3)
plot3(X,Y,Z,'.');hold on;
h=ezsurf(@(x,y)fun(para,x,y),[min(X) max(X) min(Y) max(Y)]); hold off;
set(h,'edgecolor','none','facealpha',0.3,'FaceColor','r');
展开全部
[线性解法]:
设平面方程aX+bY+cZ+d=0, 两边同除以d,有:aX+bY+cZ = -1
然后就可以做线性最小二乘了:
H = [X Y Z];
Y = -ones(size(X));
P = H\Y;
得到的P是一个长度3的向量,分别是[a; b; c]
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
代码供参考(你只需要最后两行):
% 生成测试数据
X = randn(5241,1);
Y = randn(5241,1);
% 平面方程
Z = -0.5*X+0.6*Y+0.7;
% 数据加入噪声
Z = Z + randn(5241,1)*0.1;
% 数据拟合
f=inline('c(1)*x(:,1)+c(2)*x(:,2)+c(3)','c','x');
c=lsqcurvefit(f,[1 1 1],[X Y],Z)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询