Показать сообщение отдельно
  #2  
Старый 25.12.2011, 16:16
mmmm mmmm вне форума
Прохожий
 
Регистрация: 25.12.2011
Сообщения: 3
Репутация: 10
По умолчанию

2юнит:
PHP код:
unit Unit2_1512;

interface

uses
   Messages
;
const
(**)  
TwoPi Pi;
  
RE =    6371.21;    //средний радиус Земли км
  
ToRad Pi/180;     // Deg2Rad =
  
ToGrad 180/Pi;    // Rad2Deg
  
Mu 0.398603e6;   // ГПЗ
(**)  We 7.2921151467e-5// Угловая скорость вращения Земли (ср солн сут)
(**)  JD2000 2451545.0// юлианская дата эпохи 2000 г., январь 1.5. (1 января 12 час)

  
wm_DrawChart wm_User 1;

type

  T3DVector 
record
                 X
Yreal;
              
end;

  
T3DMatrix = array[1..31..3of real;

  
TGeo record
            Pos 
T3DVector;    // положение ГСК
            
RLongitudeLatitude,alfa real  // радиус, долгота, широта
          
end;

  
TClassic record
               Rp
eArgLatInclAscNodeArgPerigeereal
              end
;

  
TCartesian record
                 Pos
T3DVector;  // АГЭСК ( положение )
                 
Vel T3DVector;  // АГЭСК ( скорость )
               
end;

  
POrbit = ^TOrbit;    {New}
  
TOrbit record
                Epoch 
TDateTime// Дата и время начальных условий
                
Time  real;      // Собственное время КА (c)
              
Classic TClassic;
              
Cartes  TCartesian;
              
Geo     TGeo       // ГСК  ( положение, долгота и широта )
           
end;

  
// Векторная алгебра

function ScalProdAT3DVector ) : real;
function 
SummaAT3DVector ) : T3DVector;
function 
DifferAT3DVector ) : T3DVector;
function 
ModulT3DVector ): real;
function 
UnitVect T3DVector ): T3DVector;
function 
InitVectXYreal) : T3DVector;
function 
ZeroVect T3DVector;
function 
MxVT3DMatrixT3DVector) : T3DVector;

(**) function 
MAbs_GeoValue real ) : T3DMatrix// матрица перехода АГЭСК->ГСК

// Вычисление декартовых координат КА по классическим элементам
procedure ClassToXYZ( var AOrbit TOrbit );

// Вычисление координат КА в земной СК

// Вычисление истинной аномалии КА
function TrueAnomalyAOrbit TOrbit ) : real;

// Вычисление параметра эллипса р
function ParameterAOrbit TOrbit ) : real;

// Вычисление радиус-вектора КА (r)
function RadiusAOrbit TOrbit ) : real;

// Вычисление среднего движения (n)
function MeanMotionAOrbit TOrbit ) : real;

// Вычисление периода обращения (Т)
function PeriodAOrbit TOrbit ) : real;

//  Вычисление радиальной скорости КА Vr
function VRadialAOrbit TOrbit ) : real;

// Вычисление большой полуоси орбиты  (км)
function SemiMajorAxisAOrbit TOrbit ) : real;

// Вычисление эксцентрической аномалии (рад)
function EccentrAnomaly AOrbit TOrbit ): real;

// Вычисление средней аномалии (рад)
function MeanAnomaly AOrbit TOrbit ): real;

// Вычисление момента времени прохождения перигея  (с)
function PerigeePassTimeAOrbit TOrbit ) : real;

function 
KeplerEquation(const e,real):real;

procedure SetTimeATime real; var AOrb TOrbit);  overload;

procedure SetTimeATime real;  IniOrb TOrbit; var AOrb TOrbit);  overload;

function  
SetTimeFATime realIniOrb TOrbit ) : TOrbit;

(**)function 
SiderialTime0Value TDateTime ) : real// 0h дата
(**)function SiderialTime Value TDateTime ) : real// UTC дата+время
//procedure urTrassa(Value:TDateTime ; Orbit:TOrbit; var lat,long,long_ekv:double);
procedure NIP (var Nip:TGeo);
procedure ugolMesta (var alfa:real);
procedure DecKoord(var Nip:TGeo);

implementation

uses
  Math
,
  
SysUtils,
(**)  
DateUtils;   {!!!}

var
  
Pos,razn T3DVector;
  
Orb TClassic;

function 
ScalProdAT3DVector ) : real;
begin
  Result 
:= A.B.A.B.A.B.Z;
end;

function 
SummaAT3DVector ) : T3DVector;
begin
  Result
.:= A.B.X;
  
Result.:= A.B.Y;
  
Result.:= A.B.Z;
end;

function 
DifferAT3DVector ) : T3DVector;
begin
  Result
.:= A.B.X;
  
Result.:= A.B.Y;
  
Result.:= A.B.Z;
end;

function 
ModulT3DVector ): real;
begin
  Result 
:= SqrtSqr(A.X) + Sqr(A.Y) + Sqr(A.Z));
end;

function 
UnitVect T3DVector ): T3DVector;
var
  
real;
begin
  R 
:= Modul(A);
  if 
R<>0 then
  begin
    R 
:= 1/R;
    
Result.:= A.R;
    
Result.:= A.R;
    
Result.:= A.R;
  
end else
  
begin
  end
;
end;

function 
InitVectXYreal) : T3DVector;
begin
  Result
.:= X;
  
Result.:= Y;
  
Result.:= Z;
end;

function 
ZeroVect T3DVector;
begin
  Result 
:= InitVect(0,0,0);
end;

function 
MxVT3DMatrixT3DVector) : T3DVector;
begin
  Result
.:= M[1,1] * V.M[1,2] * V.M[1,3] * V.Z;
  
Result.:= M[2,1] * V.M[2,2] * V.M[2,3] * V.Z;
  
Result.:= M[3,1] * V.M[3,2] * V.M[3,3] * V.Z;
end;

function 
MAbs_GeoValue real ) : T3DMatrix// матрица перехода АГЭСК->ГСК
begin
  FillChar
ResultSizeOf(T3DMatrix), 0);
  
Result[1,1] := CosValue );
  
Result[1,2] := SinValue );
  
Result[2,1] := - Result[1,2];
  
Result[2,2] := Result[1,1];
  
Result[3,3] := 1;
end;

function 
TrueAnomalyAOrbit TOrbit ) : real;
var
  
real;
begin
(**)
  
:=  AOrbit.Classic.ArgLat AOrbit.Classic.ArgPerigee;
  if 
0 then r := TwoPi r;
  
Result := r;
end;

function 
Parameter AOrbit TOrbit ) : real;
begin
  Result 
:= AOrbit.Classic.Rp * ( AOrbit.Classic.);
end;

function 
RadiusAOrbit TOrbit ) : real;
begin
  Result 
:= ParameterAOrbit ) / ( AOrbit.Classic.CosTrueAnomaly(AOrbit) ));
end;

function 
MeanMotionAOrbit TOrbit ) : real;
begin
  Result 
:= SqrtMu ParameterAOrbit )) / SqrRadiusAOrbit ));
end;

function 
PeriodAOrbit TOrbit ) : real;
begin
  Result 
:= TwoPi MeanMotionAOrbit );
end;

function 
VRadialAOrbit TOrbit ) : real;
begin
  Result 
:= SqrtMu/Parameter(AOrbit) ) * AOrbit.Classic.SinTrueAnomalyAOrbit ) );
end;

function 
SemiMajorAxisAOrbit TOrbit ) : real;
var
  
real;
begin
  x 
:= Mu SqrMeanMotionAOrbit ) );
  
Result := Power x1/);
end;

function 
EccentrAnomaly AOrbit TOrbit ): real;
var
  
vereal;
begin
  v 
:= TrueAnomalyAOrbit );
  
:= AOrbit.Classic.e;
(**)
  
:= ArcTanSqrt((1-e)/(1+e)) * Tan0.5 ));
  if 
0 then r := TwoPi ;
  
Result := r;
end;

function 
MeanAnomalyAOrbit TOrbit ) : real;
var
  
Ereal;
begin
  E 
:= EccentrAnomalyAOrbit );
(**)
  
:= AOrbit.Classic.Sin);
  if 
0 then r := TwoPi r;
  
Result := r;
end;

function 
PerigeePassTimeAOrbit TOrbit ) : real;
begin
  Result 
:= - MeanAnomalyAOrbit ) / MeanMotionAOrbit );
end;

procedure ClassToXYZ( var AOrbit TOrbit );
var
  
SuSoSiCuCoCi,
  
Vr_rrnreal;
(**) 
// Внутренния процедура расчета положения КА в ГСК
  
procedure _ToGeo ;
  var
    
SClSl real;
    
TDateTime;
    
T3DMatrix;
  
begin
    t 
:= AOrbit.Epoch AOrbit.Time 86400 ;
    
:= SiderialTime);
    
:= MAbs_Geo);
    
AOrbit.Geo.Pos := MxVMAOrbit.Cartes.Pos );
    
AOrbit.Geo.:= ModulAOrbit.Geo.Pos) ;
    
:= SqrtSqrAOrbit.Geo.Pos.) +  SqrAOrbit.Geo.Pos.) );
    
Sl := AOrbit.Geo.Pos.;
    
Cl := AOrbit.Geo.Pos.;
    
AOrbit.Geo.Latitude := ArcSinAOrbit.Geo.Pos.AOrbit.Geo.); // Широта
    
case Sl 0 of
      true 
AOrbit.Geo.Longitude := ArcCosCl );       // Долгота
      
falseAOrbit.Geo.Longitude := - ArcCosCl );
    
end;
  
end;
begin
    r 
:= RadiusAOrbit );
   
rn := MeanMotionAOrbit );
  
Vr_r := VradialAOrbit) / r;

    
Su := SinAOrbit.Classic.ArgLat);
    
Cu := CosAOrbit.Classic.ArgLat);

    
So:= SinAOrbit.Classic.AscNode);
    
Co := CosAOrbit.Classic.AscNode);

    
Si := SinAOrbit.Classic.Incl);
    
Ci := CosAOrbit.Classic.Incl);

    
AOrbit.Cartes.Pos.:= * ( Cu Co Su So Ci );
    
AOrbit.Cartes.Pos.:= * ( Cu So Su Co Ci );
    
AOrbit.Cartes.Pos.:= Su Si;

    
AOrbit.Cartes.Vel.:= Vr_r AOrbit.Cartes.Pos.X
                           
rn * (Su Co Cu Co Ci);
    
AOrbit.Cartes.Vel.:= Vr_r AOrbit.Cartes.Pos.Y
                           
rn * (Su Co Cu Co Ci);
    
AOrbit.Cartes.Vel.:= Vr_r AOrbit.Cartes.Pos.Z
                           
-rn Cu Si;
    
_ToGeo;  // Вычислить координаты в ГСК
end;

function 
KeplerEquation(const e,real):real;
Решение уравнения Кеплера в цикле repeat }
const
   
Eps 1e-9;
var
  
Eold,Enew real;
  
Stop boolean;
begin
  Eold 
:= M;
repeat
    Enew 
:= Sin(Eold);
    
Stop := Abs(Eold-Enew)<=Eps;
    
Eold := Enew;
  
until Stop;
  
Result := Enew;
end;

(**) 
// Служебная функция - вычисляет аргумент широты на заданный момент времени
function GetArgLatATime realAOrb TOrbit ) : real;
var
  
MEvreal;
  
integer;
begin
 
// Вычислить среднюю аномалию в момент времени Time
  
:= MeanMotionAOrb ) * ( ATime PerigeePassTimeAOrb ) );
  
// решаем ур-е Кеплера
  
:= KeplerEquationAOrb.Classic.e);
  
// находим истинную аномалию
  
:= ArcTan(Sqrt((1-AOrb.Classic.e)/(1+AOrb.Classic.e))*Tan(0.5*E));
  
//привести v к интервалу 0..2пи
  
if 0 then v := TwoPi v;
 
// Вычисляем новый аргумент широты
  
:= AOrb.Classic.ArgPerigee;
 
// Привести к интервалу 0..2Pi
  
:= TruncTwoPi ); // целое число периодов
  
Result := TwoPi;
end
Ответить с цитированием