moto diurno apparente e reale ,luna, sole
astro5-astro9
program astro5; (* moto diurno del sole *) (* equinozio,solstizio *) uses crt,graph; type vet=array[1..800] of byte; var sole:vet; luogo1,luogo2:string; t:integer; procedure simula; (* introduzione a programma *) begin writeln('simulazione moto diurno del sole'); writeln('agli equinozi e ai solstizi '); writeln('---------------------------------------------'); writeln('premere tasto PAUSE per fermare rotazione '); writeln('premere tasto RETURN per riprendere rotazione'); writeln('---------------------------------------------'); writeln('indica velocita moto solare '); writeln('numero 1 =moto rapido '); writeln('numero 100 =moto lento '); writeln('prova prima con 1 e poi altri valori...10..20..'); readln(t); clrscr; end; procedure fine; (* fine e ritorno a pascal *) begin closegraph; exit; end; procedure grafica(x1,y1,x2,y2,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 *) rectangle(x1,y1,x2,y2); (* cornice area grafica *) setbkcolor(f); (* colore sfondo *) end; procedure pausa; (* premere return per proseguire *) var ch:char; begin ch:=readkey; end; procedure testo(x,y:integer;nome:string); (* stampa legenda testo *) begin outtextxy(x,y,nome); end; procedure moto(r1,r2,g1,g2,p1:integer;disco1:vet;luogo1,luogo2:string); (* raggi r1,r2,gradi g1,g2,figura...animazione figura*) var m,s1,c1:integer; rad,s,c:real; begin for m:=g1 to g2 do begin rad:=m*3.14/180; s:=r1*sin(rad); c:=r2*cos(rad); s1:=trunc(s); c1:=trunc(c); setwritemode(0); putimage(300+s1,200+c1,disco1,1); (* rotazione disco pieno singolo *) putimage(300+s1,200+c1,disco1,0); delay(t); if m=90 then outtextxy(20,p1,luogo1); if m=270 then outtextxy(400,p1,luogo2); if m=180 then outtextxy(240,300,'il sole culmina a sud'); end; delay(500); putimage(300+s1,200+c1,disco1,1); (* cancella sole tramonto *) end; procedure orbita(r1,r2:integer;co:word); (* disegna orbite vuote *) var m,s2,c2:integer; rad, s1,c1:real; begin for m:=90 to 270 do begin rad:=m*3.14/180; s1:=r1*sin(rad); c1:=r2*cos(rad); s2:=trunc(s1); c2:=trunc(c1); putpixel(300+s2,250+c2,co); end; end; procedure costante; (* disegno e testo fisso *) begin setfillstyle(1,4); (* tratto e colore terra *) bar(290,250,310,200); (* terra *) setfillstyle(1,2); (* orizzonte terra *) bar(1,250,639,350); testo(40,80,'sole'); testo(260,270,'orizzonte terra'); testo(280,290,'MERIDIANO'); testo(20,270,'EST'); testo(580,270,'OVEST'); testo(20,400,'equinozio'); testo(20,350,'premere return per proseguire'); setfillstyle(1,14); fillellipse(20,20,10,10); (* sole *) getimage(5,5,35,35,sole); (* vettore sole *) end; procedure programma; (* contiene parte principale *) procedure scelta; (* opzione fine o riprova *) var ch:char; begin (* textmode(1);*) restorecrtmode; writeln('per rivedere,premi S,per finire premi N'); readln(ch); if (ch='S') or (ch='s') then programma else fine end; begin clrscr; simula; (* introduzione a programma *) pausa; grafica(1,1,639,470,1); (* attiva pagina grafica *) costante; (* disegno sfondo fisso *) luogo1:='il sole sorge a EST'; luogo2:='il sole tramonta a OVEST'; moto(-230,180,90,270,310,sole,luogo1,luogo2); (* animazione sole *) pausa; setcolor(4); testo(20,420,'solstizio estivo'); luogo1:='il sole sorge a nord est'; luogo2:='il sole tramonta a nord ovest '; moto(-280,190,90,270,320,sole,luogo1,luogo2); pausa; setcolor(5); testo(20,440,'solstizio invernale'); luogo1:='il sole sorge a sud est'; luogo2:='il sole tramonta a sud ovest'; moto(-190,170,90,270,330,sole,luogo1,luogo2); pausa; setcolor(2); testo(20,460,'orbite descritte agli equinozi e solstizi'); orbita(-230,170,5); (* disegna tre orbite vuote *) orbita(-250,180,7); orbita(-270,190,4); pausa; scelta; (* opzione fine o rivedere *) end; begin programma; (* programma principale *) end.
program astro9; (* moto diurno del sole e della luna*) (* novilunio,quadratura,plenilunio *) (* variante di astro8 con stile diverso testo *) uses crt,graph; type vet=array[1..800] of byte; var sole,lunan,lunap,pquarto,uquarto:vet; luogo1,luogo2,culmina:string; t,orbite,k:integer; procedure simula; (* introduzione a programma *) begin writeln('simulazione moto diurno del sole e della luna'); writeln('novilunio,quadratura,plenilunio '); writeln('---------------------------------------------'); writeln('premere tasto PAUSE per fermare rotazione '); writeln('premere tasto RETURN per riprendere rotazione'); writeln('---------------------------------------------'); writeln('indica velocita moto solare '); writeln('numero 1 =moto rapido '); writeln('numero 100 =moto lento '); writeln('prova prima con 1 e poi altri valori...10..20..'); readln(t); writeln('indicare numero rotazioni in gradi:360,720,1080..'); readln(orbite); clrscr; end; procedure fine; (* fine e ritorno a pascal *) begin exit; end; procedure grafica(x1,y1,x2,y2,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 *) rectangle(x1,y1,x2,y2); (* cornice area grafica *) setbkcolor(f); (* colore sfondo *) end; procedure pausa; (* premere return per proseguire *) var ch:char; begin ch:=readkey; end; procedure testo(x,y:integer;nome:string); (* stampa legenda testo *) begin outtextxy(x,y,nome); end; procedure moto(r1,r2,g3,p1,q1,q2,cu:integer;disco1,disco2:vet;luogo1,luogo2:string); (* raggi r1,r2,q1,q2,gradi g3,figura...animazione figura*) var m,s1,c1,s2,c2:integer; rad,rad1,s,c:real; stringa:string; begin for m:=0 to orbite do begin rad:=m*3.14/180; rad1:=(m+g3)*3.14/180; s:=r1*sin(rad); (* disco1 *) c:=r2*cos(rad); s1:=trunc(s); c1:=trunc(c); s2:=trunc(q1*sin(rad1));(* disco2 *) c2:=trunc(q2*cos(rad1)); settextstyle(1,0,2); setwritemode(0); putimage(300+s1,200+c1,disco1,1); (* rotazione disco1 pieno singolo *) putimage(300+s2,200+c2,disco2,1); (* rotazione disco2 *) putimage(300+s1,200+c1,disco1,0); putimage(300+s2,200+c2,disco2,0); delay(t); if m=90 then outtextxy(20,p1,luogo1); if m=270 then outtextxy(470,p1,luogo2); if m=180 then outtextxy(270,cu,culmina); end; delay(500); putimage(300+s1,200+c1,disco1,1); (* cancella disco1 tramonto *) putimage(300+s2,200+c2,disco2,1); (* cancella disco 2 *) end; procedure costante; (* disegno e testo fisso *) begin setfillstyle(1,4); (* tratto e colore terra *) bar(290,250,310,200); (* terra *) setfillstyle(1,2); (* orizzonte terra *) fillellipse(300,250,40,40); line(1,210,650,210); testo(40,80,'sole'); testo(550,80,'luna'); setcolor(15); testo(250,240,'orizzonte terra'); setcolor(4); testo(270,220,'MERIDIANO'); setcolor(2); testo(210,220,'EST'); testo(390,220,'OVEST'); setcolor(15); testo(20,470,'premere return per proseguire'); setfillstyle(1,14); fillellipse(20,20,10,10); (* sole *) getimage(5,5,35,35,sole); (* vettore sole *) setfillstyle(1,15); (* luna piena*) fillellipse(500,20,10,10); getimage(485,5,515,35,lunap); setfillstyle(1,1); (* luna nuova *) fillellipse(450,20,10,10); getimage(435,5,465,35,lunan); setlinestyle(4,0,1); (* per falce luna *) setfillstyle(1,2); (* primo quarto *) sector(600,20,0,360,10,10); setfillstyle(1,1); sector(600,20,270,90,10,10); getimage(585,5,615,35,pquarto); setfillstyle(1,1); (* ultimo quarto *) sector(560,20,0,360,10,10); setfillstyle(1,2); sector(560,20,270,90,10,10); getimage(545,5,585,35,uquarto); end; procedure programma; (* contiene parte principale *) procedure scelta; (* opzione fine o riprova *) var ch:char; begin restorecrtmode; writeln('per rivedere,premi S,per finire premi N'); readln(ch); if ch='S' then programma else fine end; begin clrscr; simula; (* introduzione a programma *) grafica(1,1,639,470,1); (* attiva pagina grafica *) costante; (* disegno sfondo fisso *) setcolor(5); testo(290,450,'LA LUNA'); setcolor(15); testo(270,270,'novilunio'); luogo1:='sorge alle 6'; luogo2:='tramonta alle 18'; culmina:='culmina alle 12'; moto(-280,190,0,405,-250,160,130,sole,lunan,luogo1,luogo2); (* animazione *) pausa; setcolor(4); testo(270,285,'primo quarto'); luogo1:='sorge alle 12'; luogo2:='tramonta alle 24 '; culmina:='culmina alle 18'; moto(-280,190,90,420,-250,160,145,pquarto,sole,luogo1,luogo2); pausa; setcolor(5); testo(270,305,'plenilunio'); luogo1:='sorge alle 18'; luogo2:='tramonta alle 6'; culmina:='culmina alle 24'; moto(-250,190,180,435,-250,160,160,lunap,sole,luogo1,luogo2); pausa; setcolor(2); testo(270,320,'ultimo quarto'); luogo1:='sorge alle 24'; luogo2:='tramonta alle 12'; culmina:='culmina alle 6'; moto(-250,190,90,450,250,-160,175,uquarto,sole,luogo1,luogo2); pausa; scelta; (* opzione fine o rivedere *) end; begin programma; (* programma principale *) end.