WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Animation: Archimedes Spirale

 

thargor2
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 29.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2011, 08:54     Titel: Animation: Archimedes Spirale
  Antworten mit Zitat      
Schönen guten Morgen,
im Moment schreibe ich ein Programm um parametrisierte Kurven animiert darzustellen. Begonnen habe ich mit einer Epizykloide. Hier läuft auch alles bestens.

Hier der Code der Epizykloide:

Code:

function [] = epi( R, r, z )
%epi stellt Epizykloide grafisch dar
%  
    %R: innerer (unbewegter) Radius
    %r: außerer (bewegter) Radius
    %z: Anzahl der Umdrehungen

%%Epizykloide
%%Variable

%Zeit/
t = 0:0.01:2*z*pi;

%Umfang
U = 0;  

%Plot
title('Epizykloide')
axis equal;
xlim([-(R+2*r+1.5) , R+2*r+1.5]);
ylim([-(R+2*r+1.5) , R+2*r+1.5]);
view(0,90);
grid on;

%Animation (+1 wegen Umfang, sonst ist Startbedingung nicht gegeben)
for j=2:length(t+1)
    set (gca,'nextplot','replacechildren')
   
    %Achsenkreuz
    plot([R+2*r+1.5,-(R+2*r+1.5)] , [0,0] , 'g' , [0,0] , [-(R+2*r+1.5),(R+2*r+1.5)],'g');
    hold on;
       
    %Innerer (fester) Kreis
    a = 0:.01:2*pi+.1;
    x = R*sin(a);
    y = R*cos(a);
   
    plot(x,y,'m','linewidth',1.5);
   
    %Äußerer (bewegter) Kreis
    t1= 0:0.1:2*pi+.1;
    x1 = (R+r)*cos(t(j))+r*cos(t1);
    y1 = (R+r)*sin(t(j))+r*sin(t1);
       
    plot(x1,y1,'r','linewidth',1.5);
   
    %Punkt auf Scheibe
    x2 = (R+r)*cos(t(j))-r*cos(((R+r)/r)*t(j));
    y2 = (R+r)*sin(t(j))-r*sin(((R+r)/r)*t(j));
           
    plot(x2,y2,'*','linewidth',1.5);
   
    %Zykloidenbogen
    t2 = t(1:j);
    x3 = (R+r)*cos(t2)-r*cos(((R+r)/r)*t2);
    y3 = (R+r)*sin(t2)-r*sin(((R+r)/r)*t2);
   
    plot (x3,y3,'b')
   
    %Umfang
    B = sqrt((x3(j)-x3(j-1))^2+(y3(j)-y3(j-1))^2);    
    U = U + B;
         
    text(-2.5*(R+r),R+2*r+1.5,(['Umfang = ' num2str(U)]));
         
    F(j) = getframe;
end



end


Versuche ich das Ganze nun mit einer archimedischen Spirale, bekomme ich immer die Fehlermeldung, dass die Größe der Matrizen nicht übereinstimmt.

Hier der Code der archimedischen Spirale:

Code:

function [] = archimedes()
% archimedes: Archimedische Spirale mit Geschwindigkeitsvekor und
% Beschleunigungsvekor
%   Detailed explanation goes here

%%Archimedische Spirale

%%Variable
%Zeit
t = 0:0.1:6*pi;

%Plot
title('Archimedische Spirale');
axis equal;
xlim([-20 , 20]);
ylim([-20 , 20]);
view(0,90);
grid on;

%Animation (+1 wegen Umfang, sonst ist Startbedingung nicht gegeben)
for j=2:length(t+1)
    set (gca,'nextplot','replacechildren')
   
    %Achsenkreuz
    hold on;
    plot([-20,20] , [0,0] , 'm' , 'linewidth' , 1.5);
    plot([0,0] , [-20,20] , 'm' , 'linewidth' , 1.5);
   
   
    %Spirale  
    t1 = t(1:j);
    x = t1 * cos(t1);
    y = t1 * sin(t1);
   
    plot(x,y);
   
    %Punkt
    x1 = t(j) * cos(t(j));
    y1 = t(j) * sin(t(j));
   
   plot(x1,y1, '*','linewidth',1.5);  
     
   
    F(j) = getframe;
   
end


end
 


Auch wenn ich das Ganze mit Polarkoordinaten Versuche, läuft das Ganze nicht richtig. Hier bleibt der Punkt, der die "Spitze" der Spirale beim Ablaufen simulieren soll, bestehen und "läuft" nicht mit.

Code:

function [] = archimedesp()
% archimedes: Archimedische Spirale mit Geschwindigkeitsvekor und
% Beschleunigungsvekor
%   Detailed explanation goes here

%%Archimedische Spirale

%%Variable
%Zeit
t = 0:0.1:6*pi;

%Plot
title('Archimedische Spirale');
axis equal;
xlim([-20 , 20]);
ylim([-20 , 20]);
view(0,90);
grid on;

r=2;

%Animation (+1 wegen Umfang, sonst ist Startbedingung nicht gegeben)
for j=2:length(t+1)
    set (gca,'nextplot','replacechildren')
   
    %Achsenkreuz
    hold on;
    plot([-20,20] , [0,0] , 'm' , 'linewidth' , 1.5);
    plot([0,0] , [-20,20] , 'm' , 'linewidth' , 1.5);
   
   
    %Spirale  
    t1 = t(1:j);
   
    polar(t1*r , t1);
           
    %Punkt
    a=t(j)*r;
    b=t(j);
   
    polar(a , b, '*');  
     
   
    F(j) = getframe;
   
end


end
 


Mir ist im Moment nicht ersichtlich, wo ich beim Programieren der Archimedischen Spirale einen Fehler gemacht habe, da der Aufbau ja dem der Epizykloide entspricht.

Vielleicht kann mir ja jemand hier weiterhelfen?

Mit bestem Dank

thargor2
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.10.2011, 11:13     Titel:
  Antworten mit Zitat      
Hallo,

archimedes:
Problem: * ist Matrix-Vektor-Multiplikation, du willst aber anscheinend komponentenweise Multiplikation .*
Die beiden Zeilen müssen also heißen:
Code:
   x = t1 .* cos(t1);
    y = t1 .* sin(t1);


Ich verstehe das andere Problem nicht:
Zitat:
Hier bleibt der Punkt, der die "Spitze" der Spirale beim Ablaufen simulieren soll, bestehen und "läuft" nicht mit.

Willst du, dass nur ein Stern zu sehen ist und ansonsten nur Linien? Dann würde ich Linie und Spitze getrennt visualisieren, und die Spitze immer laufend aktualisieren mit.
Code:
p = plot(erstesX, erstesY, '*')
for ...
set(p, 'XData', xwerte, 'YData', ywerte)
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
thargor2
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 29.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2011, 11:43     Titel:
  Antworten mit Zitat      
Vielen Dank erst einmal für die Hilfe.
Das erste Problem ist gelößt.

Zum 2.
Ich will erreichen das die Spirale von Anfang an "ablauft" und man ihre Bahnkurve sieht. An der Spitze soll der Stern stehen. Es soll also immer nur ein Stern sichtbar sein.(der an der Spitze der Bahnkurve).

Deswegen habe ich bei der Bahnkurve mit t(1:j) auf die Matrix mit allen bisherigen Winkel-Werten zugegriffen und mit t(j) nur auf den letzten Winkel-Wert. Ich verstehe daher nicht wieso auf einmal alle Sterne erscheinen, insbesondere da es bei dem Skript "epi" auch anders funktioniert.

Gruß Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.10.2011, 12:23     Titel:
  Antworten mit Zitat      
Hallo,

der Unterschied liegt wohl in POLAR.
Siehe erste Antwort für einen Vorschlag.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
thargor2
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 29.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2011, 18:22     Titel:
  Antworten mit Zitat      
Für alle die noch Interesse haben, habe ich eine trivialere Lösung für das Problem gefunden.
Da der Befehl "hold on" vor der Definition des Achsenkreuzes stand, wurden alle vorherigen Befehle im Plot berücksichtigt und nicht wie beabsichtigt nur die Letzten für den Stern. Hier nochmal der funktionierende Code:

Code:

function [] = archimedes()
% archimedes: Archimedische Spirale mit Geschwindigkeitsvektor und
% Beschleunigungsvektor
%   Detailed explanation goes here

%%Archimedische Spirale

%%Variable
%Zeit
t = 0:0.1:6*pi;

%Plot
title('Archimedische Spirale');
axis equal;
xlim([-20 , 20]);
ylim([-20 , 20]);
view(0,90);
grid on;

%Animation (+1 wegen Umfang, sonst ist Startbedingung nicht gegeben)
for j=2:length(t+1)
    set (gca,'nextplot','replacechildren')
   
    %Achsenkreuz
    plot([-20,20] , [0,0] , 'm' , 'linewidth' , 1.5);
    plot([0,0] , [-20,20] , 'm' , 'linewidth' , 1.5);
    hold on;    
   
    %Spirale  
    t1 = t(1:j);
    x = t1 .* cos(t1);
    y = t1 .* sin(t1);
   
    plot(x,y);
   
    %Punkt
    x1 = t(j) .* cos(t(j));
    y1 = t(j) .* sin(t(j));
   
    plot(x1, y1, '*','linewidth',1.5);  
     
     
   
    F(j) = getframe;
   
end


end
 


Trotzdem bedanke ich mich recht herzlich für die Hilfe.

MfG

thargor2

==>thread kann geschlossen werden
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.