Astro

Top  Previous  Next

 

{ Csillagászati segédfüggvények }

unit Astro;

 

interface

 

Uses

SysUtils, Windows, Messages, Classes, Graphics;

 

Type

 

TRaRect = record

   h : integer;  {óra}

   m : integer;  {perc}

   s : real;     {ivmásodperc}

end;

 

TDeRect = record

   f : integer;  {fok}

   m : integer;  {ívperc}

   s : real;     {ivmásodperc}

end;

 

TEQCoord = record

   Ra : double;  // in degree

   De : double;  // in degree

end;

 

TEQCoordStr = record

   Ra : String;

   De : String;

end;

 

TGeoKoord = record

   lambda: real;  {hosszúság}

   fi    : real;  {szélesség}

end;

 

var year,month,day : word;

   UTDiff : integer;     {eltérés a vilkágidőtől (BP-en = +1 óra)}

 

Const

 

  {1 Csillagnap = 23h 56m 4,09054s középidőben}

  csillagnapora  : real = 23+56/60+4.09054/3600;

  csillagnapperc : real = 23*60+56+4.09054/60;

  csillagnapmp   : real = 23*3600+56*60+4.09054;

 

  kozepnapora    : byte = 24;

  kozepnapperc   : real = 24*60;

  kozepnapmp     : real = 24*3600;

 

 

{Az h,m,s formátumú Ra értéket fokokká alakítja (1h=15fok)}

Function RaToReal(h,m:integer;s:real):real;

{A fokokban megadott Ra-t h,m,s formára alakítja}

Function RealToRa(ra:real):TRarect;

Function DeToReal(f,m:integer;s:real):real;

{A fokokban megadott De-t fok,m,s formára alakítja}

Function RealToDe(de:real):TDerect;

{Az fok,m,s formátumú De értéket fokokká alakítja}

Function Ratostr(ra:TRarect):string; overload;

Function Ratostr(ra:double):string; overload;

Function Detostr(de:TDerect):string; overload;

Function Detostr(de:double):string; overload;

 

{Ra rekordból idő}

Function RaToDateTime(ra:TRarect):TDateTime;

 

{A megfigyelőhely csillagidejének meghatározása:

  In: kido = kozépidő [óra],

      fi   = földrajzi hosszúság}

Function KozepidoToCsillagido(kido:TDatetime;fi:real):TRarect;

Function Szokoev(ev:integer):boolean;

 

Function sgn(x:Double):Double ;

 

implementation

 

Function sgn(x:Double):Double ;

begin

if x<0 then

  sgn:= -1

else

  sgn:=  1 ;

end ;

 

Function RaToReal(h,m:integer;s:real):real;

begin

Result:=15*(h+m/60+s/3600);

end;

 

Function RealToRa(ra:real):TRarect;

begin

With Result do begin

   h := Trunc(Ra/15);

   m := Trunc(60*(ra-15*h)/15);

   s := 60*Frac(60*(ra-15*h)/15);

end;

end;

 

Function DeToReal(f,m:integer;s:real):real;

begin

If f>=0 then Result:=f+m/60+s/3600

else Result:=f-m/60-s/3600;

end;

 

Function RealToDe(de:real):TDerect;

begin

With Result do begin

   f := Trunc(de);

   m := Abs(Trunc(60*Frac(de)));

   s := Abs(60*Frac(60*Frac(de)));

end;

end;

 

Function Ratostr(ra:TRarect):string;

begin

Result := Inttostr(ra.h)+'h '+Inttostr(ra.m)+'m '+Format('%4.1f',[ra.s])+'s';

end;

 

Function Ratostr(ra:double):string;

var dd,min1,min,sec: Double;

   d,m,s : string;

begin

   dd:=Int(ra);

   min1:=abs(ra-dd)*60;

   if min1>=59.999 then begin

      dd:=dd+sgn(ra);

      min1:=0.0;

   end;

   min:=Int(min1);

   sec:=(min1-min)*60;

   if sec>=59.95 then begin

      min:=min+1;

      sec:=0.0;

   end;

   str(dd:2:0,d);

   if abs(dd)<10 then d:='0'+trim(d);

   str(min:2:0,m);

   if abs(min)<10 then m:='0'+trim(m);

   str(sec:2:0,s);

   if abs(sec)<9.95 then s:='0'+trim(s);

   result := d+':'+m+':'+s+':';

end;

 

Function Detostr(de:TDerect):string;

begin

Result := Inttostr(de.f)+'* '+Inttostr(de.m)+''' '+Format('%4.1f',[de.s])+'"';

end;

 

Function Detostr(de:double):string;

var dd,min1,min,sec: Double;

   d,m,s : string;

begin

   dd:=Int(de);

   min1:=abs(de-dd)*60;

   if min1>=59.99 then begin

      dd:=dd+sgn(de);

      min1:=0.0;

   end;

   min:=Int(min1);

   sec:=(min1-min)*60;

   if sec>=59.5 then begin

      min:=min+1;

      sec:=0.0;

   end;

   str(abs(dd):2:0,d);

   if abs(dd)<10 then d:='0'+trim(d);

   if de<0 then d:='-'+d else d:='+'+d;

   str(min:2:0,m);

   if abs(min)<10 then m:='0'+trim(m);

   str(sec:2:0,s);

   if abs(sec)<9.5 then s:='0'+trim(s);

   result := d+'°'+m+chr(39)+s+'"';

end;

 

{Ra rekordból idő}

Function RaToDateTime(ra:TRarect):TDateTime;

begin

Result := EncodeTime(ra.h,ra.m,Trunc(ra.s),0);

end;

 

Function KozepidoToCsillagido(kido:TDatetime;fi:real):TRarect;

var dat1,dat2: TDateTime;

   elteltnap : real;

   alapido,maradek,d : real;

begin

{Az adott középidőre meghatározzuk a Grewnichi helyi időt}

{1986.09.22-én 0h világidőkor a csillagidő = 0h 02m 14.8s volt,

1. meg kell határozni az azóta eltelt napok számát,

2. az így kapott középnapok számát át kell számítani csillagnapba,

    a maradék rész adja a csillagidőt}

UTDiff := Trunc(fi/15);

dat1 := StrToDatetime('1986.09.22 00:00:00');

dat2 := kido-UTDiff/24;

elteltnap := dat2 - dat1;

maradek := Frac(elteltnap*(24.00000/csillagnapora)+UTDiff/24);

alapido:=Ratoreal(0,2,14.8);

d:=15*24*maradek;

Result := RealToRa(alapido+d);

end;

 

Function Szokoev(ev:integer):boolean;

begin

Result := (ev mod 4)=0;

end;

 

initialization

DecimalSeparator:='.';

ShortDateFormat:='yy.mm.dd';

LongDateFormat:='yyyy.mm.dd';

TimeSeparator:=':';

end.