Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi auto entlang einer linie fahren lassen (https://www.delphipraxis.net/77155-auto-entlang-einer-linie-fahren-lassen.html)

holle 15. Sep 2006 12:00


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)

SirThornberry 15. Sep 2006 12:05

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?

holle 15. Sep 2006 21:59

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

3_of_8 15. Sep 2006 22:01

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?

holle 15. Sep 2006 22:06

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

Phobeus 15. Sep 2006 23:07

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;

holle 17. Sep 2006 12:11

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.

Nikolas 17. Sep 2006 12:40

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.

mimi 17. Sep 2006 14:18

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 !

Nikolas 17. Sep 2006 14:52

Re: auto entlang einer linie fahren lassen
 
Wie willst du denn mit diesem Ansatz eine Kurve fahren?

mimi 17. Sep 2006 15:42

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

holle 17. Sep 2006 16:15

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

Nikolas 17. Sep 2006 19:28

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.

holle 17. Sep 2006 21:04

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

Nikolas 17. Sep 2006 21:21

Re: auto entlang einer linie fahren lassen
 
Das weiss ich grad auch nicht, die Frage wäre aber besser in einem neuen Thread aufgehoben.

holle 17. Sep 2006 22:16

Re: auto entlang einer linie fahren lassen
 
ok, hier der neue thread: HIER

mfg holle

Cöster 18. Sep 2006 14:24

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.

Nikolas 18. Sep 2006 15:24

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.

Cöster 18. Sep 2006 15:31

Re: auto entlang einer linie fahren lassen
 
Zitat:

Zitat von Nikolas
Das ist damit auch möglich. Mit dem Code kann man auch einem Parabelsegment folgen und damit auch andere Kurvenformen simulieren.

Wie denn?

Nikolas 18. Sep 2006 15:38

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.

Cöster 18. Sep 2006 16:21

Re: auto entlang einer linie fahren lassen
 
Zitat:

Zitat von Nikolas
Variier einfach mal die Parameter a und b. Wenn du den Winkel ganz durchlaufen lässt, wirst du damit eine Parabel zeichnen können.

Parameter a und b? Oh, ich glaub, wir sprechen gerade über zwei unterschiedliche Codes. Ich meinte eigentlich die Lösung von Holle.
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.

Nikolas 18. Sep 2006 16:25

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