altezza del sole durante l'anno

ritorna

program solealto;
(* altezza del sole in funzione di declinazione e latitudine *)
(* disco 65 \tu53\ dispensa 49 *)

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,ca: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;
 writeln('possibile visualizzare con o senza persistenza raggi e circolo');
 writeln;
 write('indica velocita...veloce=100....lento=500..1000..');readln(tempo);
 write('scrivi 1 per linee non persistenti...2=persistenti');readln(ca);
 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 ripeti;
begin
 testo(50,220,'equatore');
 testo(180,50,'nord');
 testo(180,400,'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 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  *)
 ripeti;
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  *)
 ripeti;
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);
  line(cx,cy-rc,cx,cy+rc);
  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);
  line(cx,cy,cx+300,cy);
   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);
  setcolor(15);
  ripeti;
  delay(tempo);
  setcolor(f);
  if (ca=1) then line(cx-s1,cy-c1,cx+s1,cy+c1);
  if (ca=1) then line(cx,cy,cx+s,cy+c);
  testo(500,10,declina);
  putimage(cx+s,cy+c,sole,1);
  end; end;
2:begin
  for gra:=g1 downto g2 do
  begin
  setcolor(co);
  line(cx,cy-rc,cx,cy+rc);
  line(cx,cy,cx+300,cy);
  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);
  setcolor(15);
  ripeti;
  delay(tempo);
  putimage(cx+s,cy+c,sole,1);
  setcolor(f);
  if (ca=1) then line(cx-s1,cy-c1,cx+s1,cy+c1);
  if (ca=1) then line(cx,cy,cx+s,cy+c);
  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);
 line(cx,cy-rc,cx,cy+rc);
 line(cx,cy,cx+300,cy);
 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  ');
 settextstyle(1,1,1);
 settextjustify(2,1);
 testo(600,250,'verticali degli osservatori');
 testo(620,250,'il sole raggiunge lo zenit 1 o 2 volte');
 settextstyle(0,0,1);
 settextjustify(0,1);
 pausa;
  end.


ritorna