0

このコードを使用してスターを作成しました:

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」コマンドを削除すると、回転します。これら 2 つのアクションを組み合わせるにはどうすればよいですか?

4

2 に答える 2

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

原則として、同次座標(この場合は2D 射影空間) を使用すると、同じ作業をより適切に行うことができます。実際、線形演算子 (3x3 行列) を 1 つだけ使用できます。

同次座標バージョン:

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
于 2013-04-05T16:02:17.767 に答える
0

回転行列を使用して、ベクトルの正しい変換を計算できます[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, :));
于 2013-04-05T15:43:29.150 に答える