2017-04-13 2 views
2

나는 3D 점 구름을 그려보고 있지만, 그림을 특정 포즈로 회전시키는 데 어려움을 겪고 있습니다. 예를 들어벡터를 보면서 figure 시점을 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'); 

기본 관점은 내가 'X'위치에서 검은 선을 따라보고 싶지

Figure showing point cloud

입니다. 나는 수동으로 GUI 컨트롤이 그림을 회전 할 수 있고, 나는 그러나

view(96, -46); 

를 사용

Rotated Figure

내가이 위치에 뷰를 회전 할 수 있습니다 고도 -46 방위각 (96)에 가장 가까운을 얻을 것을 발견 시점은 실제로 '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에는 [alt,azi] 대신에 카디 지어 방향 [x,y,z]을 사용할 수있는 옵션이 있습니다.

나를 위해 작동합니다

enter image description here

: 당신은 다음과 같은 결과를 볼 수

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 

(기본 plot 축 스케일링의 변형을 방지하기 위해 axis equal 호출을 유의하시기 바랍니다) 즐겨!

+0

추측 전 문서에서이 부분을 간과했습니다. 좋은 발견! – Cecilia

+0

걱정하지 마라. 문서에 묻어있다. 필자는 atan() * 180/pi()보다는 atand()를 사용해야하지만, 여러분의'[alt, az]'코드가'axis equal'과 함께 동작했을 수도 있다고 생각합니다. –

관련 문제