How should I call animation from classdef?

4 ビュー (過去 30 日間)
ryunosuke tazawa
ryunosuke tazawa 2021 年 10 月 27 日
コメント済み: DGM 2025 年 8 月 15 日
I want to know the way to call the animation from classdef.
I defined the animatedline in classdef, and I called the animation to other code from the classdef.
But it did not showed the animation.
close all;
Length1 = 1.0;
Length2 = 1.0;
Mass1 = 1.0;
Mass2 = 1.0;
Ts = 0.01;
Theta_Initial1 = 0;
Theta_Initial2 = 0;
AngularVelocity_Initial1 = 0;
AngularVelocity_Initial2 = 0;
Pendulum2 = classDoublePendulum(Length1,Length2,Mass1,Mass2,Theta_Initial1,Theta_Initial2,AngularVelocity_Initial1,AngularVelocity_Initial2,Ts);
Trq = [10; 10];
for i=1:100
Pendulum2.Dstep(Trq); % call classdef but animation did not work.
end
Please someone help me , teach me the way.
classdef classDoublePendulum < handle
properties
Length1 = 1;
Length2 = 1;
Mass1 = 1;
Mass2 = 1;
AngularVelocity1 = 0;
AngularAcceleration1 = 0;
AngularVelocity2 = 0;
AngularAcceleration2 = 0;
Theta1 = 0;
Theta2 = 0;
Ts = 0.01;
X_Position1;
Y_Position1;
X_Position2;
Y_Position2;
Ball_Arrival = 0;
num1_1;
num1_2;
num1_3;
num1_4;
den1;
num2_1;
num2_2;
num2_3;
num2_4;
den2;
end
properties(Access = private)
Gravity = 9.8;
Pendulum_Double;
Curve;
Range;
end
methods
function obj = classDoublePendulum(Length1,Length2, Mass1,Mass2, Theta1, Theta2, AngularVelocity1, AngularVelocity2, Ts)
obj.Length1 = Length1;
obj.Length2 = Length2;
obj.Mass1 = Mass1;
obj.Mass2 = Mass2;
obj.Theta1 = Theta1;
obj.Theta2 = Theta2;
obj.AngularVelocity1 = AngularVelocity1;
obj.AngularVelocity2 = AngularVelocity2;
obj.Ts = Ts;
obj.X_Position1 = obj.Length1 * sin(obj.Theta1);
obj.Y_Position1 = -obj.Length1 * cos(obj.Theta1);
obj.X_Position2 = obj.X_Position1 + obj.Length2 * sin(obj.Theta1 + obj.Theta2);
obj.Y_Position2 = obj.Y_Position1 - obj.Length2 * cos(obj.Theta1 + obj.Theta2);
obj.Ball_Arrival = obj.X_Position2 + +abs(obj.AngularVelocity2)*(sqrt(2*abs(obj.Y_Position2)/obj.Gravity)); % ボールの距離
% animationcall
obj.Pendulum_Double = animatedline('Color','b','Marker','o','MarkerSize',10,'MarkerFaceColor','b','LineWidth',3);
obj.Curve = animatedline('Color','w','LineStyle','-','Marker','none','Linewidth',2);
obj.Range = [(obj.Length1 + obj.Length2)*(-2), (obj.Length1 + obj.Length2) * 2];
axis equal; axis off;
set(gca, 'Xlim', obj.Range, 'Ylim',obj.Range);
set(gcf, 'Color', 'w');
end
function Dstep(obj,tau)
obj.num1_1 = -obj.Gravity * (2 * obj.Mass1 + obj.Mass2) * sin(obj.Theta1);
obj.num1_2 = -obj.Mass2 * obj.Gravity * sin(obj.Theta1 - 2 * obj.Theta2);
obj.num1_3 = -2 * sin(obj.Theta1 - obj.Theta2) * obj.Mass2;
obj.num1_4 = obj.AngularVelocity2^2 * obj.Length2 + obj.AngularVelocity1^2 * obj.Length1 * cos(obj.Theta1 - obj.Theta2);
obj.den1 = obj.Length1 * (2 * obj.Mass1 + obj.Mass2 - obj.Mass2 * cos(2 * obj.Theta1 - 2 * obj.Theta2));
obj.AngularAcceleration1 = (obj.num1_1 + obj.num1_2 + obj.num1_3 * obj.num1_4)/obj.den1;
obj.num2_1 = 2 * sin(obj.Theta1 - obj.Theta2);
obj.num2_2 = obj.AngularVelocity1^2 * obj.Length1 * (obj.Mass1 + obj.Mass2);
obj.num2_3 = obj.Gravity * (obj.Mass1 + obj.Mass2 ) * cos(obj.Theta1);
obj.num2_4 = obj.AngularVelocity2^2 * obj.Length2 * obj.Mass2 * cos(obj.Theta1 - obj.Theta2);
obj.den2 = obj.Length2 * (2 * obj.Mass1 + obj.Mass2 - obj.Mass2 * cos(2 * obj.Theta1 - 2*obj.Theta2));
obj.AngularAcceleration2 = (obj.num2_1 * (obj.num2_2 + obj.num2_3 + obj.num2_4))/obj.den2;
obj.AngularVelocity1 = obj.AngularVelocity1 + obj.AngularAcceleration1 * obj.Ts;
obj.AngularVelocity2 = obj.AngularVelocity2 + obj.AngularAcceleration2 * obj.Ts;
obj.Theta1 = obj.Theta1 + obj.AngularVelocity1 * obj.Ts;
obj.Theta2 = obj.Theta2 + obj.AngularVelocity2 * obj.Ts;
obj.X_Position1 = obj.Length1 * sin(obj.Theta1);
obj.Y_Position1 = -obj.Length1 * cos(obj.Theta1);
obj.X_Position2 = obj.X_Position1 + obj.Length2 * sin(obj.Theta1 + obj.Theta2);
obj.Y_Position2 = obj.Y_Position1 - obj.Length2 * cos(obj.Theta1 + obj.Theta2);
obj.Ball_Arrival = obj.X_Position2 + +abs(obj.AngularVelocity2)*(sqrt(2*abs(obj.Y_Position2)/obj.Gravity));
% animation call and upadate
obj.Curve.addpoints(obj.X_Position2, obj.Y_Position2);
drawnow limitrate
obj.Pendulum_Double.addpoints([0 obj.X_Position1 obj.X_Position2], [0 obj.Y_Position1 obj.Y_Position2]);
clearpoints(obj.Pendulum_Double);
end
end
end
  2 件のコメント
Mr. Pavl M.
Mr. Pavl M. 2024 年 10 月 14 日
移動済み: DGM 2025 年 8 月 15 日
The script
Length1 = 1.0;
Length2 = 1.0;
Mass1 = 1.0;
Mass2 = 1.0;
Ts = 0.01;
Theta_Initial1 = 0;
Theta_Initial2 = 0;
AngularVelocity_Initial1 = 0;
AngularVelocity_Initial2 = 0;
Pendulum2 = classDoublePendulum(Length1,Length2,Mass1,Mass2,Theta_Initial1,Theta_Initial2,AngularVelocity_Initial1,AngularVelocity_Initial2,Ts);
Trq = [10; 10];
for i=1:100
Pendulum2.Dstep(Trq); % classdef has been called but animation has not been working.
end
The classdef file
classdef classDoublePendulum %< handle
properties
Length1 = 1;
Length2 = 1;
Mass1 = 1;
Mass2 = 1;
AngularVelocity1 = 0;
AngularAcceleration1 = 0;
AngularVelocity2 = 0;
AngularAcceleration2 = 0;
Theta1 = 0;
Theta2 = 0;
Ts = 0.01;
X_Position1;
Y_Position1;
X_Position2;
Y_Position2;
Ball_Arrival = 0;
num1_1;
num1_2;
num1_3;
num1_4;
den1;
num2_1;
num2_2;
num2_3;
num2_4;
den2;
end
properties(Access = private)
Gravity = 9.8;
Pendulum_Double =animatedline('Color','g','Marker','+','MarkerSize',8,'MarkerFaceColor','b','LineWidth',2);
Curve = animatedline('Color','g','Marker','+','MarkerSize',8,'MarkerFaceColor','b','LineWidth',2);
Range =0;
end
methods
function obj = classDoublePendulum(Length1,Length2, Mass1,Mass2, Theta1, Theta2, AngularVelocity1, AngularVelocity2, Ts)
obj.Length1 = Length1;
obj.Length2 = Length2;
obj.Mass1 = Mass1;
obj.Mass2 = Mass2;
obj.Theta1 = Theta1;
obj.Theta2 = Theta2;
obj.AngularVelocity1 = AngularVelocity1;
obj.AngularVelocity2 = AngularVelocity2;
obj.Ts = Ts;
obj.X_Position1 = obj.Length1 * sin(obj.Theta1);
obj.Y_Position1 = -obj.Length1 * cos(obj.Theta1);
obj.X_Position2 = obj.X_Position1 + obj.Length2 * sin(obj.Theta1 + obj.Theta2);
obj.Y_Position2 = obj.Y_Position1 - obj.Length2 * cos(obj.Theta1 + obj.Theta2);
obj.Ball_Arrival = obj.X_Position2 + +abs(obj.AngularVelocity2)*(sqrt(2*abs(obj.Y_Position2)/obj.Gravity)); % ボールの離
% animation call
obj.Pendulum_Double = animatedline('Color','b','Marker','o','MarkerSize',10,'MarkerFaceColor','b','LineWidth',3);
obj.Curve = animatedline('Color','w','LineStyle','-','Marker','none','Linewidth',2);
drawnow limitrate
obj.Range = [(obj.Length1 + obj.Length2)*(-2), (obj.Length1 + obj.Length2) * 2];
axis equal; axis off;
set(gca, 'Xlim', obj.Range, 'Ylim',obj.Range);
set(gcf, 'Color', 'w');
end
function Dstep(obj,tau)
obj.num1_1 = -obj.Gravity * (2 * obj.Mass1 + obj.Mass2) * sin(obj.Theta1);
obj.num1_2 = -obj.Mass2 * obj.Gravity * sin(obj.Theta1 - 2 * obj.Theta2);
obj.num1_3 = -2 * sin(obj.Theta1 - obj.Theta2) * obj.Mass2;
obj.num1_4 = obj.AngularVelocity2^2 * obj.Length2 + obj.AngularVelocity1^2 * obj.Length1 * cos(obj.Theta1 - obj.Theta2);
obj.den1 = obj.Length1 * (2 * obj.Mass1 + obj.Mass2 - obj.Mass2 * cos(2 * obj.Theta1 - 2 * obj.Theta2));
obj.AngularAcceleration1 = (obj.num1_1 + obj.num1_2 + obj.num1_3 * obj.num1_4)/obj.den1;
obj.num2_1 = 2 * sin(obj.Theta1 - obj.Theta2);
obj.num2_2 = obj.AngularVelocity1^2 * obj.Length1 * (obj.Mass1 + obj.Mass2);
obj.num2_3 = obj.Gravity * (obj.Mass1 + obj.Mass2 ) * cos(obj.Theta1);
obj.num2_4 = obj.AngularVelocity2^2 * obj.Length2 * obj.Mass2 * cos(obj.Theta1 - obj.Theta2);
obj.den2 = obj.Length2 * (2 * obj.Mass1 + obj.Mass2 - obj.Mass2 * cos(2 * obj.Theta1 - 2*obj.Theta2));
obj.AngularAcceleration2 = (obj.num2_1 * (obj.num2_2 + obj.num2_3 + obj.num2_4))/obj.den2;
obj.AngularVelocity1 = obj.AngularVelocity1 + obj.AngularAcceleration1 * obj.Ts;
obj.AngularVelocity2 = obj.AngularVelocity2 + obj.AngularAcceleration2 * obj.Ts;
obj.Theta1 = obj.Theta1 + obj.AngularVelocity1 * obj.Ts;
obj.Theta2 = obj.Theta2 + obj.AngularVelocity2 * obj.Ts;
obj.X_Position1 = obj.Length1 * sin(obj.Theta1);
obj.Y_Position1 = -obj.Length1 * cos(obj.Theta1);
obj.X_Position2 = obj.X_Position1 + obj.Length2 * sin(obj.Theta1 + obj.Theta2);
obj.Y_Position2 = obj.Y_Position1 - obj.Length2 * cos(obj.Theta1 + obj.Theta2);
obj.Ball_Arrival = obj.X_Position2 + +abs(obj.AngularVelocity2)*(sqrt(2*abs(obj.Y_Position2)/obj.Gravity));
% animation call & update
obj.Curve.addpoints(obj.X_Position2, obj.Y_Position2);
drawnow limitrate
obj.Pendulum_Double.addpoints([0 obj.X_Position1 obj.X_Position2], [0 obj.Y_Position1 obj.Y_Position2]);
clearpoints(obj.Pendulum_Double);
end
end
end
DGM
DGM 2025 年 8 月 15 日
Editor's note:
I edited @Mr. Pavl M.'s post to clarify that it is also a question. The code runs without error, but produces an empty figure.
I was going to troubleshoot it, but I was overcome by a sudden wave of profound laziness.

サインインしてコメントする。

回答 (0 件)

カテゴリ

Help Center および File ExchangeEnvironment and Settings についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by