%AHMADREZA ESHGHINEJAD () から、正弦波面上で弾むボールの例を見つけ、モデルに合うように修正しようとしました。
しかし、matlab は、「graphicfunction」の呼び出し中に、それ以上の情報なしでエラーを表示します。私はそれを修正しようとして何時間も理解しようとしてきましたが、それでもうまくいきません。
私は本当にあなたの助けに感謝します.
主要
%This set of files including (Rmain.m, RCalc.m, RGraficfunction.m and Rod.mdl) are written by:
%AHMADREZA ESHGHINEJAD (ahmadreza.eshghinejad@gmail.com), April 2011
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% to simulate and animation of a rod falling on a flat surface.
%
%clear
%clc
%global dblcart1 pa dt amp freq I m floormin floorwidth s R
spacing_width=0.001; %[m]
spacing_amplitude=0.008; %[m]
%disc diameter
d=0.01; %[m]
r=d/2; %Radius
x0=0; %% initial x
y0=spacing_amplitude; %% initial y
Bth0=0; %% initial angular position
pa=.001; %% pause in simulation step
T=30; %% simulation time
m=1; %% ball mass
dt=.01; % time steps
s=0; % Movement of frame counter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
animinit('disc on surface');
dblcart1 = findobj('Type','figure','Name','dblcart1 Animation');
hold on;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Initializing
% Initial Ball points
th=0:.1:2*pi;
xx=r*cos(th)+x0;
yy=r*sin(th)+y0;
% Initial Ball line points
x1l1=1*r*cos(Bth0)+x0;
x1l2=1*r*cos(Bth0+pi)+x0;
y1l1=1*r*sin(Bth0)+y0;
y1l2=1*r*sin(Bth0+pi)+y0;
x2l1=1*r*cos(Bth0+pi/2)+x0;
x2l2=1*r*cos(Bth0+pi+pi/2)+x0;
y2l1=1*r*sin(Bth0+pi/2)+y0;
y2l2=1*r*sin(Bth0+pi+pi/2)+y0;
% Drawing the floor
floormin=0;
floorwidth=3*2*pi*spacing_width;
floorheight=floorwidth;
axis([floormin floormin+floorwidth 0 floorheight]);
plot(floormin:.1:floormin+floorwidth,spacing_amplitude*sin((1/spacing_width)* (floormin:.1:floormin+floorwidth))+spacing_amplitude,'yellow','LineWidth',2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Initial drawing of ball
Ballhndl1=plot([x1l1 x1l2],[y1l1 y1l2],'red');
Ballhndl2=plot([x2l1 x2l2],[y2l1 y2l2],'red');
Ballhndl=plot(xx,yy,'blue','EraseMode','background');
set(gca,'UserData',[Ballhndl;Ballhndl1;Ballhndl2]);
%set(gca,'UserData',Ballhndl);
sim('simmod.mdl')
simulink モデル内の matlab 関数
function [x,y,Bth] = fcn(ures,yres)
r=0.01; %% Ball radius
spacing_width=0.001; %[m]
spacing_amplitude=0.008; %[m]
for th=2*pi:-.01:0
x=ures+r*cos(th); %% bal points
y=yres+r*sin(th);
end;
Bth=atan(2*pi*(1/spacing_width)*spacing_amplitude*cos(2*pi*(1/spacing_width)*x));
グラフィック機能
function GraficFunction(x,y,Bth)
global Ball
spacing_width=0.001; %[m]
pa=.01; %% pause in simulation step
s=0; % Movement of frame counter
floormin=0;
floorwidth=3*2*pi*spacing_width;
pause(pa)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% passing the window margins and moving the object based on the "s"
%%%%% parameter
if x<(floormin+s*floorwidth),s=s-1;
elseif x>((s+1)*floorwidth),s=s+1;end
x=x-s*floorwidth;
set(0,'currentfigure',Ball)
Ballhndl=get(gca,'UserData');
%Ball Circle points
th=0:.1:2*pi;
x1=ures+r*cos(th);
y1=yres+r*sin(th);
%%%%%%%%%%%%%% Ball line points
x1l1=1*r*cos(Bth)+x;
x1l2=1*r*cos(Bth+pi)+x;
y1l1=1*r*sin(Bth)+y;
y1l2=1*r*sin(Bth+pi)+y;
x2l1=1*r*cos(Bth+pi/2)+x;
x2l2=1*r*cos(Bth+pi+pi/2)+x;
y211=1*r*sin(Bth+pi/2)+y;
y2l2=1*r*sin(Bth+pi+pi/2)+y;
% Draw Lines
set(Ballhndl(1),'XData',x1);
set(Ballhndl(1),'YData',y1);
set(Ballhndl,'XData',x1);
set(Ballhndl,'YData',y1);
set(Ballhndl(2),'XData',[x1l1 x1l2]);
set(Ballhndl(2),'YData',[y1l1 y1l2]);
set(Ballhndl(3),'XData',[x2l1 x2l2]);
set(Ballhndl(3),'YData',[y2l1 y2l2]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
drawnow;
end