Kreis in Pygame unterteilen

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
k-net
User
Beiträge: 24
Registriert: Donnerstag 22. Oktober 2020, 16:43

__deets__ hat geschrieben: Donnerstag 24. Juni 2021, 17:48 Mir ist unklar was diese Kugeln tun sollen. Kannst du das mal beschreiben?
Letztendlich möchte ich diesen optischen Effekt nachbilden:
https://www.youtube.com/watch?v=pNe6fsaCVtI

Jede Kugel bewegt sich eigentlich nur auf ihrer Linie hin und her, aber mit den passenden Abständen entsteht der Effekt, dass sie sich umeinander drehen würden. So wie ich das bisher habe, sieht das auch schon ganz nett aus. Es fehlt noch, dass die Kugeln zum Ende hin ihre Geschwindigkeit verlangsamen und eben die richtige Geschwindigkeit für die Kugeln die ich benannt habe.
Was aber klar ist: du musst dringend Klassen, Argumente und Variablen benutzen. Statt mehrfach den nahezu gleichen Code zu kopieren. Das ist fehlerträchtig und kompliziert.
Das ist mir absolut klar! Ich schreibe den Code aktuell so, weil ich es nicht besser kann. Ich mache das nur, um Python autodidaktisch zu lernen (aus Spaß übrigens, in meinem Alltag oder Beruf hab ich davon nix) und dafür gehe ich langsam vor (auch weil ich nicht so wahnsinnig viel Freizeit habe). Bei dem Code so wie er jetzt ist, weiß ich in jeder Zeile, was passiert. Das ist mir wichtig. Ich möchte auch keine fertigen Lösungen haben (naja, manchmal vielleicht schon) sondern mir das selber erarbeiten, eben um das zu kapieren. Ich möchte aber natürlich eure Unterstützungsbereitschaft auch nicht überstrapazieren. Aber wenn ich eine Formel genannt bekomme, die ich nicht verstehe, habe ich nichts davon und kann die nicht auf spätere Projekte anwenden. Beim Autofahren fängt man ja auch nicht auf der Rennstrecke an, sondern übt erstmal. Daher mache ich das so scheibchenweise in der Hoffnung, niemanden zu nerven :)

Im weiteren Verlauf würde ich natürlich versuchen, den häufig gleich oder ähnlich verwendeten Code in eine elegantere Datenstruktur zu setzen. Das ist aber häufig eine Verständnisfrage. Kennt ihr die Leute, wenn der Lehrer in der Oberstufe irgendwelche wüsten mathematischen Formeln an die Tafel geschrieben hat, die darin direkt irgendwelche Zusammenhänge gesehen haben und angefangen haben, in ihre Hefte zu schreiben? Ich war so einer nicht :D
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@k-net: Was die Geschwindigkeit angeht, würde ich mal einfach eine Sinus-Schwingung probieren.

Das `pygame.math`-Modul könnte auch interessant sein.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
k-net
User
Beiträge: 24
Registriert: Donnerstag 22. Oktober 2020, 16:43

Hi,
könntest du das etwas präziser benennen? Vielleicht hast du irgendwo ein Beispiel oder Tutorial an dem ich mich orientieren kann?
Danke!
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du willst eine oszillierende Bewegung. Der Sinus ist eine oszillierende Schwingung.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe jetzt erst das Video gesehen. Und damit ist klar, dass du einen Sinus nehmen *musst*. Das sind 8 Phasenverschobene Sinusschwingungen über den gesamten Durchmesser.
k-net
User
Beiträge: 24
Registriert: Donnerstag 22. Oktober 2020, 16:43

Okay, dann wär das ja geklärt. Ich wäre trotzdem für eine Erklärung, einen hilfreichen Link oder Tutorial dankbar. :mrgreen:
So sagt mit das nichts :wink:
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Position einer Kugel i zum Zeitpunkt t, ausgedrückt als Radius r_i ist

r_i = R * sin(t * f * math.pi * 2 + p_i)

Und dabei ist p_i der Phasenversatz der Kugel i, in radians. Wie groß die p_i sind kann ich nicht sagen, aber wenn man sich das mal aufmalt mit den Kugeln auf den Geraden und gleichzeitig in Kreisform, dann kann man das ja einfach rückwärts rechnen.

f ist einfach die Frequenz mit der das passieren soll in Hertz. Fuer den Effekt wahrscheinlich kleiner 1, also zB 0.1Hz.

Und R ist einfach dein grosser Kreisradius.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

k-net hat geschrieben: Freitag 25. Juni 2021, 10:22 Okay, dann wär das ja geklärt. Ich wäre trotzdem für eine Erklärung, einen hilfreichen Link oder Tutorial dankbar. :mrgreen:
So sagt mit das nichts :wink:
viewtopic.php?f=9&t=52426

Danke für die Inspiration!
k-net
User
Beiträge: 24
Registriert: Donnerstag 22. Oktober 2020, 16:43

r_i = R * sin(t * f * math.pi * 2 + p_i)
Nachdem ich mir etliche Tutorials zum Einheitskreis, Sinus und Cosinus sowie zu Bewegung von Objekten in Python angeschaut habe, habe ich dennoch nicht den leisesten Hauch einer Ahnung, wie ich das umsetzen soll.
Danke für die Inspiration!
Bitte, freut mich wenn ich zumindest Ideengeber sein konnte. Leider verstehe ich nicht genug von Python (oder Mathe) um nachvollziehen zu können, was ihr da gemacht habt.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Aufgabe erfordert halt diese Mathematik. Wenn du die selbst lösen willst, wirst du dir das erarbeiten müssen. Und jetzt hast du doch eine Musterlösung. Die kannst du studieren.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@k-net,

hast du dir denn die Schritte in dem anderen Topic mal angeschaut?
viewtopic.php?f=9&t=52426

Ich hatte ja extra versucht zu zeigen wie man von einem Basis-Pygame die einzelnen Schritte nach und nach entwickelt.
Kopier dir doch den Code und schau was er macht.
k-net
User
Beiträge: 24
Registriert: Donnerstag 22. Oktober 2020, 16:43

Ich habe mir das schon angeschaut, allerdings hatte ich noch nicht die Zeit, mich eingehend damit zu befassen. Einiges kann ich noch nicht nachvollziehen, das versuche ich noch zu verstehen. Wenn nicht, frage ich dich. Aber danke für die Erläuterungen!
Antworten