altezza del sole durante l'anno
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.