我还没有开始创建代码,因为我有点卡住了,希望得到一些帮助来引导我朝着正确的方向前进。我必须使用MATLAB来解决以下问题: 给出3D表面(约300个点)的x,y,z,其围绕x轴倾斜任意角度θ并且绕y轴倾斜任意角度α。目标是倾斜表面,使所有z值相同,这意味着表面是水平的。
我曾尝试使用旋转矩阵,但它没有达到我的预期。非常感谢任何建议和想法。
答案 0 :(得分:0)
它并不优雅,但您可以通过围绕x轴和y轴以设定的增量旋转图形来尝试强制解决方案。然后,简单地采用最大z坐标数落在窄范围内的解决方案。这意味着表面大致水平。
答案 1 :(得分:0)
类似的方法,但更正式的是计算平行于表面的矢量并知道该矢量的方向,旋转参数很容易通过c=norm((a,b,c))*cos(angle)
获得。
如果你有一个类似平面的曲面,你可以将它拟合成一个平面方程a*x+b*y+c*z+d=0
,并且垂直于平面的矢量是(a,b,c)
。
如果你有另一种类型的表面 - 通常是人们所拥有的 - 你仍然可以发现平面的矢量有用,因为平面可能与表面平行或者可能给出比较的方向转动。
根据您的实现方式,它只会旋转原点(0,0,0)处的旋转点。如果你的飞机远离原点,两个数字将相距很远。一个简单的翻译就可以解决它。
使用我使用的代码。
n=300;
x= 20.*rand(n,1)-10; %interval
y= 20.*rand(n,1)-10; %interval
%if you want to plot a plane
z=(2*(y+rand(n,1)*0.3)+2*(x+rand(n,1)*0.3)-7)/.4+rand(n,1)*0.3;
figure()
plot3(x,y,z,'.')
hold on
%here i put the plane average data on zero
Centerplane=[mean(x) mean(y) mean(z)];
xc=x-mean(x);
yc=y-mean(y);
zc=z-mean(z);
%get the 'a' and 'b' component of the plane equation (z=a*x +b*y +d)
A=[xc yc]; B=zc;
r=A\B %%%Matlab!
r = vrrotvec( (([r(1) r(2) 1]/norm([r(1) r(2) 1]))),[0 0 1]);
RM=vrrotvec2mat(r); %get the rotation matrix
rdata=[xc,yc,zc]*RM; %rotate data
% put in the proper position back
rt_c_x=rdata(:,1)+mean(x);
rt_c_y=rdata(:,2)+mean(y);
rt_c_z=rdata(:,3)+mean(z);
%and plot
plot3(rt_c_x,rt_c_y,rt_c_z,'c.')
A=[x y]; B=z; %default data
r=A\B %%%Matlab!
r = vrrotvec( (([r(1) r(2) 1]/norm([r(1) r(2) 1]))),[0 0 1]);
RM=vrrotvec2mat(r); %get the rotation matrix
rdata2=[x,y,z]*RM; %rotate data
%and plot
plot3(rdata2(:,1),rdata2(:,2),rdata2(:,3),'g.')
xlabel('X')
ylabel('Y')
zlabel('Z')