![]() |
auto entlang einer linie fahren lassen
hallo, ich möchte ein auto entlang einer linie fahren lassen. die linie beschreibt eine straße. z. b. 100px gerade aus und dann eine kurve mit einem radius von 50px. das auto soll der linie folgen und sich in fahrtrichtung drehen. das auto habe ich als grafik vorliegen.
wie könnte man das am besten realisieren? mfg holle. (danke) |
Re: auto entlang einer linie fahren lassen
an welcher stelle kommst du nicht weiter? Kannst du das Fahrzeug nicht drehen oder kannst du der Linie nicht folgen?
|
Re: auto entlang einer linie fahren lassen
ums drehen habe ich mich erstmal gar nicht gekümmert. gehen wir mal von einem punkt als auto aus. wie kann ich dann der linie folgen? es gibt ja eine kreisgleichung, damit könnte man das auto eine kurve fahren lassen. nur wie bekomme ich das zusammen?
mfg holle |
Re: auto entlang einer linie fahren lassen
Wie liegt deine Linie vor? Hast du ein schwarz/weißes Bild, hast du jeden einzelnen Punkt oder hast du Vektorkoordinaten und Bezierkurvenangaben? Oder willst du das hart kodieren?
|
Re: auto entlang einer linie fahren lassen
bis jetzt habe ich noch keine linie. ich habe eine kreuzung als hintergrundbild. hier soll das auto links abbiegen. wie, ist egal. ich könnte ja eine zweite grafik mit einer schwarz-weiß linie zum weg finden nutzen?
mfg holle |
Re: auto entlang einer linie fahren lassen
Bin gerade auf dem Sprung, aber ich spendiere mal einen Code-Schnipsel aus einem Projekt von mir, der verwendet wird um ein Objekt entlang einer Route wandern zu lassen. Die Routen sind als einfache 2f-Vectoren gespeichert. Touched führt eine einfache Prüfung durch, ob das Objekt eine gewisse Toleranz-Distanz zum Zielpunkt erreicht hat. Anschließend brauchst Du nur noch das Objekt in die richtige Richtung zu drehen.
Delphi-Quellcode:
if control = CC_ROUTE then
begin rx := route[currentRoute].x; ry := route[currentRoute].y; xdiff := abs(rx-pos[0]); ydiff := abs(ry-pos[1]); length := sqrt(xdiff*xdiff+ydiff*ydiff); mx := (rx - pos[0]) / length*speed; my := (ry - pos[1]) / length*speed; pos[0] := pos[0] + mx; pos[1] := pos[1] + my; // check, if a route point is reached if touched(rx,ry) then begin case route[currentRoute].action of RP_NEXT: begin g_Console.add('Reach rp '+IntToStr(currentRoute)+' proceed to next'); inc(currentRoute) end; RP_REPEAT: begin g_Console.add('Reach rp '+IntToStr(currentRoute)+' start over again'); currentRoute := 0; end; end; end; |
Re: auto entlang einer linie fahren lassen
@Phobeus
danke für den code. nur leider blick ich da nicht so ganz durch. könntest du mal bitte erläutern, was da gemacht wird? danke, holle. |
Re: auto entlang einer linie fahren lassen
Liste der Anhänge anzeigen (Anzahl: 1)
Eine Ellipse kann man so parametrisieren:
( cos(x)*a, sin(x)*b ) (0<x<=2pi; für a=b=r wirds ein Kreis mit Radius r) Wenn das Auto eine Kurve nach links fahren soll (um 90°) muss der Ausdruck x zwischen 0 und pi/2 liegen, da Delphi Eingaben in Rad erwartet. Das Auto fährt damit einen Viertelkreis ab. Zuerst suchst du dir den Mittelpunkt deines Kreisstückes. (M in der Grafik) dann machst du eine while-Schleife in der du Winkelwerte zwischen 0 und pi/2 abarbeitest. Je nach dem, wie groß der Abstand zwischen zwei Winkelwerten ist, springt das Auto mehr oder weniger. Die Position deines Autos hast du dann immer durch (M.x+cos(phi)*r, M.y-sin(phi)*r) gegeben. |
Re: auto entlang einer linie fahren lassen
ich würde das noch etwas anders machen:
du weißt doch bestimmt wo sich die staße im bild befindet wenn nicht: das musst mit paint herrausfinden und die eck punkte abspeichern in einer variable... du brauchst einzelne objekte z.b. bilder die du einfügt.... jetzt könntes du mit hilfe eine zeitschleife den werten der staße entlangen fahren z.b. so: nehmen wir an deine starße befindet sich bei folgenden punkten: 20(x),10(y),100(w),100(h) dürfte eine komische starße werden naja.... jetzt musst du das auto auf die straße setzten: 10,15,10,10(die werte ensprechen wie von oben nur andere zahlen) am besten zeichnest du erstmal als rechteck(10,15,10,10) müste klappen. jetzt musst du dies rechteck verschieben in einem z.b. timer: 5+10(x) bei der breite bin ich mir nicht sicher ob du x+breite machen musst oder nicht.... ich hoffe du versteht den weg....es die starße zu ende musst du prüfen was jetzt für ein starßen typ kommmt am besten verwaltest du alle starßen in ein array und defnierst einen eigenen record z.b. TStrasse=record r:Trect;// für die position und größe typ:Integer;//für das bild was angezeigt werden soll.... end; Auto:TStraße so währes aufjedenfall am einfachsten ist zwar eine menge zu schreiben aber du hast auch was davon ! |
Re: auto entlang einer linie fahren lassen
Wie willst du denn mit diesem Ansatz eine Kurve fahren?
|
Re: auto entlang einer linie fahren lassen
ganz einfach:
findet er eine kurfe z.b. typ = rechts kurfe wird das objekt auto. gedreht und fertig... dürfte kein problem sein: sekunde, es geht noch einacher: du speicherst die richtung ab in der straße: x+1 y=0 z.b. das objekt fährt nur nach x und nicht nach y kommt eine kurfte könnte es z.b. so aussehen: x:=0 y:=-1 z.b. oder so |
Re: auto entlang einer linie fahren lassen
@Nikolas
das funktioniert schon mal gut mit der kurvenfahrt. dann muss ich aber für jede kurve vier fälle unterscheiden, je nachdem in welche richtung das auto gerade fährt (n,s,o,w) und dann noch mal nach links- und rechtskurve. gibt es da vielleicht einen einfacheren weg? @Michael Springwald so wie du hatte ich mir die karte auch in etwa vorgestellt. das auto fährt immer feld für feld. wenn es auf eine kurve trifft wird die prozedur kurveFahren eingeleitet und das auto fährt nach nikolas vorschalg um die kurve. danke, holle |
Re: auto entlang einer linie fahren lassen
@ mimi: hast du mal deine Idee implementiert und angeschaut? Deine Idee mag twar einfach sein, aber eine runde Kurve bekommst du mit der Methode kaum hin, damit zeichnest du nur Geraden.
@ holle: Ich wüsste nicht, wie du da um entsprechend viele Abfragen drumrumkommst. Aber die zumachen, ist ja auch nicht so schwierig. Du veränderst ja nur den Bereich aus 0-2pi der abgearbeitet wird und die Richtung mit dem das Intervall durchlaufen wird. Aber diese Abfragen wird dir niemand abnehmen können. |
Re: auto entlang einer linie fahren lassen
Liste der Anhänge anzeigen (Anzahl: 1)
so, sieht schon mal ganz gut aus. das auto fährt eine linkskurve und dreht sich sogar dabei. mein neues problem: wie bekomme ich den hintergrund vom auto, der jetzt noch weiß ist, transparent? ich möchte das auto gerne über eine grafik fahren lassen...
mfg holle |
Re: auto entlang einer linie fahren lassen
Das weiss ich grad auch nicht, die Frage wäre aber besser in einem neuen Thread aufgehoben.
|
Re: auto entlang einer linie fahren lassen
|
Re: auto entlang einer linie fahren lassen
Deine Lösung bringt dir aber nur was, wenn es auch eine 90°-Kurve ist. Eine Lösung, die sich für alle Kurven benutzen lässt, egal wie scharf, wäre besser.
|
Re: auto entlang einer linie fahren lassen
Das ist damit auch möglich. Mit dem Code kann man auch einem Parabelsegment folgen und damit auch andere Kurvenformen simulieren.
|
Re: auto entlang einer linie fahren lassen
Zitat:
|
Re: auto entlang einer linie fahren lassen
Variier einfach mal die Parameter a und b. Wenn du den Winkel ganz durchlaufen lässt, wirst du damit eine Parabel zeichnen können.
|
Re: auto entlang einer linie fahren lassen
Zitat:
Aber zu deinem: Woher weiß das Auto denn, wann eine Kurve kommt, wo ihr Mittelpunkt liegt und welche Werte die Parameter a und b bekommen? Der Computer sollte das doch idealerweise automatisch erkennen, sodass die Map auch leicht austauschbar ist. |
Re: auto entlang einer linie fahren lassen
Ich habe nur erklärt, wie man dir Kurve fahren kann. Wie das später im Programm implementiert wird, ist mir recht egal. Da auch überhaupt nichts dazu gesagt wurde, in welchem Format die spätere Strecke vorliegt kann ich da auch nichts zu sagen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz