2013-04-05 3 views
0

я сделал звезду, используя этот код:MATLAB Rotate и перемещать 2d объект в то же время

t = 0:4/5*pi:4*pi; 
x = sin(t); 
y = cos(t); 
star = plot(x, y); 
axis([-1 11 -1 11]) 

Теперь мне нужно поворачивать и перемещать эту звезду в то же время. Я пробовал это:

for i=1:0.1:10; 
    zAxis = [0 0 1]; 
    center = [0 0 0]; 
    rotate(star, zAxis, 5, center); 
    x = x+0.1; 
    y = y+0.1; 
    set(star, 'x', x, 'y', y); 
    pause(0.1); 
end 

Но этот код только перемещает звезду и не вращает ее. Если я удалю команду «set», она будет вращаться. Как я могу объединить эти два действия?

ответ

1

Это может сделать работу ..

t = 0:4/5*pi:4*pi; 
x = sin(t); 
y = cos(t) ; 
y = y-mean(y); 
x = x-mean(x); % # barycentric coordinates 

% # rotation and translation 
trasl = @(dx,dy) [dy; dx]; % # this vector will be rigidly added to each point of the system 
rot = @(theta) [cos(theta) -sin(theta); sin(theta) cos(theta)]; % # this will provide rotation of angle theta 


for i = 1:50 
    % # application of the roto-translation 
    % # a diagonal translation of x = i*.1 , y = i*.1 is added to the star 
    % # once a rotation of angle i*pi/50 is performed 
    x_t = bsxfun(@plus,rot(i*pi/50)*([x;y]), trasl(i*.1,i*.1)); 

    star = plot(x_t(1,:), x_t(2,:)); 
    axis([-1 11 -1 11]) 
    pause(.1) 

end 

В принципе, homogeneous coordinates (в этот случай в 2D проективном пространстве ) позволяет выполнять ту же работу более аккуратным способом; на самом деле они позволяли бы использовать только один линейный оператор (матрица 3x3).

Однородные координаты версия:

Op = @(theta,dx,dy) [ rot(theta) , trasl(dx,dy) ; 0 0 1]; 

for i = 1:50 
    x_t = Op(i*pi/50,i*.1,i*.1)*[x;y;ones(size(x))]; 

    star = plot(x_t(1,:), x_t(2,:)); 
    axis([-1 11 -1 11]) 
    pause(.1)  
end 
+0

Спасибо, это работает. Но звезда должна перейти в противоположный угол (вверху справа). Когда я запускаю ваш код, он переходит в верхний левый угол, и поскольку я понятия не имею, что означает ваш код, я не могу его исправить :) – Alen

+0

@Alen, я добавлю некоторое объяснение – Acorbe

+0

@Alen, btw теперь код на верхних ходах звезда в противоположном углу – Acorbe

0

Вы можете просто использовать rotation matrix для вычисления правильного преобразования на векторах [x; y]:

theta = 5 * (pi/180); % 5 deg in radians 
Arot = [cos(theta) -sin(theta); sin(theta) cos(theta)]; 
xyRot = Arot * [x; y]; % rotates the points by theta 
xyTrans = xyRot + 0.1; % translates all points by 0.1 
set(star, 'x', xyTrans(1, :), 'y', xyTrans(2, :)); 
+0

это не работает, теперь звезда просто не стоит на месте, нет движения. – Alen

+0

Это, по-видимому, потому, что вы все еще выполняете 'set (star, 'x', x, 'y', y);' вместо 'set (star, 'x', xyTrans (1, :), 'y', xyTrans (2, :)); '. Вам также нужно будет поставить 'x = get (star, 'x'); y = get (star, 'y'); 'в начале вашего цикла. – wakjah

+0

Я просто скопировал ваш код: http://screencloud.net/v/k7OJ вы видите его на этом скриншоте. – Alen

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