Pfadkorrektur für Wegpunkte

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Travis

Betreff: Pfadkorrektur für Wegpunkte

BeitragFr, Aug 27, 2004 15:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Aug 28, 2004 0:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Confused Question

Travis

BeitragSa, Aug 28, 2004 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Aug 28, 2004 0:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

BladeRunner

Moderator

BeitragSa, Aug 28, 2004 12:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Aug 28, 2004 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Aug 28, 2004 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 29, 2004 0:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 29, 2004 3:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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 .

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group