2017-04-13 73 views
2

我正在繪製一個3d點雲,但難以將這個圖形旋轉到某個姿勢。如何將圖形視點移動到三維位置,查看矢量?

例如,

figure; hold on; 

z = linspace(0,3*pi,250); 
x = 2*cos(z) + rand(1,250); 
y = 2*sin(z) + rand(1,250); 

plot3(x, y, z, 'b.', 'MarkerSize', 20); 

plot3(x(1), y(1), z(1), 'kx', 'MarkerSize', 20); 
plot3([x(1) x(end)], [y(1) y(end)], [z(1) z(end)], '-k'); 

默認視角

Figure showing point cloud

我想沿着從 'X' 位置的黑線的樣子。我可以手動旋轉用GUI控件的身影,我發現我使用

view(96, -46); 

然而在獲得96方位最接近海拔-46

Rotated Figure

我的觀點旋轉到這個位置,該觀點實際上並不位於'X'的頂部。 'X'在視點前方有一段距離。另外,每次我調用此代碼時,我都有不同的矢量,所以每次都不能使用相同的方位角和仰角。

我應該可以計算矢量的方位角和仰角。我的企圖,

x_dif = x(end)- x(1); 
y_dif = y(end)-y(1); 
z_dif = z(end)-z(1); 

azimuth = (atan(x_dif/y_dif))*180/pi; 
elevation = (atan(z_dif/sqrt(x_dif^2+y_dif^2)))*180/pi; 
view(azimuth, elevation); 

這產生了一個不正確的解決方案。我認爲這可能是因爲方位角和高程應該相對於情節框的中心。 (view documentation)。我不知道如何做到這一點。

如何計算並應用旋轉給定的矢量圖?

回答

3

view有一個選項可以使用cartisian方向[x,y,z]而不是[alt,azi]

這對我的作品:(請注意axis equal呼籲避免在默認plot軸縮放變形)

function cecilia() 
    figure; hold on; 

    z = linspace(0,3*pi,250); 
    x = 2*cos(z) + rand(1,250); 
    y = 2*sin(z) + rand(1,250); 

    plot3(x, y, z, 'b.', 'MarkerSize', 20); 

    plot3(x(1), y(1), z(1), 'kx', 'MarkerSize', 20); 
    plot3([x(1) x(end)], [y(1) y(end)], [z(1) z(end)], '-k'); 

    x_dif = x(end)- x(1); 
    y_dif = y(end)-y(1); 
    z_dif = z(end)-z(1); 

    view([x_dif,y_dif,z_dif]); 
    axis equal 
end 

您應該看到以下結果:

enter image description here

請享用!

+0

猜猜我剛剛在文檔中忽略了這一點。好找! – Cecilia

+0

不用擔心,文檔會掩蓋它。儘管你應該使用atand()而不是atan()* 180/pi()',我認爲你的'[alt,az]'代碼可能也適用於'axis equal'。 –