How to properly define a function handle for fanimator
2 views (last 30 days)
Show older comments
Hey, I would like to use fanimator to build some animations. Here is my problem with it:
In the documentation of fanimator a new call to it is invoked whenever a new part of the animation is defined. In the example a point and a circle are animated and therefore they use fanimator 2 times, once for the point and once for the circle. Now let's say I would like to animate something more complex, with several rectangles, points, circles etc. Is there some neat way to define a function, say complexDrawing, which you can use as a parameter for fanimator, so you only have to call it once and not for every rectangle, point, circle, etc. of the drawing?
To make this more concrete, how would you do that with the example from the documentation?
So instead of
f = @(t) plot(t,1,'r*');
fanimator(f)
syms t x
hold on
fanimator(@fplot,cos(x)+t,sin(x)+1,[-pi pi])
axis equal
hold off
I would like to have something like
fanimator(@(t) complexDrawing(t))
where the point and the circle are defined in complexDrawing. How can this be done? In case this is currently impossible to do by the use of fanimator. What would be the "right way" to animate a more complex drawing in MATLAB?
0 Comments
Answers (1)
Shubham
on 14 May 2024
Hi Frederik,
To animate a more complex drawing with multiple elements (like rectangles, points, circles, etc.) using fanimator in MATLAB, you can indeed define a single function that encapsulates all the drawing commands for these elements. This function will accept the animation parameter (e.g., time t) and use it to update the positions or properties of each element accordingly.
Here's how you can define such a function, complexDrawing, and use it with fanimator. This example will animate a point and a circle together, similar to your request, but you can extend it by adding more graphical elements:
function complexDrawing(t)
% Clear existing plot to avoid superimposing drawings
cla
% Example of animating a point
plot(t, 1, 'r*');
% Hold on to plot additional elements
hold on
% Example of animating a circle
% Define the circle's parameters
r = 1; % radius
center_x = t;
center_y = 1;
theta = linspace(0, 2*pi, 100);
x = r * cos(theta) + center_x;
y = r * sin(theta) + center_y;
% Plot the circle
plot(x, y, 'b-');
% Adjust plot limits if necessary
axis equal
xlim([-10, 10]);
ylim([-10, 10]);
% Hold off after plotting all elements
hold off
end
Now, you can animate this complex drawing with a single call to fanimator:
% Define the animation time span and frame rate
tSpan = [0, 10];
frameRate = 24; % frames per second
% Create the animation window
figure
% Animate the complex drawing
fanimator(@(t) complexDrawing(t), 'AnimationRange', tSpan, 'FrameRate', frameRate);
% Add playback controls
playAnimation
In this setup, complexDrawing is a function that takes the animation parameter t (which could represent time or any other parameter you're animating over) and uses it to update all elements of the drawing. The cla command at the beginning of complexDrawing ensures that the previous frame's elements are cleared before drawing the next frame, preventing them from superimposing over one another.
This approach allows you to encapsulate the entire drawing logic within a single function, making your code cleaner and more manageable, especially for complex animations. You can extend the complexDrawing function by adding more plots and graphical elements as needed, using the parameter t to control their animation.
I hope this helps!
0 Comments
See Also
Categories
Find more on Animation in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!