Главная страница
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.035 c
1-1091454776
mr.Tim
2004-08-02 17:52
2004.08.15
Как ожидать завершения всех TThread ?


1-1091527866
GanibalLector
2004-08-03 14:11
2004.08.15
Word (увеличение шрифта)


6-1087201621
Apocalepse
2004-06-14 12:27
2004.08.15
Передача текста. Срочно!!! Подалуйста.


1-1091190213
johny
2004-07-30 16:23
2004.08.15
Как заставить маргать кнопку на панели задачь


1-1091186987
Вика
2004-07-30 15:29
2004.08.15
пересечения диапазонов