Wave Simulator 1.2

    • Release

    Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von gabriel-b.

      Wave Simulator 1.2

      Programmname:

      Wave Simulator

      Falls irgendwo der Name Wave Simulator Full auftaucht: ich habe vorher eine abgespeckte Version programmiert um erst mal zu probieren, wie das am besten umsetzbar ist.

      Kurzbeschreibung:

      Das Programm hat links ein "Spielfeld", in das Wellen und Wellenemitter gesetzt werden können.
      Die Emitter senden entweder eigenständig Wellen aus (Pulser, 8-Pulser) oder müssen getriggert werden (Laser Pulser).
      Die ausgesendeten Wellen breiten sich mit einer global auswählbaren Geschwindigkeit aus (Lichtgeschwindigkeit sozusagen) und haben aus Speicher- und Performancegründen ein automatisches oder festes Maximum im Radius.
      Darüber hinaus gibt es Tools, wie Feldstärkemesser, die die Wellen inerhalb eines Zeitraumes zählen, etc.
      Die Farben sind beliebig auswählbar.

      Screenshots:



      Programmiert mit:

      Visual Basic .Net; IDE VB 2010 Express

      Systemanforderungen:

      • .Net Framework 3.5
      • Arbeitsspeicher:
        Laut Taskmanager ca. 6 MB ohne Objekte im Feld,
        ca. 100 KB pro 60 Wellen,
        Emitter und Tools scheinen den Verbrauch nur um wenige KB schwanken zu lassen.
        Während dem automatischen Betrieb erreicht der Verbrauch bis zu 20 MB.
        Aber bevor der Arbeitsspeicher ausgeht sinkt die Framerate gegen 0.
      • Minimale Bidschirmauflösung: 750x500 + Debugging Fenseter wenn aktiviert 570x250
      • Eine schnelle GPU dürfte beim Zeichnen helfen (siehe CPU und GPU Anforderungen)
      • Maus, Tastatur ist optional (zum Öffnen und Speichern von Dateien)


      CPU und GPU Anforderungen:

      Die CPU wird erst bei kleinen Intervallen richtig belastet. Viel mehr belastet wird allerdings die GPU. Weil das Zeichnen vieler Wellen mit Antialias doch recht rechenaufwändig ist kommt es bei vielen Wellen zum Einbruch der Framerate.
      Standardmäßig ist ein Intervall von 30ms eingestellt, also ca. 33 FPS. Bei mir (Intel Core i3 M330, NVIDIA GeForce 310M) sinkt die Framerate mit Antialias ab ca. 100 Wellen, ohne Antialias ab ca. 300 Wellwn signifikant unter 30 FPS
      Das hängt natürlich auch von anderen Faktoren ab (Andere Programme, etc.)

      Vollständige Beschreibung:

      Spoiler anzeigen


      Mit diesem Programm können Wellenverläufe simuliert werden. Links im Fenster befindet sich das "Spielfeld", rechts die Einstellungen.

      -Einstellungen oben:

      Die CheckBox "Läuft" de-/aktiviert die Automatik.
      Mit dem Button "Einzelschritt können auch Einzelschritte durchgeführt werden.
      "Intervall" gibt den Timerintervall in Millisekunden an. Standardmäßig ist 30ms eingestellt, was ca. 33 FPS macht.
      "Inkrement" gibt an, um wie viel Pixel der Radius pro Schritt vergrößert wird.

      "Interpolation" gibt an, wie gezeichnetes interpoliert wird.
      Zur Auswahl stehen:
      • NearestNeighbor(Kein),
      • HighQualityBilinear(Bilinear) und
      • HighQualityBicubic(Bikubisch)

      Die Interpolation ändert noch nichts am Aussehen der Objekte. Aber vielleicht wird noch etwas eingebaut was davon betroffen ist.

      "Saubere Kanten" gibt an, wie gezeichnetes geglättet wird.
      Zur Auswahl stehen:
      • HighSpeed(Geschwindigkeit) und
      • AntiAlias(Antialias)


      Die Hintergrundfarbe des Feldes kann per Click auf die PictureBox ausgewählt werden.

      -Speichern und Laden:

      Es gibt die Möglichkeit Felder in .wvf Dateien abzuspeichern. Es wird gefragt, ob eine minimalgröße an die Datei angehängt werden soll falls das Feld eine gewisse Größe aufweisen soll (Es wird die Fenstergröße gespeichert, nicht die Feldgröße selbst).
      Diese Dateien können wieder geöffnet werden. Wenn eine Minimalgröße vorhanden ist wird gefragt, ob sie angewendet werden soll.
      Das Programm fragt auch die Kommandozeilenargumente ab. Es wird hierbei die erste vorkommende Datei als Quelle verwendet. Es wird nicht überprüft ob die Datei auf .wvf endet. Wenn der Inhalt in Ordnung ist funktioniert es auch so.

      .wvf Dateien können also mit diesem Programm über Rechts Klick, Öffnen mit geöffnet werden.

      Es werden Fenstergröße, Intervall, Inkrement, Hintergrundfarbe, alle Emitter, alle Tools und alle Wellen mit allen Werten gespeichert, um das Feld so wieder zu laden, wie es gespeichert wurde (z.B. Zähler werden nicht zurückgesetzt, etc.).

      -Das Debuggingfenster:

      Um einen Überblick über das Programm zu behalten wurde ein Debuggingfenster eingebaut, in dem alle wichtigen Vorgänge aufgezeichnet werden.
      Eigens für das Debugging wurde eine Zählervariable als UInt64 angelegt um anzuzeigen, zu welchem Zeitpunkt welche Aktionen durchgeführt wurden. Mit dem Button "Schritte zurücksetzen" wird diese Zählervariable wieder auf 0 gesetzt, falls die Zahlen zu groß werden (Kann bei UInt64.MaxValue = 18446744073709551615 ja auch extrem schnell passieren^^).

      Weiters kann die gesamte Liste der Ereignisse in eine Textdatei gespeichert werden. (siehe dazu Bekannte Bugs)

      Es werden zusätzlich angezeigt, wie viele Wellen sich auf dem Feld befinden und mit welcher Framerate das Programm läuft. Die Framerate wird immer mit den letzten 5 Werten interpoliert (Durchschnitt), um zu verhindern, dass die Werte unlesbar sind weil sie sich zu schnell ändern.

      Das Debuggingfenster kann nicht geschlossen werden (nur mit Taskmanager). Dafür sind die CheckBoxen "Debugging anzeigen" und "Debugging andocken" da.
      "Debugging anzeigen" sollte selbsterklärend sein.
      "Debugging andocken" gibt an, ob das Debuggingfenster rechts vom Hauptfenster "Befestigt" sein soll. Wenn das Hauptfenster umhergezogen wird wird das Debuggingfenster mitgezogen.

      -Objekte auswählen:

      Mit dem TabControl in der Mitte wird ausgewählt, welches Objekt beim Klicken auf das Feld hinzugefügt wird. Es werden dann auch die möglichen Eigenschaften der Objekte angezeigt.
      Welche Registerkarten welche Objekte darstellen wird unter Verfügbare Objekte genauer erklärt.
      Die Struktur wird hier erklärt:

      Das übergeordnete TabControl enthält die wichtigsten Emitter (Standard, Pulser, 8-Pulser, Laser Pulser) und die Tools-Registerkarte (Wenn mehrere Emitter dazukommen wird auch eine "Sonstige" Registerkarte folgen).

      Unter Tools findet man ein weiteres TabControl, welches die wichtigsten Tools enthält (Auch hier wird eine "Sonstige" Registerkarte folgen).

      -Objekte editieren:

      Unter dem TabControl befinden sich einige Buttons (Seit Version 1.2 mit Icons versehen).
      Der linke, obere löscht alle Emitter.
      Der linke, untere löscht alle Tools.
      Der Button rechts daneben Löscht den ausgewählten Emitter bzw. das ausgewählte Tool.
      Der Button rechts von dem hebt die Auswahl auf.
      Der Button ganz rechts löscht alle Wellen.

      Die beiden ListBoxen ganz unten zeigen die Emitter (links) und Tools(rechts) an, die sich auf dem Feld befinden. Wenn ein Emitter oder Tool ausgewählt wird wird er/es im Feld mit zwei sich kreuzenden Linien gekennzeichnet. Emitter und Tools können auch mit Rechtsklick ausgewählt werden. Wenn sich mehrere Objekte überlagern wird das oberste ausgewählt.
      Gleichzeitig wird im TabControl zum jeweiligen Tab navigiert und dort werden die Eigenschaften des betreffenden Emitters/Tools angezeigt. Dort können diese Eigenschaften auch editiert werden. Mit der Linken Maustaste kann der Emitter bzw. das Tool auf dem Spielfeld neu positioniert werden.
      Dabei ist zu beachten, dass jeweils nur in einer ListBox eine Auswahl stattfinden kann, weil das TabControl nicht zu zwei Tabs gleichzeitig navigieren kann. Bestehende Auswahlen in der jeweils anderen ListBox werden entfernt.
      Wenn im TabControl ein anderer Tab ausgewählt wird wärend in einer ListBox bereits ein Emitter oder ein Tool Ausgewählt war wird diese Auswahl entfernt.

      -Die Objekte:

      Die Objekte werden in 3 grobe Kategorien unterteilt: Wellen, Emitter und Tools (Intern Accessories).

      --Wellen:

      Wellen werden von Emittern erzeugt. Sie breiten sich mit konstanter Geschwindigkeit aus (siehe Einstellungen oben).
      Um zu vermeiden, dass irgendwo draußen bei Integer.MaxValue noch irgendwelche Wellen die man nicht mal mehr sieht herumgurken und die CPU belasten.
      Das Maximum wird für den entsprechenden Emitter festgelegt. Alternativ kann das Maximum auch automatisch ausgerechnet werden (Felddiagonale + 10).

      Beim manuellen Hinzufügen von Wellen mit der Registerkarte "Standard" kann der Startradius festgelegt werden (Alle von Emittern ausgesendeten Wellen starten mit 0. Da lässt sich vielleicht ein neuer Emitter basteln...).

      Wellen haben eine gewisse Breite. Diese kann mit der TrackBar jeweils für den betreffenden Emitter oder bei der Registerkarte Standard für die neue Welle eingestellt werden.

      --Pulser:

      Der Pulser sendet in einem festgelegten Intervall Wellen aus. Eigentlich recht simpel.

      --8-Pulser:

      Der 8-Pulser ist eine erweiterung des normalen Pulsers. Beim Klick auf den Button "Auswählen" auf der entsprechenden Registerkarte öffnet sich ein Dialogfenster, in dem die Art des Pulses ausgewählt werden kann.
      Mit den CheckBoxen kann ausgewählt werden, zu welchen Zeitpunkten eine Welle ausgesendet werden soll. Gezählt wird wie bei normalen Pulsern. Der erste Schritt wird beim Setzen ausgeführt (0 Schritte nach dem Setzen um es genau zu nehmen). Wenn die CheckBox aktiviert ist wird eine Welle ausgesendet. Dann wird Faktor Schritte gewartet (also wenn Faktor 10 ist wird 10 Schritte gewartet) und Wenn die zweite Checkbox aktiviert ist wird wieder eine Welle ausgesendet.
      Mit den RadioButtons kann zusätzlich der Austrittspunkt gesetzt werden. Wenn der RadioButton ganz links aktiviert ist funktioniert der 8-Pulser wie ein ganz normaler Pulser.
      Die Zahlen, die in der TextBox unter der entsprechenden Registerkarte sind zeigen eine schnelle (und einheitliche) Definition des Pulsers an. Dadurch muss man nicht jedes mal sagen "Da gehört ein 8-Pulser mit Faktor auf 50, Ausstiegspunkt auf 7 und dem ersten, dritten, vierten und siebten Schritt aktiviert", sondern es reicht "ein 8-Pulser mit 50/7/10110010".

      --Laser Pulser:

      Der Laser Pulser heißt Laser Pulser, weil er gut die Funktion eines Gas-Lasermediums darstellen kann.
      Wenn er von einer Welle getroffen wird sendet er selbst eine aus. Anschließend wartet er Intervall Schritte (also wenn Intervall auf 10 ist wartet er 10 Schritte) bis er wieder Wellen aussenden kann.

      --Tools:

      Unter der Registerkarte "Tools" befindet ein weiteres TabControl mit Hilfsmittel.
      Diese sind:

      --Feldstärkemesser:

      Er misst innerhalb eines gewissen Zeitintervalls wie viele Wellen an ihm vorbei kommen. Am Ende jedes Intervalls wird diese Zahl rechts unter der Position des Messers angezeigt.
      Es wird immer die Schriftart Courier New 12 Pixel verwendet.

      --Text Tool

      Mit dem Text Tool kann Text auf das Feld geschrieben werden. Die Farbe und Schriftart kann beliebig gewählt werden.
      Dabei gibt es noch eine Schwierigkeit beim Speichern der .wvf Dateien. Der Text kann so wie es jetzt gespeichert wird nicht mitgespeichert werden. Die Objekte selbst bleiben erhalten.



      Fragen und Anregungen:

      Auf Anregungen und Verbesserungsvorschläge würde ich mich freuen.
      Ich werde auch Fragen zur Umsetzung beantworten. Den Quellcode möchte ich jedoch nicht veröffentlichen. Aber ich kann folgendes sagen: 451 Zeilen, 20506 Zeichen in der ersten Form (Whitespace und leere Zeilen nicht einbezogen)^^.

      Weitergabe:

      Das Programm kann beliebig kopiert/weitergegeben werden, solange es nicht verändert wird, es nicht kommerziel genutzt wird und es nicht verkauft wird.
      (ich finde das ist akzeptabel)

      Bekannte Bugs und Changelog:

      Version 1:
      1. Text von Text Tools wird nicht in .wvf Dateien gespeichert. Da muss ich mir nochmal eine bessere Methode überlegen. Das wird vermutlich noch eine Weile nicht gefixt werden. Hat jemand eine Idee? (Bitte vorher eine .wvf Datei ansehen, denn es sollte schon zum Schema passen. Wenn nötig werde ich dazu noch weitere Erklärungen hochladen.).
      2. Beim manuellen Löchen von allen Emittern bzw. Tools nacheinander tritt ein Fehler auf, wenn man direkt danach wieder etwas zum Feld hinzufügen will.

      Version 1.2:
      -Bug 2 von Version 1 gefixt.
      -Icons zu den Buttons zum Löschen der Emitter, Tools und Wellen und zum Aufheben der Auswahl hinzugefügt.
      1. Wenn das Fenster vergrößert wird und ein Laser Pulser ausgewählt wird, der den Maximalen Radius automatisch anpasst tritt eine ArgumentOutOfRangeException auf.
      2. Die Linien, die sich bei ausgewählten Objekten kreuzen werden hinter den anderen Objekten gezeichnet.

      Version 1.3 (Voraussichten):
      -Bug 1 von Version 1.2 gefixt.
      -Bug 2 von Version 1.2 gefixt.
      Wenn Bugs auftreten ist es für mich hilfreich den Inhalt des Debuggingfensters zu speichern und die .wvf Datei ebenfalls hier hochzuladen (das geht auch per PN, wenn es nötig ist).

      Sonstiges:

      Ich denke ich habe den fünften Punkt der Spezialregeln nicht ganz erfüllt. Dieses Programm hat nur einen eingeschränkten Nutzen für die Allgemeinheit. Darum habe ich das Programm unter Kleinkram gesetzt. Ich hoffe das ist in Ordnung so.

      Vielen Dank an picoflop für die Zeile
      If (From p In AllEmitters Where p.Tag = "Pulser" Select 1 Take 1).Count > 0 Then

      Download:

      Wave Simulator v1.2.rar (Gepackt ca. 52 KB, Entpackt ca. 140 KB)
      Wave Simulator v1.rar (Gepackt ca. 36 KB, Entpackt ca. 124 KB)
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Niko Ortner“ ()

      hey, das ist schon cool und macht spaß damit zu spielen! xD
      gibt es einen realen nutzen für das ding? würde mich interessieren

      ps: die anordnung der "löschenbuttons" etc ist recht schlecht. mach doch icons dran dann ist es gleich 10x benutzerfreundlicher^^
      außerdem ein bug wenn man alles löscht und dann einen pulser etc neu setzten möchte schmiert das prog ab..

      ansonsten sieht das ganze sauber programmiert aus, auf jeden fall recht schnell im zeichnen finde ich^^
      Veielen Dank für das Feedback.

      Der Bug ist im nächsten Update behoben.

      Wenn Du ein paar gute Icons kennst, bzw. Ideen hast würde mich das sehr freuen. Ich bin im Icons Zeichnen nämlich nicht gut.
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils
      @Samus Aran: Die Lizenz kostet ja 60 Euro! Und für einen Link in meinem Programm geht mir ehrlichgesagt der Platz ein Bisschen aus.

      @Eistee: Was meinst Du?


      Ich habe vorerst meine "Icons" hinzugefügt (Es sind vielmehr Symbole als Icons).

      Gibt es sonst noch etwas zum Programm?
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

      Tut mir leid, picoflop. Da ist meiner Meinung nach nichts dabei was die Funktion des jeweiligen Buttons untermalt.

      @Samus Aran: Nur wenn man im Programm einen Link zur Seite hinzufügt. Sonst kostet die Lizenz 60 Euro. Das sagt zumindest das was ich bei Google gefunden habe.
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils
      Haha, Nun, es ist so: Wohin mit dem Button für das About Fenster? Wenn es mit der F1 Taste geht würde ich das schon machen.


      /Edit:

      Ich habe ein Update hochgeladen. Siehe Bekannte Bugs im ersten Post.
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

      @Pascal J.: Haha! Ja, da wrid man nach einer Weile wirklich bekloppt!

      Ich hätte vor hier einige Beispieldateien hochzuladen. Hättest Du was dagegen wenn ich Deine Datei dazunehme? (Natürlich mit Verweis auf Dich).

      Edit: Die Dateien sind ja nicht so groß, die könnte man auch gleich so hochladen, oder? (also ohne Archiv).
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils
      @Pascal J.: Vielen Dank.
      Ach ja, die Endung ist ja nicht erlaubt. Hm, also ich werde keinen Moderator damit nerven. Blöd ist es schon, aber was solls.
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils
      Also ich habe mal kurz damit gespielt.
      Damit das ganze einen (sehr sinnvollen) Nutzen haben könnte, wäre es toll, wenn du

      Reflexionen,
      Beugungen einbauen könntest.
      Weiterhin wäre es toll, wenn die Wellen Farbabstufungen hätten, also damit meine ich
      die Maxima eine kräftigere Farbe als der Nullwert o.ä.

      Interferenzen zeigen.

      Diese Vorschläge haben den Nutzen, dass man z.B. Raumakustik damit veranschaulichen könnte.

      Die nächste Stufe wäre dann, die Resonanzpunkte verschiedener Frequenzen im Raum
      darzustellen.
      Eine weitere Stufe ist natürlich noch, das ganze in 3D zu programmieren.