Upload files to "/"
This commit is contained in:
55
framegrafico.lfm
Normal file
55
framegrafico.lfm
Normal file
@@ -0,0 +1,55 @@
|
||||
object PianetiGraph: TPianetiGraph
|
||||
Left = 0
|
||||
Height = 330
|
||||
Top = 0
|
||||
Width = 775
|
||||
ClientHeight = 330
|
||||
ClientWidth = 775
|
||||
LCLVersion = '4.4.0.0'
|
||||
TabOrder = 0
|
||||
OnMouseLeave = FrameMouseLeave
|
||||
DesignLeft = 343
|
||||
DesignTop = 10
|
||||
object PaintBox1: TPaintBox
|
||||
AnchorSideLeft.Control = Owner
|
||||
AnchorSideTop.Control = Owner
|
||||
AnchorSideRight.Control = Owner
|
||||
AnchorSideRight.Side = asrBottom
|
||||
AnchorSideBottom.Control = Owner
|
||||
AnchorSideBottom.Side = asrBottom
|
||||
Left = 5
|
||||
Height = 300
|
||||
Top = 5
|
||||
Width = 765
|
||||
HelpType = htKeyword
|
||||
Anchors = [akTop, akLeft, akRight, akBottom]
|
||||
BorderSpacing.Bottom = 20
|
||||
BorderSpacing.Around = 5
|
||||
Color = clForm
|
||||
Font.Height = -15
|
||||
Font.Name = 'Monospace'
|
||||
ParentColor = False
|
||||
ParentFont = False
|
||||
ParentShowHint = False
|
||||
ShowHint = True
|
||||
OnMouseMove = PaintBox1MouseMove
|
||||
OnPaint = PaintBox1Paint
|
||||
end
|
||||
object Label1: TLabel
|
||||
AnchorSideTop.Control = Owner
|
||||
AnchorSideRight.Control = Owner
|
||||
AnchorSideRight.Side = asrBottom
|
||||
AnchorSideBottom.Control = Owner
|
||||
AnchorSideBottom.Side = asrBottom
|
||||
Left = 769
|
||||
Height = 1
|
||||
Top = 329
|
||||
Width = 1
|
||||
Anchors = [akRight, akBottom]
|
||||
BorderSpacing.Right = 5
|
||||
Font.Color = clWhite
|
||||
Font.Height = -16
|
||||
Font.Name = 'Noto Sans'
|
||||
ParentFont = False
|
||||
end
|
||||
end
|
||||
406
framegrafico.pas
Normal file
406
framegrafico.pas
Normal file
@@ -0,0 +1,406 @@
|
||||
unit framegrafico;
|
||||
|
||||
{$mode ObjFPC}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, Forms, Controls, ExtCtrls, Astronomy, DateUtils, Graphics,
|
||||
StdCtrls, LResources;
|
||||
|
||||
|
||||
procedure calcolapianeti;
|
||||
function FormattaOraDaMinutiGiorno(minutigiorno:integer):string;
|
||||
|
||||
type
|
||||
|
||||
{ TPianetiGraph }
|
||||
|
||||
TPianetiGraph = class(TFrame)
|
||||
Label1: TLabel;
|
||||
PaintBox1: TPaintBox;
|
||||
procedure FrameMouseLeave(Sender: TObject);
|
||||
procedure ImpostaTempoClick(Sender: TObject; Tempo:TDateTime; lat, long:double);
|
||||
procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
|
||||
Y: Integer);
|
||||
procedure PaintBox1Paint(Sender: TObject);
|
||||
|
||||
private
|
||||
|
||||
public
|
||||
var colorform:TColor;
|
||||
end;
|
||||
|
||||
type
|
||||
TNomePianeta= (Sole, Luna, Mercurio, Venere, Marte, Giove, Saturno, Urano, Nettuno);
|
||||
TPianeta= record
|
||||
colore:Tcolor;
|
||||
sorge:integer; //minuti da inizio giornata
|
||||
tramonta:integer; //minuti da inizio giornata
|
||||
distanza:double; //distanza in unità astronomiche
|
||||
testo:string;
|
||||
isinsky: boolean; // variabile che dice se l'oggetto è nel cielo nel caso sia l'alba che il tramonto non siano ottenibili
|
||||
illumData:astro_illum_t;
|
||||
|
||||
case nome: TNomePianeta of //questo record genera i campi per il crepuscolo civile solo se il nome è Sole
|
||||
Sole: (civildawn, civildusk, nauticaldawn, nauticaldusk, astronomicaldawn, astronomicaldusk :integer);
|
||||
Luna, Mercurio, Venere, Marte, Giove, Saturno, Urano, Nettuno: ( );
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.lfm}
|
||||
|
||||
{ TPianetiGraph }
|
||||
|
||||
var
|
||||
//Array dei vari oggetti celesti $00090909
|
||||
oggetticelesti:array of TPianeta=
|
||||
(( colore: $003AE1FE; sorge: 0; tramonta: 0; distanza: 0; testo: 'Sole'; isinsky: False; illumData:(); nome: Sole; civildawn: 0; civildusk:0; nauticaldawn:0; nauticaldusk:0; astronomicaldawn:0; astronomicaldusk:0 ),
|
||||
( colore: $00EADBCD; sorge:0; tramonta: 0; distanza: 0; testo: 'Luna'; isinsky: False;illumData:(); nome: Luna;),
|
||||
( colore: $00A1D11D; sorge:0; tramonta: 0; distanza: 0; testo: 'Mercurio'; isinsky: False;illumData:(); nome: Mercurio;),
|
||||
( colore: $00D3D200; sorge:0; tramonta: 0; distanza: 0; testo: 'Venere'; isinsky: False;illumData:(); nome: Venere; ),
|
||||
( colore: $005352EE; sorge: 0; tramonta: 0; distanza: 0; testo: 'Marte'; isinsky: False;illumData:(); nome: Marte;),
|
||||
( colore: $00628EFF; sorge: 0; tramonta: 0; distanza: 0; testo: 'Giove'; isinsky: False;illumData:(); nome: Giove; ),
|
||||
( colore: $00439FFF; sorge: 0; tramonta: 0; distanza: 0; testo: 'Saturno'; isinsky: False;illumData:(); nome: Saturno;),
|
||||
( colore: $00FFA054; sorge: 0; tramonta: 0; distanza: 0; testo: 'Urano'; isinsky: False;illumData:(); nome: Urano;),
|
||||
( colore: $00CD275F; sorge: 0; tramonta: 0; distanza: 0; testo: 'Nettuno'; isinsky: False;illumData:(); nome: Nettuno;)
|
||||
);
|
||||
|
||||
oggetto:string;
|
||||
durataora:double;
|
||||
durataminuto:double;
|
||||
duratamezzora:double;
|
||||
durataorai:integer; //la durata ora per la variabile i
|
||||
orafine:integer;
|
||||
altezzarighe:double;
|
||||
|
||||
|
||||
//variabili di posizione
|
||||
latitudine:double;
|
||||
longitudine:double;
|
||||
altitudine:integer=500;
|
||||
|
||||
tempoinizio:TDateTime;//tempo di inizio della giornata coincide con le 0.0 della giornata corrente oppure quello impostato dall'utente
|
||||
isFirstTime:boolean=True;
|
||||
|
||||
const
|
||||
|
||||
xtesto=10;
|
||||
xgrafico=50; // cordinata x di inizio del grafico
|
||||
distrighetop=30;
|
||||
spesspianeti=13; //spessore righe sorgere e tramonto PianetiGraph
|
||||
aggpospianeti=2; //aggiusta la posizione del rettangolo PianetiGraph rispetto al testo
|
||||
ridpaint=60; //indica quanto è più piccolo in pixel il grafico (dal righello in poi) rispetto alla larghezza della paintbox
|
||||
|
||||
distrighellotop=25;
|
||||
altezzarighello=6;
|
||||
mezzorighello=5;
|
||||
roundrett=5; //arrottondamento angoli rettangoli
|
||||
|
||||
procedure TPianetiGraph.PaintBox1Paint(Sender: TObject);
|
||||
|
||||
|
||||
var
|
||||
i:integer=1;
|
||||
corpo:TPianeta;
|
||||
orafine2:integer;
|
||||
begin
|
||||
|
||||
|
||||
|
||||
|
||||
if isFirstTime then
|
||||
begin
|
||||
tempoinizio:=EncodeDate(YearOf(Now), MonthOf(Now), DayOf(Now));
|
||||
calcolapianeti;
|
||||
isFirstTime:=False;
|
||||
end;
|
||||
|
||||
|
||||
orafine:=PaintBox1.Width-ridpaint+xgrafico; //calcola gli ultimi pixel da rappresentare nel righello
|
||||
orafine2:=PaintBox1.Width-ridpaint;
|
||||
durataora:=(PaintBox1.Width-ridpaint)/24; //calcola il numero di pixel che sono rappresentati da un ora
|
||||
durataminuto:=durataora/60; //calcola il numero di pixel che rappresentano un minuto
|
||||
duratamezzora:=(PaintBox1.Width-ridpaint)/48;
|
||||
altezzarighe:=(PaintBox1.height/11); //calcola la distanza che vi è tra le diverse righe che rappresentano il sorg e il tramont dei PianetiGraph
|
||||
|
||||
PaintBox1.Canvas.Brush.Color:=colorform; //decide il colore di sfondo del canvas
|
||||
PaintBox1.Canvas.Font.Color:=clWhite; //mette il font bianco di default perchè cambia colore dal tema chiaro a scuro del sistema
|
||||
|
||||
for corpo in oggetticelesti do //scrive i nomi degli oggetti celesti e rettangoli
|
||||
begin
|
||||
PaintBox1.Canvas.Pen.Color:=clWhite;
|
||||
PaintBox1.Canvas.Font.Size:=11;
|
||||
PaintBox1.Canvas.TextOut(xtesto,round(altezzarighe*i+distRighetop), copy(corpo.testo,0,3));
|
||||
|
||||
|
||||
if corpo.nome= Sole then
|
||||
begin //i crepuscoli vanno messi in ordine dall'astronomio al civile per non fare in modo che si sovrascrivano a vicenda
|
||||
//crepuscolo astronomico
|
||||
PaintBox1.Canvas.Brush.Color:=$00300A00;
|
||||
PaintBox1.Canvas.Pen.Color:=clWhite;
|
||||
PaintBox1.Canvas.RoundRect(round(xgrafico+orafine2*corpo.astronomicaldusk/1440),round(altezzarighe*i+aggpospianeti+distrighetop),round(xgrafico+orafine2*corpo.astronomicaldawn/1440),round(altezzarighe*i+aggpospianeti+spesspianeti+distrighetop),roundrett,roundrett);
|
||||
|
||||
|
||||
//crepuscolo nautico
|
||||
PaintBox1.Canvas.Brush.Color:=$009E2200;
|
||||
PaintBox1.Canvas.Pen.Color:=clWhite;
|
||||
PaintBox1.Canvas.RoundRect(round(xgrafico+orafine2*corpo.nauticaldusk/1440),round(altezzarighe*i+aggpospianeti+distrighetop),round(xgrafico+orafine2*corpo.nauticaldawn/1440),round(altezzarighe*i+aggpospianeti+spesspianeti+distrighetop),roundrett,roundrett);
|
||||
|
||||
|
||||
//crepuscolo civile
|
||||
PaintBox1.Canvas.Brush.Color:=$00FF3700;
|
||||
PaintBox1.Canvas.Pen.Color:=clWhite;
|
||||
PaintBox1.Canvas.RoundRect(round(xgrafico+orafine2*corpo.civildusk/1440),round(altezzarighe*i+aggpospianeti+distrighetop),round(xgrafico+orafine2*corpo.civildawn/1440),round(altezzarighe*i+aggpospianeti+spesspianeti+distrighetop),roundrett,roundrett);
|
||||
end;
|
||||
|
||||
PaintBox1.Canvas.Brush.Color:=corpo.colore;
|
||||
PaintBox1.Canvas.Pen.Color:=clWhite;
|
||||
if (corpo.sorge=-1) and (corpo.tramonta>=0) then
|
||||
begin
|
||||
PaintBox1.Canvas.RoundRect(xgrafico,round(altezzarighe*i+aggpospianeti+distrighetop),round(xgrafico+(orafine2*corpo.tramonta/1440)),round(altezzarighe*i+aggpospianeti+spesspianeti+distrighetop),roundrett,roundrett);
|
||||
end else
|
||||
begin
|
||||
if (corpo.sorge>=0) and (corpo.tramonta=-1) then
|
||||
begin
|
||||
PaintBox1.Canvas.RoundRect(round(xgrafico+orafine2*corpo.sorge/1440),round(altezzarighe*i+aggpospianeti+distrighetop),orafine,round(altezzarighe*i+aggpospianeti+spesspianeti+distrighetop),roundrett,roundrett);
|
||||
end else
|
||||
|
||||
begin
|
||||
|
||||
if (corpo.sorge=-1) and (corpo.tramonta=-1) then
|
||||
begin
|
||||
if corpo.isinsky=True then
|
||||
PaintBox1.Canvas.RoundRect(xgrafico,round(altezzarighe*i+aggpospianeti+distrighetop),orafine,round(altezzarighe*i+aggpospianeti+spesspianeti+distrighetop),roundrett,roundrett);
|
||||
end else
|
||||
|
||||
begin
|
||||
|
||||
if corpo.sorge<corpo.tramonta then
|
||||
PaintBox1.Canvas.RoundRect(round(xgrafico+orafine2*corpo.sorge/1440),round(altezzarighe*i+aggpospianeti+distrighetop),round(xgrafico+orafine2*corpo.tramonta/1440),round(altezzarighe*i+aggpospianeti+spesspianeti+distrighetop),roundrett,roundrett)
|
||||
else
|
||||
begin
|
||||
PaintBox1.Canvas.RoundRect(xgrafico,round(altezzarighe*i+aggpospianeti+distrighetop),round(xgrafico+(orafine2*corpo.tramonta/1440)),round(altezzarighe*i+aggpospianeti+spesspianeti+distrighetop),roundrett,roundrett);
|
||||
PaintBox1.Canvas.RoundRect(round(xgrafico+orafine2*corpo.sorge/1440),round(altezzarighe*i+aggpospianeti+distrighetop),orafine,round(altezzarighe*i+aggpospianeti+spesspianeti+distrighetop),roundrett,roundrett);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
PaintBox1.Canvas.Brush.Color:=colorform; //decide il colore di sfondo del canvas
|
||||
i:=i+1;
|
||||
|
||||
end;
|
||||
|
||||
for i:=0 to 24 do //crea le tacche delle ore
|
||||
begin
|
||||
durataorai:=round( durataora*i);
|
||||
PaintBox1.Canvas.Pen.Color:=clwhite;
|
||||
PaintBox1.Canvas.Line(durataorai+xgrafico,distrighellotop,durataorai+xgrafico,distrighellotop+altezzarighello);
|
||||
|
||||
PaintBox1.Canvas.Pen.Color:=clNone;
|
||||
PaintBox1.Canvas.TextOut(durataorai+xgrafico-6,5, inttostr(i));
|
||||
end;
|
||||
|
||||
for i:=0 to 23 do //crea le tacche delle mezzore
|
||||
begin
|
||||
durataorai:=round( durataora*i+duratamezzora);
|
||||
PaintBox1.Canvas.Pen.Color:=clwhite;
|
||||
PaintBox1.Canvas.Line(durataorai+xgrafico,distrighellotop+round(mezzorighello/2),durataorai+xgrafico,distrighellotop+round(mezzorighello));
|
||||
|
||||
|
||||
end;
|
||||
|
||||
PaintBox1.Canvas.Line(xgrafico,distrighellotop+mezzorighello,orafine, distrighellotop+mezzorighello);//disegna la riga sulle tacche
|
||||
|
||||
|
||||
end;
|
||||
|
||||
procedure TPianetiGraph.ImpostaTempoClick(Sender: TObject; Tempo:TDateTime; lat, long:double);
|
||||
begin
|
||||
|
||||
tempoinizio:=Tempo;
|
||||
latitudine:=lat;
|
||||
longitudine:=long;
|
||||
calcolapianeti;
|
||||
PaintBox1.Refresh;
|
||||
end;
|
||||
|
||||
procedure TPianetiGraph.FrameMouseLeave(Sender: TObject);
|
||||
begin
|
||||
Label1.Caption:='';
|
||||
end;
|
||||
|
||||
|
||||
var
|
||||
stop:boolean;
|
||||
|
||||
procedure TPianetiGraph.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState;
|
||||
X, Y: Integer);
|
||||
var
|
||||
elementi:TPianeta;
|
||||
valoreriga: integer;
|
||||
magnitudine:string;
|
||||
fasepianetiinterni:string;
|
||||
saturnoring:string;
|
||||
orasorge:string;
|
||||
oratramonta:string;
|
||||
crepuscoli:string;
|
||||
i:integer;
|
||||
begin
|
||||
i:=0;
|
||||
for elementi in oggetticelesti do
|
||||
begin
|
||||
i:=i+1;
|
||||
valoreriga:=round(altezzarighe*i+aggpospianeti+distrighetop);
|
||||
if (Y>valoreriga) and (Y<valoreriga+spesspianeti) then
|
||||
begin
|
||||
if elementi.nome=Sole then
|
||||
begin
|
||||
crepuscoli:=' Crepuscoli:';
|
||||
crepuscoli:=crepuscoli+' Astronomico '+ FormattaOraDaMinutiGiorno(elementi.astronomicaldusk)+ '-'+ FormattaOraDaMinutiGiorno(elementi.astronomicaldawn);
|
||||
crepuscoli:=crepuscoli+' Nautico '+ FormattaOraDaMinutiGiorno(elementi.nauticaldusk)+ '-'+ FormattaOraDaMinutiGiorno(elementi.nauticaldawn);
|
||||
crepuscoli:=crepuscoli+' Civile '+ FormattaOraDaMinutiGiorno(elementi.civildusk)+ '-'+ FormattaOraDaMinutiGiorno(elementi.civildawn);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
magnitudine:=' Magnitudine: '+ SysUtils.FormatFloat('0.00', elementi.illumData.mag);
|
||||
if (elementi.nome=Mercurio) or (elementi.nome=Venere) then fasepianetiinterni:=' Fase: '+FormatFloat('0.00', elementi.illumData.phase_fraction) ;
|
||||
if (elementi.nome=Saturno) then saturnoring:=' Inclinazione Anelli: '+FormatFloat('0.00', elementi.illumData.ring_tilt);
|
||||
if elementi.sorge=-1 then orasorge:='--'
|
||||
else orasorge:=FormattaOraDaMinutiGiorno(elementi.sorge);
|
||||
|
||||
if elementi.tramonta=-1 then oratramonta:='--'
|
||||
else oratramonta:=FormattaOraDaMinutiGiorno(elementi.tramonta) ;
|
||||
|
||||
Label1.Caption:=elementi.testo+magnitudine+fasepianetiinterni+saturnoring+Crepuscoli+' Sorge alle: '+orasorge + ' Tramonta alle: ' + oratramonta+' Distanza '+SysUtils.FormatFloat('0.000',elementi.distanza)+'UA'; ;
|
||||
|
||||
break;
|
||||
end
|
||||
|
||||
|
||||
end;
|
||||
end;
|
||||
|
||||
function FormattaOraDaMinutiGiorno(minutigiorno:integer):string;
|
||||
begin
|
||||
result:= SysUtils.FormatFloat('00',(minutigiorno div 60))+':'+ sysUtils.FormatCurr('00', (minutigiorno mod 60) );
|
||||
|
||||
end;
|
||||
|
||||
procedure calcolapianeti;
|
||||
var
|
||||
i:integer;
|
||||
alba:TDateTime;
|
||||
tramonto:TDateTime;
|
||||
crepalba:TDateTime;//crepuscolo civile alba
|
||||
creptram:TDateTime;//crepuscolo tramonto alba
|
||||
|
||||
minutidainizio:integer; //indica il numero di minuti da inizio giorno
|
||||
numerocorpo:integer; //serve per corrispondenza tra gli enum in TPianeta e quelli contenuti in astro_body_t
|
||||
|
||||
ognicrepuscolo:TCrepuscolo;
|
||||
datecrep:TDateTime;
|
||||
segnaposto:integer;
|
||||
|
||||
albaerror:boolean=False; //variabili utilizzate per segnare in caso di errore;
|
||||
tramontoerror:boolean=False;
|
||||
altezzaoggetto:double=0;
|
||||
begin
|
||||
|
||||
|
||||
for i:=0 to 8 do //serve per corrispondenza tra gli enum in TPianeta e quelli contenuti in astro_body_t
|
||||
begin
|
||||
|
||||
albaerror:=False;
|
||||
tramontoerror:=False;
|
||||
|
||||
case oggetticelesti[i].nome of
|
||||
Mercurio: numerocorpo:=0;
|
||||
Venere: numerocorpo:=1;
|
||||
Marte: numerocorpo:=3;
|
||||
Giove: numerocorpo:=4;
|
||||
Saturno: numerocorpo:=5;
|
||||
Urano: numerocorpo:=6;
|
||||
Nettuno: numerocorpo:=7;
|
||||
Sole: numerocorpo:=9;
|
||||
Luna: numerocorpo:=10;
|
||||
end;
|
||||
|
||||
|
||||
oggetticelesti[i].distanza:=astronomy.DistanzaOggetto(numerocorpo, latitudine, longitudine, altitudine, DateUtils.IncHour(tempoinizio, 12));
|
||||
oggetticelesti[i].illumData:=astronomy.Illuminazione(numerocorpo, DateUtils.IncHour(tempoinizio, 12));
|
||||
|
||||
if oggetticelesti[i].nome=Sole then
|
||||
begin
|
||||
//il sole presenta anche i crepuscoli a differenza degli altri oggetti
|
||||
|
||||
for ognicrepuscolo in Tcrepuscolo do
|
||||
begin
|
||||
|
||||
|
||||
datecrep:=Astronomy.Crepuscolo(latitudine, longitudine, altitudine, 1, tempoinizio, ognicrepuscolo);
|
||||
segnaposto:=DateUtils.MinutesBetween(tempoinizio, datecrep);
|
||||
|
||||
case ognicrepuscolo of
|
||||
civildawn:oggetticelesti[i].civildawn:=segnaposto;
|
||||
civildusk:oggetticelesti[i].civildusk:=segnaposto;
|
||||
nauticaldawn:oggetticelesti[i].nauticaldawn:=segnaposto;
|
||||
nauticaldusk:oggetticelesti[i].nauticaldusk:=segnaposto;
|
||||
astronomicaldawn:oggetticelesti[i].astronomicaldawn:=segnaposto;
|
||||
astronomicaldusk:oggetticelesti[i].astronomicaldusk:=segnaposto;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
end;
|
||||
try
|
||||
alba:=Astronomy.TrovaSorgereOggetto(numerocorpo, latitudine, longitudine, altitudine, tempoinizio, 1);
|
||||
except
|
||||
on E:exception do
|
||||
begin
|
||||
albaerror:=True;
|
||||
oggetticelesti[i].sorge:=-1;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
|
||||
try
|
||||
tramonto:=Astronomy.TrovaTramontoOggetto(numerocorpo, latitudine, longitudine, altitudine, tempoinizio, 1);
|
||||
except
|
||||
on E:exception do
|
||||
begin
|
||||
|
||||
tramontoerror:=True;
|
||||
oggetticelesti[i].tramonta:=-1;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
if albaerror=False then oggetticelesti[i].sorge:=DateUtils.MinutesBetween(tempoinizio, alba);
|
||||
|
||||
if tramontoerror=False then oggetticelesti[i].tramonta:=DateUtils.MinutesBetween(tempoinizio, tramonto);
|
||||
|
||||
if albaerror and tramontoerror then
|
||||
begin
|
||||
|
||||
end;
|
||||
altezzaoggetto:= astronomy.AltitudineOggetto(numerocorpo, latitudine, longitudine, altitudine, DateUtils.IncHour(tempoinizio, 12));
|
||||
if altezzaoggetto>0 then
|
||||
oggetticelesti[i].isinsky:=True else oggetticelesti[i].isinsky:=False;
|
||||
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
39390
frameluna.lfm
Normal file
39390
frameluna.lfm
Normal file
File diff suppressed because it is too large
Load Diff
213
frameluna.pas
Normal file
213
frameluna.pas
Normal file
@@ -0,0 +1,213 @@
|
||||
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.
|
||||
|
||||
|
||||
|
||||
|
||||
83
graficimeteo.pas
Normal file
83
graficimeteo.pas
Normal file
@@ -0,0 +1,83 @@
|
||||
unit graficimeteo;
|
||||
|
||||
{$mode ObjFPC}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, TAGraph,
|
||||
TASeries, fpjson, jsonparser;
|
||||
|
||||
type
|
||||
|
||||
{ TForm3 }
|
||||
|
||||
TForm3 = class(TForm)
|
||||
Chart1: TChart;
|
||||
Chart2: TChart;
|
||||
CoperturaSeries: TLineSeries;
|
||||
Chart3: TChart;
|
||||
Label1: TLabel;
|
||||
Label2: TLabel;
|
||||
Label3: TLabel;
|
||||
Vento10m: TLineSeries;
|
||||
Vento180m: TLineSeries;
|
||||
VisibilitaSeries: TLineSeries;
|
||||
procedure FormCreate(Sender: TObject);
|
||||
procedure FormShow(Sender: TObject);
|
||||
private
|
||||
|
||||
public
|
||||
|
||||
|
||||
|
||||
var
|
||||
meteotext:string;
|
||||
meteoposgiorno:integer;
|
||||
end;
|
||||
|
||||
var
|
||||
Form3: TForm3;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.lfm}
|
||||
|
||||
{ TForm3 }
|
||||
|
||||
procedure TForm3.FormShow(Sender: TObject);
|
||||
var
|
||||
MeteoJSON: TJSONData;
|
||||
OggettoJSON: TJSONObject;
|
||||
i: integer;
|
||||
oracercata:string;
|
||||
begin
|
||||
MeteoJSON:=fpJSON.GetJSON(meteotext);
|
||||
|
||||
OggettoJSON := MeteoJSON as TJSONObject; //questo è stato fatto per rendere i dati meglio estraibili
|
||||
|
||||
VisibilitaSeries.Clear;
|
||||
CoperturaSeries.Clear;
|
||||
Vento10m.Clear;
|
||||
Vento180m.Clear;
|
||||
|
||||
|
||||
for i:=0 to 23 do
|
||||
begin
|
||||
if meteoposgiorno>=6 then oracercata:=inttostr (i+meteoposgiorno*24)
|
||||
else oracercata:=inttostr (i+1+meteoposgiorno*24);
|
||||
VisibilitaSeries.AddXY(i, round(OggettoJSON.FindPath('hourly.visibility['+oracercata+']').AsFloat/1000));
|
||||
CoperturaSeries.AddXY(i, round(OggettoJSON.FindPath('hourly.cloud_cover['+oracercata+']').AsFloat));
|
||||
Vento10m.AddXY(i, round(OggettoJSON.FindPath('hourly.wind_speed_10m['+oracercata+']').AsFloat));
|
||||
Vento180m.AddXY(i, round(OggettoJSON.FindPath('hourly.wind_speed_180m['+oracercata+']').AsFloat));
|
||||
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TForm3.FormCreate(Sender: TObject);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
Reference in New Issue
Block a user