Symulacja ruchu samolotu po obranym torze

0

Witam serdecznie,
pilnie potrzebuję Waszej pomocy. Siedzę nad tym kilka nocy i niestety nie udało mi się rozwiązać problemu. W piątek muszę złożyć pracę dyplomową a z symulacją siedzę kolejną noc z rzędu i nie mogę sobie poradzić.

Jeśli ktoś wykonywał coś takiego lub ma pomysł na to, bardzo proszę o pomoc.

  1. Obiekt startuje i leci ze stałą prędkością 20 m/s przez odcinki wyznaczone punktami P1,P2,P3,P4,P5,P6,P7,P8 : TPoint (punkty mają współrzędne np: P1(2300, 3400), P2(3200,4000) w metrach)
  2. Zczytuję położenie obiektu np co: 0,5 lub co 1 s i zapisuję do pliku:

czas | X | Y

Obrazek, który narysowałem żeby przedstawić tor lotu.
user image

0

Z czym konkretnie masz problem?

0

Witam serdecznie,
więc problem mam z tym aby po osiągnięciu przez samolot dystansu dzielącego P1 i P2 automatycznie leciał z P2 do P3 itd. Tylko wydaje mi się, że X:=X+(V*dt); moze być błędne gdyż tor ruchu nie jest wzdłóż osi X a jest pod jakimś kątem.

Dystans między kolejnymi punktami obliczam funkcją (wynik w [m]):

function Dystans(P1, P2: TPoint): Integer;
begin
  Result := Round(Sqrt(Sqr(P1.X - P2.X) + Sqr(P1.Y - P2.Y)));
end;

Mając daną aktualną wartość X obliczam wartość Y za pomocą funkcji:

Function ObliczX(x1,y1,x2,y2, X:Real):Real;// liczenie wartości Y z równania prostej przechodzącej przez dwa punkty (x1,y1) i (x2,y2) i punkt X
  Begin
    Result:=((y2-y1)/(x2-x1))*x-((y2-y1)/(x2-x1))*x1+y1;
  End;
procedure TBAL.Button1Click(Sender: TObject);
var obliczenia : TextFile;
P:TPoint;
t,dt:real;
X,Y,S:Real;
V:integer;
P1,P2,P3,P4,P5,P6,P7,P8 : TPoint;      // WAYPOINT'S PUNKTY NAWIGACYJNE
begin

t:=0;     // czas początkowy
X:=P1.X;  // X startu wynosi X pierwszego punktu.
Y:=P1.Y;  // Y startu wynosi Y pierwszego punktu.
V:=20;    // stała prędkość lotu.
dt:=0.5;  // wylicz pozycję co 0.5s lotu.
S:= 29000 // wyliczona wcześniej całkowita długość trasy

AssignFile(obliczenia, 'obliczenia.txt');
rewrite(obliczenia);


repeat
X:=X+(V*dt);
{Czy dobrze wyliczam X? Czy należy dodać jakiś współczynnik pochylenia prostej?}
Y:=ObliczX(P1.X,P1.Y,P2.X,P2.Y, X);   // oblicza Y dla zadanego X

{i tutaj nie wiem jak zrobić aby po przeleceniu dystansu dzielącego P1 i P2 leciał wzdłóż P2 i P3 }

Writeln(obliczenia,FormatFloat('0.00' , t),' ',FormatFloat('0.00' , X),' ',FormatFloat('0.00' , Y));
t:=t+dt;
until CalkowityDystans>=S;

CloseFile(obliczenia);
end;
0
float __fastcall n2dGetPolarCoordAngleA(float x,float y)
{
if ( (x > 0) && (y >= 0) ) { 	return ArcTan(y/x);        }

if ( (x > 0) && (y < 0) )  { 	return ArcTan(y/x)+2*3.1415926535897932384626433832795;  }

if  (x < 0)                 {	return ArcTan(y/x)+3.1415926535897932384626433832795;    }

if ( (x == 0) && (y > 0) )  { 	return 3.1415926535897932384626433832795/2;                   }

if ( (x == 0) && (y < 0) )  { 	return 3*3.1415926535897932384626433832795/2;                 }

return - 1000;
}

to zwraca katy w stopniach

argumentem fukncji jest P1 - P2 lub P2 - P1

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