Pfadkorrektur für Wegpunkte
Übersicht

![]() |
TravisBetreff: Pfadkorrektur für Wegpunkte |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hiermit kann man fehlerhaft platzierte Wegpunkte, die "aus der Reihe tanzen" ausgleichen.
Zwei Beispiele sind enthalten. Der ursprüngliche Pfad wird rot angezeigt und der korrigierte grün. PS: Man kann die Ganauigkeit erhöhen, indem man den Ausgleich mehrmals ausführt. Code: [AUSKLAPPEN] ; Pfadkorrektur für Wegpunkte ; Gleicht Versätze in einer Koordinatenreihe aus, die einen zusammenhängenden Pfad bilden. ; Damit kann man z.B. Wegpunkte korrigieren, die "aus der Reihe tanzen". ; Die Funktion Ausgabe prüft einen Anfangs und einen Endpunkt des Pfades und verschiebt alle ; Punkte, die sich dazwischen befinden auf eine Linie, die den Anfangs- mit dem Endpunkt verbindet. ; In einer Schleife angewendet, kann man somit auch Kurven bilden. Dim X#(640) Dim Y#(640) Global n Global Start, Ende Graphics 640,480,16,2 AppTitle "Pfadkorrektur für Wegpunkte" ; fehlerhaften Bispielpfad generieren BeispielHorizontal() BeispielHorizontal2() ;BeispielVertikal() ; Ursprungspfad anzeigen For i = 1 To n Color 255,0,0 Plot x(i), y(i) Next ; --- Versatz ausgleichen --- For temp = 1 To 2 ; genauigkeit For i = start To ende Step 20 Ausgleich(i-20,i+20) If start < 0 Then start = 0 Next For i = ende To start Step -20 Ausgleich(i-20,i+20) If start < 0 Then start = 0 Next Next ; --- Versatz ausgleichen --- ; Ausgabepfad anzeigen Color 0,255,0 For i = 1 To n Plot x(i), y(i) Next WaitKey End Function BeispielHorizontal() ; Punkteversatz generieren For n = 0 To 639 If n < 320 Then y(n) = 250 + n/2 ;+ Rnd(-3,3) Else y(n) = 250 - n/6 ;+ Rnd(-3,3) EndIf x(n) = n Next ; Ausgleichsbereich festlegen Start = 150 Ende = 470 End Function Function BeispielHorizontal2() ; Punkteversatz generieren For n = 0 To 639 If n < 320 Then y(n) = 350 + n/8 + Rnd(-5,5) Else y(n) = 200 - n/6 + Rnd(-5,5) EndIf x(n) = n Next ; Ausgleichsbereich festlegen Start = 20 Ende = 600 End Function Function BeispielVertikal() ; Punkteversatz generieren For n = 0 To 479 If n < 240 Then x(n) = 200 + n/4 Else x(n) = 300 + n/4 EndIf y(n) = n Next ; Ausgleichsbereich festlegen Start = 140 Ende = 340 End Function Function Ausgleich(Start#, Ende#) ; Verlaufsrichtung ermitteln For ii = 0 To n-1 For i = 0 To n-1 If Abs(x(i)-x(ii)) > MaxAbsX Then MaxAbsX = Abs(x(i)-x(ii)) Next Next For ii = 0 To n-1 For i = 0 To n-1 If Abs(y(i)-y(ii)) > MaxAbsY Then MaxAbsY = Abs(y(i)-y(ii)) Next Next If MaxAbsX > MaxAbsY Then Verlauf = 0 If MaxAbsX < MaxAbsY Then Verlauf = 1 Color 0,0,0:Rect 0,0,640,60,1 Color 200,200,200 Text 5, 5, "Maximaler Abstand X: " + MaxAbsX Text 5,15, "Maximaler Abstand Y: " + MaxAbsY If Verlauf = 0 Then Text 5, 35, "Horizontaler Verlauf von " + n + " Punkten" If Verlauf = 1 Then Text 5, 35, "Vertikaler Verlauf von " + n + " Punkten" ; Verlaufsrichtung ermitteln ; horizontaler Ausgleich If Verlauf = 0 Then FirstY = y(Start) LastY = y(Ende) Color 25,25,25: Rect Start, 0 , Ende-Start, 480, 0 Abstand = Abs(FirstY-LastY) Dauer# = Ende - Start For i = Start To Ende Progress# = (i-start) / dauer# If FirstY > LastY Then y(i) = y(start) - (Progress * Abstand) If FirstY < LastY Then y(i) = y(start) + (Progress * Abstand) Next EndIf ; horizontaler Ausgleich ; vertikeler Ausgleich If Verlauf = 1 Then FirstX = x(Start) LastX = x(Ende) Color 25,25,25: Rect 0, Start , 640, Ende-Start, 0 Abstand = Abs(FirstX-LastX) Dauer# = Ende - Start For i = Start To Ende Progress# = (i-start#) / dauer# If FirstX > LastX Then x(i) = x(start) - (Progress * Abstand) If FirstX < LastX Then x(i) = x(start) + (Progress * Abstand) Next EndIf ; vertikeler Ausgleich End Function |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
![]() ![]() |
||
![]() |
Travis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was gibts denn daran nicht zu verstehen? Man hat eine Reihe von Koordinaten, die eine Linie bilden. Diese will man z.B. als Wegpunkte für eine Bewegung benutzen. Nur leider ist diese Linie an manchen stellen unschön verschoben, oder es tanzen Punkte aus der Reihe.
Dann kommt diese Funktion ins Spiel und begradigt alle Punkte zwischen Punkt A und B. |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, habe ich mir ja angesehen .
Das Ergebnis sieht aus wie ne Bezier Interpolation über 4 Punkte . Mich wundert es nur das du so komplizierte Sachen machst ![]() |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du alle Punkte zwischen a und b begradigst hast du (tataaaa!) eine Linie zwischen a und b und kannst (als Waypoint) auf alle Punkte dazwischen verzichten. Ein Waypoint macht doch nur bei Richtungsänderungen Sinn... | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Travis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, schon klar. Mein Problem ist aber folgendes gewesen. Ich mache ein Formel 1 - Spiel in dem mehrere Runden gefahren werden.
Die Computergegner möchte ich jetzt über Waypoints steuern. Und um diese zu erzeugen fahre ich die Strecke einmal ab. Dabei wird in bestimmten Zeitabständen die Position und die Geschwindigkeit gespeichert. Dies sind dann die Waypoints für den Gegner. Ich fahre genau eine Runde um die ganzen Punkte für einen Gegner festzulegen. Jetzt befindet sich der letzte Punkt natürlich nicht auf gleicher Höhe wie der erste Punkt, weil ich die Runde nicht genau an der gleichen Stelle beende wie ich sie angefangen habe. Es ist also ein Versatz drin. Da würde der Gegner also einen unschönen "Zacken" fahren. Und um das anzugleichen habe ich das geschrieben. |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn die sturr auf eine Linie fahren wie sollen die dich denn
dann überholen ? Du müßtest mehrere Linien bzw. Wegpunkte haben wo die auch lang fahren dürfen und da wäre dann ein Wegpunkteditor angebracht . Stell ich mir so vor das es ein Punkt für Links Mitte und Außen gibt und dazu noch ein Kennzeichen ob der in der Kurve ist . |
||
![]() |
Travis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm, mehrere Spuren. Das wäre noch einmal eine gute Idee, die man vielleicht umsetzen könnte.
Allerdings müssen die Wegpunkte unbedingt auch Geschwindigkeitsinformationen enthalten. Man kann ja nicht in jeder Kurve gleich schnell fahren. Es gibt Kurven in denen man beschleunigen kann und dann gibt es Kurven in denen man fast anhalten muss um überhaupt rum zu kommen. Wenn ich die Punkte alle per Hand setzen würde, dann wäre es schwierig, die Geschwindigkeit zu optimieren, damit er richtig durch die Kurven kommt. Deshalb ist es für mich momentan am einfachsten die Wegpunkte durch fahren der Strecke zu erstellen. Man merkt's vieleicht - ich habe noch keine Erfahrung damit. Es ist mein erstes Projekt in dem ich überhaupt Wegpunkte verwende. Und das mit dem Überholen und der KI der Gegner (oh weia, auf was habe ich mich da überhaupt eingelassen) steht noch ziemlich weit unten auf der Prioritätenliste. Erstmal muss ich die Physik noch weiter ausarbeiten. |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit dem aufzeichnen ist ja schon gut ,
dann irgendwie in Echtzeit die Wagen fahren lassen und dann an den Wegpunkten rumfummeln bringt wohl das beste Ergebnis , nur so eine Idee . |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group