Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

ГРАВИТАЦИЯ В КОСМОСЕ2   Найти похожие ветки 

 
xman ©   (2004-04-29 12:43) [0]

Привет всем!
Этот вопрос продолжает тему ГРАВИТАЦИЯ В КОСМОСЕ http://delphimaster.net/view/9-1083143091/
вот как я делаю. Подскажите как мне избежать неправильный полет пули
она поначалу летит нормально, но как только вырывается из гравитационного поля
планеты сразу набирает скорость и поворачивает в ту сторону в которую была выпущена пуля
в начальном положении.

X,Y - координаты пули
ANGL1 - первоначальный угол
ANGL2 - Угол направленный от пули к планете
SILA - сила выстрела
mojno - разрешение на изменение силы BOOLEAN
klick- значит mojno привышает sila
RAST- растояние от планеты к пуле
PCX,PCY - координаты планеты
PLG - Cила гравитационного поля планеты

в TIMER.ontimer
x:=x+cos(angl1*pi/180)*sila;
         y:=y-sin(angl1*pi/180)*sila;

         if (mojno/2>0) then
         begin
         x:=x+cos(angl2*pi/180)*mojno/2;
         y:=y-sin(angl2*pi/180)*mojno/2;
         end;

         rast:=sqrt(sqr(x+5-pcx)+sqr(y+5-pcy));
         mojno:=plg/rast;

          if (pcx>x+5) and (pcy>y+5) then
          begin
          chetwert:=1;
          angl:=(pcy-y+5)/rast;
          angl2:=-arcsin(angl)*180/pi;
          end;

          if (pcx>x+5) and (pcy<y+5) then
          begin
          chetwert:=3;
          angl:=(y+5-pcy)/rast;
          angl2:=sin(angl)*180/pi;
          end;

          if (pcx<x+5) and (pcy<y+5) then
          begin
          chetwert:=4;
          angl:=(y+5-pcy)/rast;
          angl2:=180-arcsin(angl)*180/pi;
          end;

          if (pcx<x+5) and (pcy<y+5) then
          begin
          chetwert:=2;
          angl:=(pcy-y+5)/rast;
          angl2:=180+arcsin(angl)*180/pi;
          end;


 
Yar-Com   (2004-04-29 13:49) [1]


type
    TVector = record
      x,y,z : Single;
    end;

    TRaketa = class
    Force, Velocity, Position : TVector;
    Mass : Single;
    procedure Integrate(dt : Single);
    procedure AddForce(AForce : TVector);
    end;
       
procedure TRaketa.Integrate(dt:single);
begin
    Position := VectorAdd(Position, VectorScale(Velocity, dt));
    Velocity := VectorAdd(Velocity, VectorScale(Force, dt/ Mass));
    Force := MakeVector(0,0,0);
end;
procedure AddForce(AForce : TVector);
begin
   Force := VectorAdd(Force, AForce);
end;

....................................
var
   Ray : TVector;
   RayLen : Single;
begin
   for i := 0  to PlanNum - 1 do
   begin
    Ray := VectorSubtract(Plane[i].Position, Rocket.Position);
    RayLen := VectorLength(Ray);
    Ray := VectorNormalize(Ray);
    Fs := G * Rocket.Mass * Planet[i].Mass / RayLen;
    Rocket.AddForce(VectorScale(Ray,Fs));
   end;
   Rocket.Integrate(0.001);
end;


Я бы как-нибуть так сделал, все просто и понятно.

PS все что тут написано не проверял, могут быть баги :)


 
xman ©   (2004-05-02 20:50) [2]

У меня Delphi 3. vectorAdd не понимает
есть какието еще идеи или может нужно какойто модуль подключать?



Страницы: 1 вся ветка

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.025 c
8-1085346895
AGGRESSOR
2004-05-24 01:14
2004.08.15
SndVol32 в WinXP


1-1091423305
Марат
2004-08-02 09:08
2004.08.15
Ehlib


3-1090480287
SergP
2004-07-22 11:11
2004.08.15
LEFT JOIN. Как Null "преобразовать" в 0?


14-1090837506
Snip
2004-07-26 14:25
2004.08.15
Подарок на д.р.


14-1091092961
Layner
2004-07-29 13:22
2004.08.15
Вирусы на Delphi есть?