Physik Test: Ball Simulation Aktuell: v2.0.1

    • Beta

    Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

      Physik Test: Ball Simulation Aktuell: v2.0.1

      Guten Tag.

      Ich möchte hier mein kleines Physik Simulationsprogramm vorstellen.
      Dieses Programm ist zwar nichts Besonderes, aber als Zeitvertreib kann es eigentlich ganz nett sein.
      Und vielleicht kann kann jemand aus dem SourcCode einen Nutzen ziehen.

      Das Programm zeigt einen Ball, der inerhalb eines Rahmens umherhüpft.
      Dabei wird die Position des Balles mit den einfachsten physikalischen Regeln errechnet.
      Geschwindigkeit + Beschläunigung -> Neue Geschwindigkeit
      Position + Geschwindigkeit -> Neue Position

      Seit Version 2 ist es möglich mehrere Bälle gleichzeitig darzustellen.
      In Version 2.0.1, welche die Beta Version von Version 2 ist kollidieren Bälle allerdings noch nicht untereinander.
      Ab Version 2.1 wird das aber behoben sein.

      Name:
      Physik Test.exe

      Systemanforderungen:
      • .Net Framework 2.0 oder höher
      • Minimale Bildschirmauflösung 630x250 (sehr eng). Empfohlen 640x480 und größer.
      • Ab Version 2 Minimale Bildschirmauflösung 730x270. Empfohlen 730x480 und größer.
      • Arbeitsspeicher siehe bekannte Bugs
      • Tastatur und Maus


      Verwendete Sprache:
      Visual Basic .Net (IDE Visual Basic 2010)

      Variablen:
      • Radius: Gibt den Radius des Balles an (Logik^^). Einheit Pixel.
      • Position X, Y: Gibt die Position des Mittelpunktes des Balles relativ zum ClientRectangle der Form an. Einheit Pixel.
      • Geschwindigkeit X, Y: Gibt die Geschwindigkeit des Balles an. Einheit Pixel/Schritt
      • Intervall: Gibt den Intervall an, in dem die Position neu berechnet wird. Einheit Millisekunden (Ja, es ist ein Timer).
      • Gravitation: Gibt die Beschläunigung in Y Richtung an, der der Ball ausgesetzt ist. Vergleichbar mit der Erdgravitation. Einheit Pixel/Schritt /Schritt, also Pixel/Schritt².
      • Höhe/Breite: Gibt die Höhe/Breite des Feldes an. Einheit Pixel
      • Stoßelastizität: Gibt an, mit wie viel Prozent der Aufprallgeschwindigkeit der Ball beim Aufprall auf dem Boden, einer der Wände oder der Decke zurückgeworfen wird. Einheit Prozent von Pixel/Schritt.
        Als Beispiel: Bei 0% wird der Ball gar nicht zurückgeworfen;
        bei 100% gibt es keinen Verlust -> Der Ball hüpft (theoretisch) ewig;
        bei 200% hüpft der Ball immer höher.
      • Luftreibung: Gibt an, wie viel Prozent der Geschwindigkeit in X Richtung bei einem Schritt übrig bleiben. Einheit Prozent von Pixel/Schritt.
        Als Beispiel: Bei 0% kann der Ball maximal einen Schritt in eine X Richtung machen, bevor er stehen bleibt;
        bei 100% kann sich der Ball ungehindert in X Richtung bewegen;
        bei 200% wird der Ball immer schneller.
      • Zieh Faktor: Gibt an, wie viel Prozent der Geschwindigkeit vom Ziehen des Balls auf den Ball übertragen wird (siehe Funktionen: Ziehen). Einheit Prozent von Pixel/Schritt.
        Als Beispiel: Bei 0% hat das Ziehen des Balls keine Auswirkung auf den Ball;
        bei 100% macht ein Unterschied von einem Pixel eine Geschwindigkeit von einem Pixel/Schritt aus;
        bei 200% zwei Pixel/Schritt, etc.

      • Ballfarbe und Rahmenfarbe
      • Ab Version 2 kann die Ballfarbe für jeden Ball unterschiedlich sein


      Funktionen:
      • Einzelschritt:
        Führt eine einzelne Berechnung durch.
        Hilfreich beim genauen Hinsehen.
        Hinweis:
        Private Sub ApplyPhysics() Handles Timer_Physics.Tick, Button_SingleStep.Click
        Diese Codezeile erklärt das, was ich in drei Zeilen nicht erklären kann.
      • Starten:
        Startet den Timer und lässt die Animation automatisch ablaufen.
        Das erspart das ewige Klicken.
      • Pausieren:
        Pausiert das automatische Neuberechnen.
        Dadurch kann man wieder mit Einzelschritten arbeiten.

      • Ziehen:
        Der Ball kann mit der Maus über das Feld gezogen werden.
        Diese Funktion ist bei weitem nicht perfekt.
        Als Referenzpunkt wird der Mittelpunkt des Balles gewählt. Beim Ziehen (mit der linken Maustaste) wird der Unterschied zwischen dem Cursor und dem Mittelpunkt des Balles als neue Geschwindigkeit verwendet. Um extrem übertriebene Geschwindigkeiten zu vermeiden kann ein Prozentsatz der Geschwindigkeit bei "Zieh Faktor" ausgewählt werden.
        Vielleicht hilft das Bild "Physik Test Geschwindigkeiten.png" im Anhang.

      • Begrenzung oben:
        Wenn diese CheckBox aktiviert ist kann der Ball nicht oben aus der Form verschwinden. Wenn eine große negative Y Position vorkommt kann es zu einem Überlauf kommen.


      Screenshots:
      Sind im Anhang

      Dateien und Registrierungseinträge, die erstellt werden:
      Keine.
      Zumindest nicht vom Programm selbst.
      Es kann aber durchaus sein, dass Windows sich da selbst was zurechtbastelt.

      Bekannte Bugs:
      Version 1:
      • "Das Programm frisst den Arbeitsspeicher wie warme Semmeln!"
      • Exception "Ungültiger Parameter" beim Minimieren

      Version 1.2 (bugfix):
      • Arbeitsspeicherauslastung einigermaßen behoben (sind trotzdem immernoch ~210MB)
      • Exception beim Minimieren behoben
      • Bei der TextBox "Geschwindigkeit Y::" stehen zwei Doppelpunkte

      Version 2.0.1:
      • Die Arbeitsspeicherauslastung schent behoben zu sein. Oder mein Taskmanager lügt.
      • Bälle kollidieren nicht untereinander


      Fragen, Anregungen, Wünsche:
      Ich beantworte gerne Fragen, wo ich kann. Auch Fragen in der Art "Wie hast Du das und das gelöst?", obwohl das unnötig ist, weil der SourceCode sowoso zugänglich ist.
      Auch Tipps, wie man Dinge verbessern kann sind erwünscht (z.B. die Ziehfunktion) und falls jemand noch eine Idee hat, die man einbauen könnte nehme ich auch diese sehr gerne an.

      Lizenz:
      Open Source
      Das heißt die Software darf beliebig weiterverbreitet, verändert, etc. werden. Dekompilieren bringt nichts, weil der SourceCode sowiso zugänglich ist.

      Download:
      Physik Test Exe.zip - gepackt: ca. 16KB, entpackt: ca. 40KB
      Physik Test Projekt.zip - gepackt: ca. 168KB, entpackt: ca. 676KB

      Physik Test Exe v1.2.zip - gepackt: ca. 16KB, entpackt: ca. 40KB
      Physik Test Projekt v1.2.zip - gepackt: ca. 156KB, entpackt: ca. 644KB

      Physik Test Exe v1.2.zip - gepackt: ca. 16KB, entpackt: ca. 44KB
      Physik Test Projekt v1.2.zip - gepackt: ca. 184KB, entpackt: ca. 724KB

      (Im Anhang)

      Zur aktuellen Version:
      Die Version 2.0.1 ist nur eine Betaversion.
      Ich wollte die Meinung der Benutzer hören und wissen, was ich ändern/verbessern/hinzufügen/entfernen könnte, bevor ich die entgültige Version 2 veröffentliche.
      Die Kollisionserkennung zwischen den Bällen funktioniert noch nicht, wird aber ab Version 2.1 behoben sein (Das ist ein dicker Brocken an Mathematik!).
      Wenn jemand dazu einen guten Artikel kennt bin ich sehr dankbar.

      Da das Hinzufügen und Entfernen von Bällen etwas unübersichtlich gestaltet ist, hier ein Tutorial:
      Das Programm startet standardmäßig mit einem grünen Ball. In einer ListBox ist dieser Ball ausgewählt ("Ball0 [0, 128, 0]"). Die Zahlen in den eckigen Klammern gibt die Farbe in RGB Format an (damit man einen gesuchten Ball ein bisschen einfacher findet). In den TextBoxen rechts befinden sich die individuellen Werte des Balles. Solange der Ball ausgewählt ist können diese Werte verändert werden. Auch die Ballfarbe kann verändert werden. Der ausgewählte Ball kann durch Klicken auf "-" unter der ListBox entfernt werden.
      In der ListBox befindet sich immer ganz unten der Eintrag "<Neuer Ball>". Wenn dieser Eintrag ausgewählt ist werden in den TextBoxen die Standardwerte angezeigt. Diese Werte können nach Belieben verändert werden. Durch Klicken auf "+" wird ein neuer Ball ins Spielfeld eingefügt und die Auswahl in der ListBox springt zum neuen Eintrag.

      Der ausgewählte Ball wird durch zwei Linien markiert, die sich beim Mittelpunkt des Balles treffen.
      Bilder
      • Physik Test Screenshot.png

        113,55 kB, 1.352×438, 293 mal angesehen
      • Physik Test Geschwindigkeiten Kopie.png

        4,66 kB, 252×281, 169 mal angesehen
      Dateien
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils

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

      m9898 schrieb:

      und bei Schwehrelosigkeit rasen alle Objekte auch wie ein Blitz nach oben...

      ? Sprechen deutsch?
      Bei Schwerelosigkeit bewegt sich das Ding nicht. Und wenn man ihm eine Anfangsgeschwindigkeit mitgibt, ändert sich die nicht und nach dem Aufprall gehts nach oben weg für immer. Scheint irgendwie ein erwartetes Verhalten zu sein.
      @memo: Im Vakuum fallen alle Körper gleich schnell. Der Unterschied kommt nur durch den Luftwiederstand zustande.

      @Regex: Mehrere Bälle währen von der Physik her nicht so schwierig realisierbar. Allerdings werde ich mir an der Kollisionserkennung die Zähne ausbeisen. Aber mal sehen, vielleicht kommt auch das noch.
      Dazu: Wie "wünscht" Ihr euch die Einstellungen? Also eine Liste mit allen Bällen anzeigen und per Mausklick die Einstellungen ändern (Dazu ein gestellter Screenshot)

      @m9898: Bei mir funktioniert Schwerelosigkeit problemlos. Vielleicht hast Du neben die TextBox geklickt und so dem Ball eine hohe Geschwindigkeit gegeben.

      @kinsi: Einen Tag das eigentliche Programm und dann noch 2 oder 3 Tage ein paar Bugs bei der Kollisionserkennung ausgebessert.


      Sonst noch was: Das Programm frisst im Moment den Arbeitsspeicher wie warme Brötchen -> Linearer Anstieg bis Maximum und natürlich Exception.
      Using g As Graphics anstelle von Dim g As Graphics hat das Problem akzeptabel gemacht -> Sägezahnartiges Muster ~210MB.
      Bilder
      • Layout.png

        46,18 kB, 816×391, 172 mal angesehen
      "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“ ()

      @jvbsl: Paint Event verwende ich. Das Programm zeichnet das, was zu sehen ist in ein Bitmap Objekt und ruft Me.Invalidate() auf. Im Me.Paint Event wird dann auf das im EventArg übergebene Graphics Objekt die Bitmap gezeichnet. Dadurch verschwindet das Gezeichnete nicht, wenn man die Form aus dem Bereich des Bildschirmes verschwindet.
      "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“ ()

      das dürfte dann genau so performant sein, wie wenn du einer PictureBox das Bitmap zuweist...
      Bitte zeichne direkt, das ist wesentlich performanter und nicht so Speicherfressend...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      1. Berechnungen nur durchführen, wenn sich auch etwas ändert...Die berechneten Werte in Variablen Zwischenspeichern(Position, Größe, Farbe usw...)
      2. Im Paint-Event anhand der gespeicherten Variablen zeichnen, dann wird nichts übermalt ;)
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Ok, wurde geändert.

      @Regex: Bin gerade dabei die Kollisionsprüfung für mehrere Bälle zusammenzustellen.
      Vielleicht wird's doch was.
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils
      Die Betaversion 2.0.1 ist (bereits seit gestern) veröffentlicht.
      Im ersten Post stehen die Infos dazu.

      Soll ich noch was ändern?
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils