2014-09-20 7 views
0

Я создал трехмерную поверхность в матрице.Вращение 3D-фигуры в MATLAB

clear all; 
close all; 
clc; 

x = [1:0.1:5]; 
y=[1:50]; 
[n1 n2] = size(x); 
[m1, m2] = size(y); 

for i = 1 : m2 
    for j = 1 : n2 

     z(i,j) = (x(1,j))/(y(1,i));   
    end 
end 
[x, y] = meshgrid(x, y); 

surf(y, x, z) 
colorbar 
xlabel('x') 
ylabel('y') 
zlabel('z') 

я получил следующую поверхность нанесено:

enter image description here

Я заинтересован теперь вращать куб на четверть оборота в направлении по часовой стрелке. Я знаю, что я могу использовать «rotate3d on» и выбрать лучший Az и EI, но я не понял, что это Az и EI и как должен быть равно реагировать на мою потребность?

Например:

enter image description here

Там также другая функция называется camroll(). Но я не знаю, для чего нужно значение в(), чтобы повернуть куб четвертого оборота по часовой стрелке. Правильный ответ на 90 градусов?

Любая помощь будет очень признательна!

+1

Почему вы не делаете простой тест? поверните на угол, который вы знаете, как он должен себя вести, и чем экстраполировать его на тот, который вам нужен. – ASantosRibeiro

+0

Во-первых, спасибо за ваш ответ :), я просто хочу повернуть куб четвертого оборота по часовой стрелке. Но как выбрать Az и AI при использовании «rotate3d». – Christina

+0

Проверьте функцию вращения Matlab. у вас есть 3 направления, так что у вас есть 3 направления по часовой стрелке. если вы хотите повернуть по оси х на 45 градусов, вы будете вращаться (h, [1,0,0], 45). надеюсь, что это помогает – ASantosRibeiro

ответ

1

как упоминается @ASantosRibeiro, функция rotate будет выдавать требуемый результат. В стороне, вот векторная версия вашего кода, которую вы можете найти полезной, если у вас есть значительно больший набор данных.

x = 1:0.1:5; 
y=1:50; 

X = repmat(x',1,size(y,2)).'; 
Y = repmat(y',1,size(x,2)); 
Z = X./Y; 

figure 
hSurf = surf(Y,X,Z); 

rotate(hSurf,[1,0,0],45) % As proposed by @ASantosRibeiro 

colorbar 
xlabel('x') 
ylabel('y') 
zlabel('z') 

repmat функция используется для репликации как х и у, чтобы сформировать X и Y с правильными размерами, чтобы иметь возможность разделить одну за другой, чтобы сформировать Z. Эта операция очень похожа на вызовите meshgrid в свой код. Для небольшого набора данных, подобного тому, который приведен в вашем примере, время работы похоже на оба метода (на моем ноутбуке), однако, когда я использую x = 1: 0,1: 500 и y = 1: 500, например, векторизованная версия занимает в 3 раза меньше времени , поэтому, возможно, стоит посмотреть на это.

Надеюсь, что вам поможет!

+0

Осторожно. Функция 'rotate' будет вращать _объект_, а не вид (угол камеры). Это означает, что все точки данных фактически изменят координаты. Это не проблема, если конечное использование предназначено только для этой визуализации, но это будет иметь последствия, если вы планируете позже получить координаты своего объекта. В противном случае, хорошая работа для указателя 'repmat' ;-) – Hoki

+0

О да, вы так хорошо благодарите за то, что указали это :) –

2

Чтобы повернуть фигуру оси вы можете использовать вид команду:

surf(rand(20)) 
for az = 360:-1:-0 
    view(az, 30) 
    pause(0.01) 
end 

Azimus имеет значения между 0 ° и 360 °. Чтобы повернуть ось на 90 ° против часовой стрелки, вы выбираете азимуты: [270, 180, 90, 0]

Смежные вопросы