astronomia con pascal

esci turboastro.htm

altezza del sole in funzione di latitudini e declinazioni variabili

program solalto4;
(* altezza del sole in funzione di declinazione e latitudine *)

uses crt,graph;

type vet=array[1..800] of byte;
var sole:vet;
stagione,g,g1,g2,tropico1,tropico2,tropi1,tropi2,cx,cy,rc:integer;
tempo,co,f:integer;

procedure presenta;
begin
writeln('rappresentazione circolo meridiano con verticali');
writeln('in corrispondenza delle latitudini:');
writeln('0=equatore....45 nord/sud.....90 NORD/SUD poli ');
writeln;
writeln('altezza del sole agli equinozi:');
writeln('90 gradi allo equatore,45 a 45 gradi N/S,0 gradi ai poli');
writeln;
writeln('si visualizza moto di declinazione apparente annuale del sole');
writeln;
writeln('il sole sembra spostarsi rispetto al piano equatoriale');
writeln('da equatore a tropico cancro :21/3.....21/6');
writeln('dal tropico del cancro a equatore:21/6.....22/9');
writeln('da equatore a tropico capricorno :22/9.....21/12');
writeln('da tropico capricorno a equatore :21/12....21/3');
writeln;
writeln('il circolo di illuminazione,perpendicolare ai raggi solari');
writeln('taglia in modo variabile i paralleli durante il movimento');
writeln('la zona interna ai circoli polari presenta durata');
writeln('del giorno e della notte variabile da 24 ore a 6 mesi ');
writeln;
write('indica velocita...veloce=100....lento=500..1000..');readln(tempo);
end;

procedure grafica(f:integer); (* attiva pagina grafica*)
(* coordinate finestra,colore sfondo e disegno *)
var sc,tp:integer;
stringa:string;

begin
sc:=0; (* valore risoluzione 0,1,2,3,4,5,8,9 *)
tp:=0; (* valore valido 1 - 0 palette *)
stringa:='c:\scheda'; (* indica ove cercare GRAPH *)
initgraph(sc,tp,stringa); (* attiva scheda grafica *)
setbkcolor(f); (* colore sfondo *)
end;

procedure testo(x,y:integer;nome:string); (* stampa legenda testo *)
begin
outtextxy(x,y,nome);
end;

procedure pausa; (* premere return per proseguire *)
var ch:char;
begin
testo(10,400,'premi return,prego');
ch:=readkey;
end;

procedure costante(cx,cy,rc,g:integer);
var rad1,rad2,ra1,ra2:real;
begin
circle(cx,cy,rc); (* circolo meridiano*)
line(cx,cy,cx+rc+150,cy); (* equatore *)
line(cx,cy-rc-20,cx,cy+rc+20); (* asse nord sud *)
line(cx+rc,cy-50,cx+rc,cy+50); (* orizzonte equatore *)
rad1:=(sin(g*3.14/180));
rad2:=(cos(g*3.14/180));
tropico1:=trunc(rad1*rc);
tropico2:=trunc(rad2*rc);
ra1:=(sin(g*3.14/180));
ra2:=(cos(g*3.14/180));
tropi1:=trunc(ra1*(rc+100));
tropi2:=trunc(ra2*(rc+100));
line(cx+tropico2,cy+tropico1,cx+350,cy+tropico1);(* asse equatore -45 *)
line(cx,cy,cx+tropi2,cy+tropi2);
line(cx,cy,cx+tropi2,cy-tropi2);
line(cx+tropico2,cy-tropico1,cx+350,cy-tropico1);(* asse equatore +45*)
line(cx,cy-rc,cx+350,cy-rc); (* asse equatore a nord *)
line(cx,cy+rc,cx+350,cy+rc); (* asse equatore a sud *)
testo(50,220,'equatore');
testo(180,20,'nord');
testo(180,430,'sud');
testo(150,100,'45 gradi nord');
testo(150,350,'45 gradi sud');

end;

procedure varia(cx,cy,rc,g1,g2:integer);
var rad1,rad2,ra1,ra2,ang:real;
s,c,gra,rc1:integer;
begin
rc1:=rc+100;
circle(cx,cy,rc); (* circolo meridiano*)
line(cx,cy,cx+rc+150,cy); (* equatore *)
line(cx,cy-rc-20,cx,cy+rc+20); (* asse nord sud *)
line(cx+rc,cy-50,cx+rc,cy+50); (* orizzonte equatore *)

rad1:=(sin(g*3.14/180));
rad2:=(cos(g*3.14/180));
tropico1:=trunc(rad1*rc);
tropico2:=trunc(rad2*rc);
ra1:=(sin(g*3.14/180));
ra2:=(cos(g*3.14/180));
tropi1:=trunc(ra1*(rc+100));
tropi2:=trunc(ra2*(rc+100));
line(cx+tropico2,cy+tropico1,cx+350,cy+tropico1);(* asse equatore -45 *)
line(cx,cy,cx+tropi2,cy+tropi2);
line(cx,cy,cx+tropi2,cy-tropi2);
line(cx+tropico2,cy-tropico1,cx+350,cy-tropico1);(* asse equatore +45*)
line(cx,cy-rc,cx+350,cy-rc); (* asse equatore a nord *)
line(cx,cy+rc,cx+350,cy+rc); (* asse equatore a sud *)
testo(50,220,'equatore');
testo(180,20,'nord');
testo(180,430,'sud');
testo(150,100,'45 gradi nord');
testo(150,350,'45 gradi sud');
testo(100,80,'circolo polare 66 nord');
testo(100,370,'circolo polare 66 sud');
testo(100,150,'tropico cancro 23 NORD');
testo(100,280,'tropico capricorno 23 SUD');
end;

procedure dischi;
begin
setfillstyle(1,14);
fillellipse(20,20,10,10);
getimage(5,5,35,35,sole);
end;

procedure posizione;
begin
putimage(cx+300,cy-15,sole,1);
putimage(cx+300,cy-15-tropico2,sole,1);
putimage(cx+300,cy-15+tropico2,sole,1);
putimage(cx+300,cy-rc-15,sole,1);
putimage(cx+300,cy+rc-15,sole,1);
testo(50,410,'sole agli equinozi:massima altezza allo equatore');
testo(50,420,'tangente ai poli,45 gradi a latitudine 45 N/S ');
end;

procedure moto(g1,g2,rc1,stagione,co:integer);
var gra,s,c,s1,c1:integer;
ang,ang1:real;
declina:string;
begin
case stagione of
1:begin
for gra:=g1 to g2 do
begin
setcolor(co);
ang:=gra*3.14/180;
ang1:=(90+gra)*3.14/180;
str(abs(gra-90),declina);
testo(500,10,declina);
s:=trunc(sin(ang)*rc1);
c:=trunc(cos(ang)*rc1);
line(cx,cy,cx+s,cy+c);
s1:=trunc(sin(ang1)*rc);
c1:=trunc(cos(ang1)*rc);
line(cx-s1,cy-c1,cx+s1,cy+c1);
putimage(cx+s,cy+c,sole,1);
delay(tempo);
setcolor(f);
testo(500,10,declina);
putimage(cx+s,cy+c,sole,1);
end; end;
2:begin
for gra:=g1 downto g2 do
begin
setcolor(co);
ang:=gra*3.14/180;
ang1:=(90+gra)*3.14/180;
str( abs(90-gra),declina);
testo(500,10,declina);
s:=trunc(sin(ang)*rc1);
c:=trunc(cos(ang)*rc1);
line(cx,cy,cx+s,cy+c);
s1:=trunc(sin(ang1)*rc);
c1:=trunc(cos(ang1)*rc);
line(cx-s1,cy-c1,cx+s1,cy+c1);
putimage(cx+s,cy+c,sole,1);
delay(tempo);
putimage(cx+s,cy+c,sole,1);
setcolor(f);
testo(500,10,declina);
end; end;
end;
end;

begin (* programma principale *)
clrscr;
presenta;
cx:=200;
cy:=220;
rc:=180;
g:=45;
f:=1;
grafica(f); (* attiva pagina grafica *)
dischi; (* disegna disco solare *)
costante(cx,cy,rc,g);
posizione;
pausa;
g:=25;
grafica(f);
setcolor(14);
testo(500,30,'declinazione sole');
testo(10,430,'moto apparente di declinazione annuale del sole');
varia(cx,cy,rc,67,90);
setcolor(2);
testo(10,10,'dal 21/3 al 21/6 :declinazione crescente: 0...+23');
moto(90,113,300,1,2);
setcolor(3);
testo(10,20,'dal 21/6 al 22/9 :declinazione decrescente: +23.....0');
moto(113,90,300,2,3);
setcolor(4);
testo(10,30,'dal 22/9 al 21/12:declinazione decrescente: 0...-23');
moto(90,67,300,2,4);
setcolor(5);
testo(10,40,'dal 21/12 al 21/3:declinazione crescente: -23.....0');
moto(67,90,300,1,5);
setcolor(3);
testo(10,420,'zona colorata:sole raggiunge la massima altezza 90 gradi');
setcolor(5);
testo(10,440,'zona circumpolare:altezza massima 23..minima -23 gradi ');
pausa;
end.