[Delphi] Trajektoria jazdy

0

Od kilku dni z kumplem meczymy sie z symulacja - trajektoria(rozna oczywiscie) jazdy zuzlowca(kropki ;-) ) po torze.
Jedym pomyslem bylo podzielenie toru na 8 czesci
I tak w 1 czesci sprawdzal swoje polozenie (x,y) i losowal 1 z 10 mozliwych punktow (x,y) w czesci 2 i jechal do niej itd. z tym ze metoda ta niesprawdzala sie gdy wchodzil w luk. Podczas poruszania miedzy czesciami kropka czesto wyjezdzala poza tor. Zreszta ta metoda ogranicza ta symulacje do 10 schematow w danej czesci...i tylko na jednym torze bez mozliwosci przelozenia implementacji pod inne tory
Moze lepiej zrobic tor, nastepnie maske (2 kolory) oddzielic tor od band i sprobowac zrobic mu sztuczna inteligencje...i niech sam sie meczy ;) z tym ze wtedy minimum potrzebnych parametrow bedzie spora i na razie widze takie jak : predkosc,przyspieszenie,predkoscMax,skret-obrot,dlugoscToru?,start, i w sumie nie wiem jak sie do tego zabrac.
Moze ktos robil kiedys popularne "kreski" i moglby podpowiedziec to i owo.
Za wszelka pomoc bede wdzieczny i z gory dziekuje za pomoc.
gg:2718965

0

jezeli tor sklada sie tylko z odcinkow prostych i łuków sprobuj je opisac matematycznie tzn
for y:=0 to 200 ----> x:=(y-b)/a (kozystasz ze wzorów y:=a*x+b)
łuki analogicznie i losuj x z wyznaczonego zakresu dla danego y

Moze sie pojawic taka sytuacja ze dla danego y bedziesz mial wiecej niz jeden zakres x (np dla wejscia w łuk i wyjścia) wiec musisz okreslic ze jezeli poprzedni x mial takie wspolrzedne to nastepny musi miec podobne a nie skok

0

no np parabola lotu piłki.
bardzo banalna robiona na szybko.
wykorzystujemy tu funkcję

f(x) := y*y;

oczywiscie trzeba uwzględnić żę na formatce mam nieco inny "układ współrzędnych".


obliczając położenie nastepnego pixela mozesz bez problemu określić trajektorię ruchu jakiego kolwiek obiektu na formatce


oto kod do paraboli;

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Shape1: TShape;
    Button1: TButton;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var x:integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
 timer1.Enabled:=false;
 x:=-30; // funkcja bedzie sie zaczynała od x= -30
 doublebuffered:=true; // no i żeby nie migało

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var y:integer;
begin

     y:=x*x+form1.Height div 2  ;   // obliczenie y dla danego x  , form1.Height div 2 po to zeby bylo na srodku
     shape1.Top := y - form1.Height div 2 ;// zmiana pozycji shape1 (Y)
     shape1.Left:=x+form1.width div 2 ;   //zmiana pozycji shape1 (X)
     inc(x);
     if x>30 then begin  // no a to po to żeby animacja  się powtarzala
      x:=-30;
     end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

  timer1.Enabled:=true;

end;

end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1