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

rotierender Kreis, horizontaler Durchmesser, live-Auswertung

 

karle

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2013, 12:37     Titel: rotierender Kreis, horizontaler Durchmesser, live-Auswertung
  Antworten mit Zitat      
Hallo,

ich habe es schon geschafft, einen Kreis um die vertikale Achse rotieren zu lassen! yay!

Code:

clear all
clc
clf

t = linspace(0, 2*pi, 360);

x = cos(t);
y = sin(t);

h1 = plot(x, y);
fill(x, y, 'k')
axis equal
axis vis3d
axis off
h2 = get(gca, 'Children');

i = 0;
while i<360
    zdir = [0 1 0];
    rotate(h2,zdir,5)
    drawnow
    i = i + 5;
    %waitforbuttonpress
    pause(0.3)
end
 


Nun möchte ich gerne in JEDEM frame den horizontalen Durchmesser bestimmen.
Bisher habe ich nicht wirklich eine Ahnung, wie ich das anstellen sollte. Ich kann auf folgende Ideen: Kantendetektion, Punkte definieren und deren Abstand berechnen.

Kann mir jemand einen Lösungsansatz oder gar eine Lösung zu meinem Problem nennen?

Das Endprodukt soll ein Film werden, der den rotierenden Kreis und daneben eine Grafik, die entsprechend des Rotationswinkels, den horizontalen Durchmesser plottet, zeigt.

Vielen Dank für eure Hilfe!


karle

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2013, 13:26     Titel:
  Antworten mit Zitat      
ich hatte noch eine weitere idee?

es dürfte doch genügen, die schnittpunkte mit der x-achse zu finden.
dann kann ich den abstand dieser beider punkte bestimmen und habe meinen horizontalen durchmesser!

aber wie mache ich das?

vielen Dank!
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 09.04.2013, 15:52     Titel:
  Antworten mit Zitat      
ist der durchmesser nicht einfach
Code:
d=2*abs(cos(2*pi/360*(i+5)))
?
wenn (i+5) dein drehwinkel ist. kleine anmerkung: i ist die imaginäre einheit und sollte nicht als laufvariable verwendet werden. das +5 kommt daher weil du i erst nach dem drehen erhöhst
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 09.04.2013, 17:05     Titel: Re: rotierender Kreis, horizontaler Durchmesser, live-Auswer
  Antworten mit Zitat      
Hallo karle,

Ein Bemerkung: Immer wieder stößt man im Forum auf Code, der den brutalen Clear-Header "clear all, clc, clf" enthält. Es mag Geschmackssache sein, ob es nützlich ist das Command-Window und die offenen Figures zu löschen. Aber "clear all" hat häßliche Seiteneffekte:
1. Es werden alle geladenen Funktionen aus dem Speicher gelöscht. Das Nachladen von der Platte ist prinzipbedingt langsam und das Parsen zeitaufwändig.
2. Alle Breakpoints werden gelöscht. Das behindert das Debuggen ungemein, was grundsätzlich beim Programmieren eine sehr schlechte Idee ist.

Trotz der Nachteile ist das "clear all" leider inflationär verbreitet. Aber nur weil es viele benutzen, muss es noch nicht hilfreich sein.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
karle

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2013, 10:23     Titel:
  Antworten mit Zitat      
Winkow hat Folgendes geschrieben:
ist der durchmesser nicht einfach
Code:
d=2*abs(cos(2*pi/360*(i+5)))
?
wenn (i+5) dein drehwinkel ist. kleine anmerkung: i ist die imaginäre einheit und sollte nicht als laufvariable verwendet werden. das +5 kommt daher weil du i erst nach dem drehen erhöhst


hallo,

ja, so in etwa habe ich mir den durchmesser auch gedacht.
allerdings sollte ich dies am besten beweisen!
deshalb möchte ich ja am ende ein video haben, das den sich drehenden kreis und die simultane durchmesser-messung zeigt.

wie kann ich also den durchmesser bei meinem kreis MESSEN?
 
karle

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2013, 10:28     Titel: Re: rotierender Kreis, horizontaler Durchmesser, live-Auswer
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Hallo karle,

Ein Bemerkung: Immer wieder stößt man im Forum auf Code, der den brutalen Clear-Header "clear all, clc, clf" enthält. Es mag Geschmackssache sein, ob es nützlich ist das Command-Window und die offenen Figures zu löschen. Aber "clear all" hat häßliche Seiteneffekte:
1. Es werden alle geladenen Funktionen aus dem Speicher gelöscht. Das Nachladen von der Platte ist prinzipbedingt langsam und das Parsen zeitaufwändig.
2. Alle Breakpoints werden gelöscht. Das behindert das Debuggen ungemein, was grundsätzlich beim Programmieren eine sehr schlechte Idee ist.

Trotz der Nachteile ist das "clear all" leider inflationär verbreitet. Aber nur weil es viele benutzen, muss es noch nicht hilfreich sein.

Gruß, Jan


Hallo,
off-topic:
vielen Dank für diese Anregung. War mir in diesem ausmaß nicht bewusst.
allerdings hat es für mich auch einen ganz praktischen grund: ich hatte schon öfter den fall, dass berechnungen in meinem code nicht richtig ausgeführt wurde. sobald ich aber "clear all" am anfang stehen hatte, und somit alle variablen gelöscht wurden, lief es wieder problemlos durch.
ich kann jetzt leider kein explizites beispiel mehr nennen, allerdings bin ich mir sicher, dass es so war.
genauso verhält es sich mit "clf". wenn vor dem erstellen nicht das figure-window komplett "gelöscht" wird, ist die aktuelle anzeige oft total daneben.

gibt es denn einen befehl, alle variablen zu löschen? somit könnte das "clear all" umgangen werden. alle variablen einzeln zu löschen ist allerdings keine option...
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 10.04.2013, 14:41     Titel: Re: rotierender Kreis, horizontaler Durchmesser, live-Auswer
  Antworten mit Zitat      
Hallo karle,

Um die Variablen zu löschen, reicht auch ein:
Code:

oder sogar ein einfaches
Code:

Das wäre deutlich effizienter und hätte keine schädlichen Nebenwirkungen.

Die Probleme mit bestehenden Variablen und Figures sind wirklich nicht unüblich. Dies lässt sich mit folgenden Methoden erfolgreich behandeln:

1. Code grundsätzlich in Funktionen schreiben, niemals als Script. Dann werden nur die Inputs von aussen übernommen und man bekommt keinerlei Schwierigkeiten, wenn man 50 verschiedene Teile nacheinander ausführen möchte. Wenn die Teil-Schritte aber als Script geschrieben wurden und diese dann noch per "clear all" bestehende Informationen vernichten, wird die Arbeit mit Matlab heftig eingeschränkt.
Es ist kein Zufall, dass alle Toolbox-Funktionen von Matlab als Funktionen und nicht als Scripte verfasst sind.

2. Figures nie mit einem IntegerHandle erstellen, z.B. "figure(1)", da man dann eventuell in eine bestehende Figure hineinschreibt. Die Integer-Handles werden seit Matlab > 3.0 (so weit ich mich erinnere) noch für die Rückwärtskompatibilität unterstützt, also seit 1990. Besser:
Code:
figure('IntegerHandle', 'off')


Ich habe im ein unsichtbares Fenster im Hintergrund laufen, um zu protokollieren, wieviel Zeit ich wann in welchem Projekt arbeite. Dies dokumentiert auch Änderungen im code, damit ich später weiß, wann ich wlchen Fehler eingefügt habe. Wenn ich Code aus dem FileExchange oder aus dem Forum laufen lassen, löschen mir die CLF's und CLEAR ALL's die persistent Variablen und die Figures. Zwar habe ich inzwischen das Löschen der Figure und der Daten verhindert (hidden handles, spezielle DeleteFcn, mlock), aber ich verbreite die Ratschläge gegen diese Befehle gerade im Forum trotzdem. Sie behindern nämlich den Schritt von kleinen Scripten zu größeren effizienten Programmen, in denen verschiedene Teilschritte nacheinander ausgeführt werden. Und wenn ich daran denke, wie viele Probleme die User in diesem Forum alleine lösen könnten, wenn sie den Debugger benutzen würden, gruselt es mich.

Ich gebe zu, dass der brutale Clearing Header tatsächlich einige Probleme löst. Und das Autofahren ist viel entspannter, wenn man die Windschutzscheibe schwarz lackiert.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
karle

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2013, 14:48     Titel:
  Antworten mit Zitat      
danke für diese erklärungen!

aber hast du auch einen vorschlag meines problems betreffend?
ich würd mich tierisch freuen.

warte hier quasi mit dauer-F5 auf eine Antwort Smile
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 10.04.2013, 17:34     Titel:
  Antworten mit Zitat      
ich versteh erlich gesagt nicht genau was es da zu beweisen gibt ^^ du sagst ihm was er malen soll und willst dann messen was er gemalt hat. das ist doch irgendwie doppelt gemoppelt.
der durchmesser in der projektion des rotierten körpers ergiebt sich wie oben aus der trigonometrischen gleichung.

Code:
clear
clc
clf
for n=1:360
t = linspace(0, 2*pi, 360);

x = cos(t)*cos(2*pi/360*n);
y = sin(t);

h1 = plot(x, y);
fill(x, y, 'k')
axis equal
axis vis3d
axis off
text(-1.5,0,{'D=',2*abs(cos(2*pi/360*n))})
drawnow
pause(0.01)

end
Private Nachricht senden Benutzer-Profile anzeigen
 
karle

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2013, 09:37     Titel:
  Antworten mit Zitat      
Hallo,

ja, das ist richtig! ich will genau das messen, das ich zuvor geplottet habe.

allerdings ist das doch nicht unüblich in der wissenschaft!

ich benötige einen BEWEIS, dass sich dies so verhält.
die reine annahme reicht nicht aus.

nochmal:
am ende hätte ich gern ein video, das auf der linken seite den sich rotierenden kreis zeigt und auf der rechten seite entsprechend dem drehwinkel den druchmesser plottet!
natürlich kann ich das auch "bescheissen" und den durchmesser einfach der funktion entsprechend plotten. allerdings ist das kein wissenschaftliches arbeiten!
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 11.04.2013, 13:10     Titel:
  Antworten mit Zitat      
wie gesagt. ich raff den sinn nicht eine 3 cm linie mit dem programm zu malen und dann das selbe programm messen zu lassen wie lagn die linie ist.
Code:
x = cos(t)*cos(2*pi/360*n);
sind dein x koordinaten deines kreises bei t = 0 also auf der x achse hat er die länge cos(phi) der durchmesser ist also 2 mal so groß. aber naja vieleicht fällt jemand anderem ja ein umständlicher weg ein.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.04.2013, 17:59     Titel:
  Antworten mit Zitat      
Hallo karle,

Mir wird noch nicht klar, was Du genau mit welchen Methoden zeigen möchtest. Du erstellst einen Kreis als 3D-Plot. Der rotiert dann. Ok.

Möchtest Du nun Screenshots davon anfertigen und den Abstand der Pixel messen? Das würde eine recht komplizierte automatische Objekt-Erkennung benötigen. Bist Du in Digitaler Bildverabeitung sehr erfahren? Wenn nicht, sind die Ergebnisse Deiner "Messung" sehr fraglich. Zudem ist die Pixel-Auflösung auf dem Bildschirm ziemlich grob und zudem noch in 2D, so dass Du die Tiefen-Information sowieso verlierst. Zudem ist die Perspektivische Verzerrung alles andere als trivial. Die "Mess"-Ergebnisse werden also ziemlich verrauscht sein und können den benötigten Aufwand kaum rechtfertigen.

Was ist also das wissenschaftliche Ziel, dass Du mit dem Programm erreichen möchtest?

Gruß, Jan
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.