Animating the movement of a figure

I have written a code which makes makes a rectangle rotate about a certain point bya certain angle anticlockwise, but when I proceed on the animation, it draws every single rectangle as it is rotated. How can I make the rectangle rotate without leaving a trace after every iteration?
Here is the code which inolves some funtions:
function [colouredshape] = filledshape(shape,c)
% This function will draw a shape that is filled of a certain colour
fill(shape(1,:),shape(2,:),c);
end
%%%%%%%%%%%%%%%%%%%
function [finalshape] = rotateabout(shape,a,x,y)
% this function will rotate a shape anticlockwise about a certain point rather than the
% origin (angle a, coordinates (x,y))
[newshape] = translate(-x,-y,shape);
[rotatedshape] = rotate(newshape,a);
[finalshape] = translate(x,y,rotatedshape);
end
% This is animation
n = 10;
rectangle1 = [10 10 11 11 10; 1 5 5 1 1];
for a = linspace(0,pi/2,n)
[finalshape] = rotateabout(rectangle1,a,10,5);
filledshape(finalshape,'b')
drawnow
pause(0.1)
end

Antworten (1)

Andreas Bernatzky
Andreas Bernatzky am 13 Dez. 2019
Bearbeitet: Andreas Bernatzky am 13 Dez. 2019

0 Stimmen

A rough and quick example:
for(n=1:1:360)
RectangleData = calcRectangle(n); %calculate your new position
hRectangle = plot(RectangleData); % plot your rectangle
% Now get rid of it.
delete(hRectangle); %clear your plot
end
I can not test your code at the moment. But try the delete() after your pause()
Hope I could help

5 Kommentare

Iñigo de la Joya
Iñigo de la Joya am 14 Dez. 2019
The problem is that I cannot call a function any varibale which can then be deleted: when I use my function I have to write it by itself, not in the format A=funtion(...).
Nevertheless, if I did manage to call it a variable, at the end of the loop my last drawn figure would also be deleted and I want it to remain on the grid.
Ok and if you include an if-clause for the delete-function?
if(currentIteration < maxIterations)
delete(shape); % if you iterate
end
Or you draw the last known position again after the last iteration? (After the for-loop)
Thats my solution:
%% shapeRotor
% rotates shape around a rotation point
%% Andreas Bernatzky 15.12.2019
clear all;
close all;
figure(1)
shape = rand(2,100);
ShapeObj = fill(shape(1,:),shape(2,:),'b');
%% now draw your stuff
for(n=1:1:360)
ShapeObj = rotateAround(1,0.5,0.5,ShapeObj.XData,ShapeObj.YData); % I will rotate around (0.5,0.5) dont know if that fits your usecase but does not matter
ShapeObj = fill(ShapeObj.X,ShapeObj.Y,'b');
xlim([0 1])
ylim([0 1]);
pause(0.05)
end
%-----------------------------------------------------------------------------
%% FUNCTIONS
%rotate your shape
% angle in degree
% centerX rotation X
% centerY rotation Y
function newShape = rotateAround(angle,centerX,centerY,xData,yData)
angle = angle * pi/180;
rotatedX = cos(angle) * (xData - centerX) - sin(angle) * (yData-centerY) + centerX;
rotatedY = sin(angle) * (xData - centerX) + cos(angle) * (yData -centerY) + centerY;
newShape.X = rotatedX;
newShape.Y = rotatedY;
end
Iñigo de la Joya
Iñigo de la Joya am 18 Dez. 2019
Sorry but this doesnt work when I run it on Matlab. It draws a very strange random pattern if you try it.
One question: when I use a function to for example draw a figure, how can I store it inside a variable so that I can then delete the figure?
Andreas Bernatzky
Andreas Bernatzky am 18 Dez. 2019
Bearbeitet: Andreas Bernatzky am 18 Dez. 2019
The strange pattern is normal because I use the rand() function.chaos.PNG
you should see some blue and white shapes. (look at picture)
Maybe my example was a little bit confusing.
For your question:
FigureStorage = plot(someXvalues,someYvalues);
delete(FigureStorage);

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Polar Plots finden Sie in Hilfe-Center und File Exchange

Gefragt:

am 12 Dez. 2019

Bearbeitet:

am 18 Dez. 2019

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by