{ Csillagászati segédfüggvények }
 unit STAF_AstroUnit; 
interface
Uses
   SysUtils, WinTypes, WinProcs, Messages, Classes,
   Graphics, Szoveg, Szamok, Math;
Type
 TRaRect = record
   h : integer; {óra}
   m : integer; {perc}
   s : real; {ivmásodperc}
   end;
 TDeRect = record
   Pozitiv : boolean;
   f : integer; {fok}
   m : integer; {ívperc}
   s : real; {ivmásodperc}
   end;
 TGeoKoord = record
   lambda: real; {hosszúság}
   fi : real; {szélesség}
   end;
 // Base datas of CCD optical instrument by made astrophoto
   TOpticRecord = packed record
   oOwner : string[20]; // Name of Owner
   oInstrument : string[20]; // Name of instrument
   oFocus : integer; // Optical focus of objectiv in mm
   oCCDx : double; // CCD x diameter in mm
   oCCDy : double; // CCD y diameter in mm
   oCCDPixelSize: double; // CCD Pixels diameter in mm
   PixelPerSec : double; // 1 pixel = arcsec
   SecPerPixel : double; // 1" = pixel 
   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;
   Function Detostr(de:TDerect):string;
Function sgn(x:Double):integer ;
   Function ARToStr_(ar: Double) : string;
   Function DEToStr_(de: Double) : string;
   Function StrToAr_De(ar: string) : Double;
   function CielCoordToCoord(CielCoord: string): string;
//function TimeStrToTime(tStr: string): TDateTime;
{Ra rekordból idő}
   Function RatoDateTime(ra:TRarect):TDateTime;
function PixToMm(focus,d: double): double;
   function PixToSec(focus,d: double): double;
   function PixelPerAngle(focus,PixelSizeX: double): double;
procedure SaveOpticList(iniFile: String);
   procedure LoadOpticList(iniFile: String);
{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;
 
implementation
Function sgn(x:Double):integer ;
   begin
   if x<0 then
   sgn:= -1
   else
   sgn:= 1 ;
   end ;
Function ARToStr_(ar: Double) : string;
   var dd,min1,min,sec: Double;
   begin
   dd := Trunc(ar);
   min1:= Frac(ar)*60;
   if min1>=59.999 then begin
   dd:=dd+sgn(ar);
   min1:=0.0;
   end;
   min := Trunc(Abs(min1));
   sec:= Abs(min1-min)*60;
   if sec>=59.95 then begin
   min:=min+1;
   sec:=0.0;
   end;
   Result := Format('%.2d',[Trunc(dd)])+':'+Format('%.2d',[Trunc(min)])
   +':'+Format('%.1f',[sec]);
   end;
Function DEToStr_(de: Double) : string;
   var dd,min1,min,sec: Double;
   begin
   dd := Abs(de);
   min1:= Frac(de)*60;
   (* if min1>=59.999 then begin
   dd:=dd+sgn(de);
   min1:=0.0;
   end;*)
   min := Trunc(Abs(min1));
   sec:= (Abs(min1)-Abs(min))*60;
   (* if sec>=59.95 then begin
   min:=min+1;
   sec:=0.0;
   end;*)
   Result := Format('%.2d',[Trunc(dd)])+':'+Format('%.2d',[Trunc(min)])
   +':'+Format('%.2d',[Round(sec)]);
   if de>0 then Result := '+'+Result;
   if de<0 then Result := '-'+Result;
   end;
// A -hh:mm:ss alakú stringből real értéket számít
   Function StrToAr_De(ar: string) : Double;
   var h,m,s: integer;
   SgnValt : integer; // Előjel jelzése
   arStr: string;
   begin
   Result := 0;
   arStr := Trim(ar);
   SgnValt:=1;
   If Pos('-',arStr)=1 then begin
   SgnValt:= -1;
   arStr := Copy(arStr,2,1000);
   end;
   If Pos('+',arStr)=1 then begin
   SgnValt:= 1;
   arStr := Copy(arStr,2,1000);
   end;
   If Length(arStr)=8 then begin
   h:=StrToInt(Copy(arStr,1,2));
   m:=StrToInt(Copy(arStr,4,2));
   s:=StrToInt(Copy(arStr,7,2));
   Result := h+m/60+s/3600;
   end;
   end;
// RA: 18h28m41.83s DEC:-13°28'21.8" FOV:+80°00'00" to 18:28:41.83 -13:28:21.8
   function CielCoordToCoord(CielCoord: string): string;
   var h,m,s1,f,p,s2 : string;
   x,mp : integer;
   begin
   Decimalseparator := '.';
   h := Copy(CielCoord,5,2);
   m := Copy(CielCoord,8,2);
   s1:= Copy(CielCoord,11,5); s1[3]:='.';
   f := Copy(CielCoord,22,3);
   p := Copy(CielCoord,26,2);
   s2:= Copy(CielCoord,29,4); s2[3]:='.';
   x := Round(StrToFloat(s1));
   mp:= Round(StrToFloat(s2));
   s1:= Format('%.2d',[Trunc(x)]);
   s2:= Format('%.2d',[Trunc(mp)]);
   Result := h+':'+m+':'+s1+' '+f+':'+p+':'+s2;
   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
   Pozitiv := de>0;
   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 Detostr(de:TDerect):string;
   begin
   Result := Inttostr(de.f)+'* '+Inttostr(de.m)+''' '+Format('%4.1f',[de.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;
function GetPixelPerMM( CCDd: double; Focus: double ): double;
   // A CCD chip méretei (CCDd mm-ben) alapján meghatározza egy
   // pixel méretét mm-ben
   begin
   end;
function PixToMm(focus,d: double): double;
   // Az optika fókusza(mm) alapján kiszámítja a távolságot mm-ben
   // d=távolság a felvételenpixelben;
   begin
   end;
function PixToSec(focus,d: double): double;
   // Az optika fókusza alapján kiszámítja a távolságot ''(ívmásodpercben)
   // d=távolság a felvételen pixelben;
   begin
   Result := 3600*RadToDeg(ArcTan2(d,focus));
   end;
function PixelPerAngle(focus,PixelSizeX: double): double;
   // A felvétel 1 pixelére leképzett égbolt részlet szögmérete ''-ben
   begin
   Try
   Result := 0;
   if PixelSizeX<>0 then
   Result := 3600*RadToDeg(ArcTan2(PixelSizeX,focus));
   except
   Result := 0;
   end;
   end;
procedure SaveOpticList(iniFile: String);
   //Save optic/CCD list to INI file
   begin
   end;
procedure LoadOpticList(iniFile: String);
   //Load optic/CCD list from INI file
   begin
   end;
 
initialization
   DecimalSeparator:='.';
   ShortDateFormat:='yy.mm.dd';
   LongDateFormat:='yyyy.mm.dd';
   TimeSeparator:=':';
   end.