Главная страница
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.028 c
4-1088605120
Paulik
2004-06-30 18:18
2004.08.15
Странность в работе с DLL под Delphi и Visual Basic


14-1090519291
DSKalugin
2004-07-22 22:01
2004.08.15
скоро Internet Explorer закроют :-)))


14-1091188408
Tuzemec
2004-07-30 15:53
2004.08.15
ищу TASM 5.0 или страрше


1-1091528706
Alexey Morceleb
2004-08-03 14:25
2004.08.15
Создание элемента управления из dll


1-1091030683
Bloody-Wolf
2004-07-28 20:04
2004.08.15
Определение имени диска