% Gleitstein (vertikal), mit Feder gefesselt, Animation

function GleitsteinAni (xAnf , tEnd)

if (nargin > 0) x0   = [xAnf ; 0] ; else x0   = [-4.493 ; 0] ; end
if (nargin > 1) tspan = [0 , tEnd] ; else tspan = [0 ; 20]     ; end

global cadmg bda gda
cadmg = 1 ;            % ... = c * a / (m * g)
bda = 4 ;              % ... = b / a
gda = 9.81 ;           % ... =  g / a   in 1/s²

options = odeset ('MaxStep' , 0.1) ;
[t x]  = ode45  (@RechteSeite , tspan , x0 , options) ;
[t x]
xi = [1 0] * x' ;
a = 1 ;
Vektorlaenge = length(t)
tt = tspan(1) ;
maxi = max(xi) ; if (maxi < 0) maxi =  a/4 ; end
mini = min(xi) ; if (mini > 0) mini = -a/4 ; end
clf ;
plot ([0 -a/2 -a/2 0],[0 a/3 -a/3 0] , 'r-') ;
hold on
plot ([a a],[-1.1*mini -1.1*maxi] , 'r-') ;
hold on
[xs ys nc] = SpringCoords ([0 0] , [a -xi(1)] , 4 , 2*bda) ;
[xs(nc+1:nc+8) ys(nc+1:nc+8) nc2] = MassCoords ([a -xi(1)] , a/2 , a) ;
p  = plot (xs , ys , 'EraseMode' , 'xor') ;
h  = findobj ;
axis ([-a/4 1.3*a -1.2*maxi -1.2*mini]) ; axis equal ;
zeit = title (sprintf('t = %8.2f s' , tt)) ;
set (gca , 'userdata' , zeit)

deltatt  = 1/25    ;    % 25 Bilder pro Sekunde
zeitlupe = 1       ;    % Verzögerungsfaktor
cstart   = cputime ;
Zeitschritte = length (t)

for ii=1:Zeitschritte    % Schleife über alle berechneten Zeitschritte
   if (t(ii) >= tt)      % Ausgabe jeweils nur nach deltatt 
       [xs ys nc] = SpringCoords ([0 0] , [a -xi(ii)] , 4 , 2*bda) ;
       [xs(nc+1:nc+8) ys(nc+1:nc+8) nc2] = MassCoords ([a -xi(ii)] , a/2 , a) ;
       set(p , 'XData' , xs , 'YData' , ys)
       while (cputime-cstart < tt*zeitlupe)  % Warteschleife
       end 
       zeit = get (gca , 'userdata');
       set(zeit , 'string' , sprintf('t = %8.2f s' , tt))
       drawnow
       tt = tt + deltatt ;
   end
end

% ====== Definition des Differenzialgleichungssystems:  ================
function xpunkt = RechteSeite (t , x)
global cadmg bda gda
xpunkt = [x(2); gda*(1-cadmg*(sqrt(1+x(1)^2)-bda)*x(1)/sqrt(1+x(1)^2))] ;
