Raumschiff an Position stoppen nur mittels Beschleunigung
Übersicht

KruemelatorBetreff: Raumschiff an Position stoppen nur mittels Beschleunigung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ein Raumschiff bewegt sich mit Schubdüsen, die können das Raumschiff in eine bestimmte Richtung beschleunigen. Dieses Raumschiff soll sich jetzt schnellst möglich an einen angegeben Position bewegen und dort zu Ruhe kommen.
Das müsste so gehen dass das Raumschiff solange beschleunigt bis zu einer Stelle kommt ab der es abbremsen muss um nicht über das Ziel hinaus zu fliegen. Um es einfach zu halten erstmal mit nur in einer Dimension. Wie ermittel ich nur den Beschleunigungswert für den jeweiligen Schleifendurchgang? Hier mal mit Beispielwerten: BlitzBasic: [AUSKLAPPEN] position = 0 |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich bin gerade sehr müde, kann also völliger Blödsinn sein:
Verhältnis von Beschleunigung zu Abbremsentschleunigung: 3:1 Das heißt, das erste Viertel des Weges beschleunigst du, das letzte Viertel bremst du ab. Habs mal ausprobiert, mit Long-Variablen und dafür großen Ganzzahlen (zwecks bester Genauigkeit) kommt diese Abschätzung bei mir bis auf 0.0008599% genau hin, also quasi so gut, wie man es kriegt. Bei deinen Werten und Float-Variablen ist das ganze wenigstens noch 0.85% genau. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mit festen Werten würde ich das auch hinbekommen, mein Problem liegt daran dass sich alles außer dem Schub ändern kann. Z.B. kann das Raumschiff schon mit einer Geschwindigkeit starten, außerdem ändert sich die der Wert von Position jeden Schleifendurchgang und ich kann lediglich den Abstand zum Ziel ermitteln. | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ist ja auch logisch. Wenn man einen Körper beschleunigt hat, muss man ihn um genau den selben Betrag wieder abbremsen.
Wenn man von einer Maximalgeschwindigkeit ausgeht, kann man die nötige Zeit (=Schleifendurchgänge) über die Formel für gleichmäßig beschleunigte Bewegungen ausrechnen: v = a * t => t = v/a |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, du kannst ja von dem hier ausgehen:
Code: [AUSKLAPPEN] beschleunigung = b
geschwindigkeit = startgeschwindigkeit + t * b entfernungzumziel = startentfernung + startgeschwindigkeit * t + t²/2 * b Wenn du die Geschwindigkeit auf 0 setzt und nach t umformst, dann kriegst du raus, wie viel Zeit/Zyklen du brauchst um das Schiff zu stoppen. Wenn du die Entfernung zum Ziel auf 0 setzt, und dann mittels der quadratischen Lösungsformel umformst, dann solltest du bekommen, wie weit vor dem Zeil du abbremsen musst. Sobald du auf diese Entfernung runtergekommen bist, musst du dann hald abbremsen. Wie gesagt, sehr müde, kann auch voll falsch sein. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich würde es über eine Simulation machen. Das würde in einem Raumschiffspiel auch Spaß bringen.
Zunächst einmal eine Begriffsklärung. Ein Raumschiff, das Du beschleunigst hält NIE wieder an! Also ist die Frage falsch, wie man beschleunigt um zu einer bestimmten Position zu kommen. "Abbremsen" geht auch nicht. Nur "Beschleunigen" in eine andere Richtung,. z.B. Gegenrichtung. Bei fester Schubkraft beeinflusst nur ein Faktor den Zielpunkt: die aktuelle Geschwindigkeit. Jeder Düsenstoß bringt als eine Zu- oder Abnahme der Geschwindigkeit. Nun muss man ja so lange einen Düsenstoß in die Gegenrichtung simulieren, bis die Geschwindigkeit wieder 0 ist. Das resultierende Ergebnis wäre dann die dabei zurückgelegte Strecke (Weg#). Das zieht der Navigator nun von der Ziel-Position ab, so kann er herausfinden, wo der richtige Zeit/Ort für das Starten der Aktion ist. Im Raumschiff hat der Navigator also nur eine einzige Chance das Raumschiff an einer bestimmten Position zum stoppen zu bringen: Er muss zum richtigen Zeit/Ort die Aktion starten. Zeitpunkt und Distanz korrelieren dabei. BlitzBasic: [AUSKLAPPEN] Global Schub#=0.003 Eine "Automatik" würde nun das Ergebnis der Funktion Bremsweg#() mit der noch zurückzulegenden Distanz (Ziel#-Pos#) zum Ziel vergleichen und bei Bedarf ( wenn Bremsweg()< Distanz ) die Düsen kurz ausschalten oder vielleicht sogar die Bremsleistung einer zweiten Düse verwenden. BlitzBasic: [AUSKLAPPEN] Global Speed#=10, AktPos#=100, Ziel#=520, Schub#=0.003 |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ähm.. Midimaster: Deine Lösung ist im Ansatz recht nett, aber ich verstehe nicht, warum du (selbst zum Zwecke einer Simulation) den Bremsweg mit der Schleife rechnen würdest. Das frisst nur unnötig Rechenleistung für etwas, was der Nutzer nie sieht. Stell dir vor, du hast da 100 Raumschiffe, die lange Strecken zurücklegen, und wo Bremsweg() pro Raumschiff mehrere 100 Mal pro Frame aufgerufen werden muss (z.B. 5 Sec Bremszeit bei 60 FPS -> 300 Schleifendurchläufe). Dann hast du hier glatte 30000 Schleifendurchläufe. Lässt sich viel einfacher über die Formel, die ich davor gepostet hab, direkt ausrechnen:
Code: [AUSKLAPPEN] geschwindigkeit = startgeschwindigkeit + t * b Nullsetzen und Umformen:
Code: [AUSKLAPPEN] 0 = startgeschwindigkeit + t * b
t *b = -startgeschwindigkeit t = -startgeschwindigkeit/b -> t Frames Bremszeit Code: [AUSKLAPPEN] entfernungzumziel = startentfernung + startgeschwindigkeit * t + t²/2 * b
t und b einsetzen: wenn entfernungzumziel = 0 (oder annähernd =0) anfangen zum Bremsen. Habe ich nicht getestet, sollte aber so funktionieren. b ist dabei die Bremsbeschleunigung. Edit: Hier noch mal in Blitz ausprogrammiert: BlitzBasic: [AUSKLAPPEN] Global pos#=0.0 Die Bremswegtoleranz ist notwendig, um Rechengenauigkeitsfehler auszugleichen, da einerseits Floats verwendet werden (die ja ohnehin nicht sehr genau sind) und andererseits ein eigentlich kontinuierlicher Prozess (Flug) in sequenzielle Happen zerlegt wird, und somit auch nicht alles genau abläuft. Mit der eingestellten Toleranz hat es für mich gut geklappt, spiel hald damit rum. Wenn die Toleranz zu groß ist, dann stoppt das Raumschiff vor dem Ziel, wenn sie zu klein ist, dann pendelt das Schiff um das Ziel herum, statt darauf stehen zu bleiben. Mit der eingestellten Toleranz schafft er es auf Wegen von 1 bis 100'000 ganz gut. (Bei 1 war er recht ungenau, ist auf 1.3 stehen geblieben. 1'000'000 hat er nur deswegen nicht mehr geschafft, weil die Floats nicht mehr genau genug waren, um bei dieser Distanz irgendwas sinnvolles zu machen) |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Deine Bremsberechnung hinkt... Wenn du ACC-und DEC-Aktionen im Wechselspiel erlaubst, wird jedes Raumschiff richtig anhalten, auch wenn die Formel nicht funktioniert. Weil ja bei einer "Fehl-Entwickung" einfach dagegengefeuert wird.
Wie wird Deine Restweg-Berechnung aussehen, wenn sie isoliert den korrekten Restweg ausrechnen muss? Funktioniert Deine Formel auch, wenn Sie nur "bremsen" darf? Also jetzt hab ich mal eine Testumgebung geschrieben, in der die Bremsformeln zeigen sollen, was Sie können: BlitzBasic: [AUSKLAPPEN] Graphics 800,600 Start und Ziel und auch Speed werden durch Zufall ausgewählt. Bei einer Speed von unter 3.5 lässt sich das Raumschiff garantiert stoppen. |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Die Ideen mit der Entfernung zum Ziel und dem Bremsweg haben mich gut vorran gebracht.
In meinem Ansatz werden die benötigeten Bremsschritte und die Schritte zum ereichen des Ziels verglichen. Es ist aber noch nicht zufriedenstellend, viele Raumschiffe bleiben am Zielpunkt stehen, manche fliegen aber wieder zurück. Außerdem wechselt das Raumschiff häufig von Schub zu Gegenschub sobald es nah ans Ziel kommt. Abgesehen davon sieht es schon so aus wie man es sich vorstellt. Edit: Problem gefunden für das zurückfliegen(im Code korrigiert), dennoch wird immer noch von Schub zu Gegenschub gewechselt. BlitzBasic: [AUSKLAPPEN] Graphics 800,600,32,2 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group