214 lines
4.6 KiB
ObjectPascal
214 lines
4.6 KiB
ObjectPascal
unit frameluna;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Forms, Controls, ExtCtrls, StdCtrls, astronomy, DateUtils;
|
|
|
|
|
|
function OttieniRisorsa(faseluna:double):string;
|
|
function DateToLabel(Data:TDateTime):string;
|
|
|
|
type
|
|
|
|
{ TLunaView }
|
|
|
|
TLunaView = class(TFrame)
|
|
GroupBox1: TGroupBox;
|
|
Image1: TImage;
|
|
SizeLuna: TLabel;
|
|
PicFase1: TImage;
|
|
PicFase2: TImage;
|
|
PicFase3: TImage;
|
|
PicFase4: TImage;
|
|
Label1: TLabel;
|
|
Fase1: TLabel;
|
|
Fase2: TLabel;
|
|
Fase3: TLabel;
|
|
Fase4: TLabel;
|
|
Panel1: TPanel;
|
|
Panel2: TPanel;
|
|
procedure ImpostaDataClick(Sender: TObject; Data:TDateTime; orariosimulazione:byte);
|
|
|
|
type
|
|
TFase= (lunanuova, primoquarto, lunapiena, ultimoquarto);
|
|
TFaseLuna=record
|
|
tempo:TDateTime;
|
|
fase:byte; //0=luna nuova 1=primo quarto, 2=piena, 3=ultimo quarto.
|
|
end;
|
|
|
|
|
|
|
|
private
|
|
|
|
public
|
|
|
|
end;
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
{ TLunaView }
|
|
|
|
var
|
|
percriduzioneluna:double; //descrive quanto è più piccola la luna rispetto alla luna più vicina
|
|
|
|
|
|
procedure TLunaView.ImpostaDataClick(Sender: TObject; Data:TDateTime; orariosimulazione:byte);
|
|
var
|
|
illuminazione1:byte;
|
|
lunadati:TDatiLuna;
|
|
|
|
|
|
|
|
astrotime:astro_time_t;
|
|
tempoastrofase:astro_moon_quarter_t;
|
|
|
|
i:byte=0;
|
|
elementi: TFaseLuna;
|
|
datefasi: array [0..3] of TFaseLuna;
|
|
risorsa:string; //stringa della lazarus resource delle foto
|
|
testolabel:string; //testo sotto le immagini
|
|
faseluna:double;
|
|
datadati:TDateTime; //questa è la data che si usa per le simulazioni differisce da Data per il valore di orariosimulazione
|
|
begin
|
|
astrotime:= astronomy.TDateTimeToAstroTime(Data);
|
|
datadati:= DateUtils.IncHour(Data,orariosimulazione);
|
|
//mostra l'illuminazione all'orario impostato nelle impostazioni
|
|
faseluna:=FaseLunare(datadati);
|
|
lunadati:=DistanzaLuna(datadati);
|
|
illuminazione1:= round(IlluminazioneLuna(faseluna));
|
|
|
|
Label1.Caption:='Illuminazione '+inttostr(illuminazione1)+'%'+' Distanza '+inttostr(lunadati.distanzakm)+'Km';
|
|
SizeLuna.Caption:=SysUtils.FormatFloat('0.000',lunadati.diametrogradi)+'°';
|
|
|
|
percriduzioneluna:= lunadati.diametrogradi/0.568;
|
|
|
|
|
|
risorsa:=OttieniRisorsa(faseluna);
|
|
Image1.Picture.PNG.LoadFromResourceName(HInstance, risorsa);
|
|
|
|
tempoastrofase:=astronomy.Astronomy_SearchMoonQuarter(astrotime);
|
|
datefasi[0].tempo:=astronomy.AstroTimeToTDateTime(tempoastrofase.time);
|
|
datefasi[0].fase:=tempoastrofase.quarter;
|
|
repeat
|
|
i:=1+i;
|
|
|
|
tempoastrofase:=astronomy.Astronomy_NextMoonQuarter(tempoastrofase);
|
|
datefasi[i].tempo:=astronomy.AstroTimeToTDateTime(tempoastrofase.time);
|
|
datefasi[i].fase:=tempoastrofase.quarter;
|
|
until i=3;
|
|
|
|
i:=0;
|
|
for elementi in datefasi do
|
|
begin
|
|
|
|
{ case elementi.fase of
|
|
0: risorsa:='LUNANUOVA_SMALL';
|
|
1: risorsa:='PRIMOQUARTO_SMALL';
|
|
2: risorsa:='LUNAPIENA_SMALL';
|
|
3: risorsa:='ULTIMOQUARTO_SMALL';
|
|
end; }
|
|
|
|
case elementi.fase of
|
|
0: risorsa:='01';
|
|
1: risorsa:='09';
|
|
2: risorsa:='15';
|
|
3: risorsa:='23';
|
|
end;
|
|
|
|
|
|
// testolabel:= FormatDateTime('dd mmmm', elementi.tempo);
|
|
testolabel:= DateToLabel(elementi.tempo);
|
|
|
|
|
|
|
|
case i of
|
|
0:
|
|
begin
|
|
PicFase1.Picture.PNG.LoadFromResourceName(HInstance, risorsa);
|
|
Fase1.Caption:=testolabel;
|
|
end;
|
|
|
|
1:
|
|
begin
|
|
PicFase2.Picture.PNG.LoadFromResourceName(HInstance, risorsa);
|
|
Fase2.Caption:=testolabel;
|
|
end;
|
|
|
|
2:
|
|
begin
|
|
PicFase3.Picture.PNG.LoadFromResourceName(HInstance, risorsa);
|
|
Fase3.Caption:=testolabel;
|
|
end;
|
|
|
|
3:
|
|
begin
|
|
PicFase4.Picture.PNG.LoadFromResourceName(HInstance, risorsa);
|
|
Fase4.Caption:=testolabel;
|
|
end;
|
|
end;
|
|
|
|
i:=i+1;
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function OttieniRisorsa(faseluna:double):string;
|
|
begin
|
|
if faseluna<=180 then OttieniRisorsa:=Format('%.2d' ,[round(1+faseluna*0.0833333333)]);
|
|
if faseluna>=180 then OttieniRisorsa:=Format( '%.2d', [round(16+(faseluna-180)*0.0833333333)]);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
function DateToLabel(Data:TDateTime):string;
|
|
var
|
|
mese:string;
|
|
numero:string;
|
|
begin
|
|
|
|
numero:=SysUtils.FormatCurr('00', DayOf(Data));
|
|
case MonthOf(Data) of
|
|
1: mese:='Gennaio';
|
|
2: mese:='Febbraio';
|
|
3: mese:='Marzo';
|
|
4: mese:='Aprile';
|
|
5: mese:='Maggio';
|
|
6: mese:='Giugno';
|
|
7: mese:='Luglio';
|
|
8: mese:='Agosto';
|
|
9: mese:='Settembre';
|
|
10: mese:='Ottobre';
|
|
11: mese:='Novembre';
|
|
12: mese:='Dicembre';
|
|
|
|
end;
|
|
|
|
result:= numero+' '+mese;
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end.
|
|
|
|
|
|
|
|
|