簡體   English   中英

旋轉3D表面直到在MATLAB上水平

[英]Rotate 3D Surface until Level on MATLAB

我尚未開始創建代碼,因為我有些困惑,希望獲得一些幫助以指導我朝正確的方向發展。 我必須使用MATLAB來解決以下問題:給定3D表面(大約300個點)的x,y,z,該表面繞x軸傾斜任意角度theta,相對於x軸傾斜任意角度alpha y軸。 目的是使表面傾斜,使所有z值都相同,這意味着表面是水平的。

我曾嘗試使用旋轉矩陣,但仍未達到我的預期。 任何建議和想法都將不勝感激。

這不是很優雅,但是您可以嘗試通過圍繞x和y軸以設定的增量旋轉圖形來強行強制解決方案。 然后,簡單地采取最大z坐標數在一個狹窄范圍內的解決方案。 這意味着表面大約是水平的。

一種類似的方法,但更為正式的方法是計算與表面平行的矢量並知道該矢量的方向,通過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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM