rivoluzione terrestre, moto apparente sole e luna
terra,terra1,2,3,5, tempo1, solare1, sole1
program terra2; (* rivoluzione terrestre e lunare con eclissi ogni mese *) (* su disco 65 dispensa 49 \tu54\terra2.mar *) uses crt,graph; type vet=array[1..800] of byte; const data:array[1..12] of integer=(18,50,85,120,153,187,221,255,288,322, 356,400); fase:array[1..12] of integer=(0,35,68,100,135,169,204,237,273,305, 340,0); var luna,terra,sole:vet; mesi:integer; procedure simula; begin writeln('simulazione moto di rivoluzione annuale della terra'); writeln('e moto di rivoluzione mensile della luna attorno alla terra'); writeln; writeln('approssimazioni varie per semplificare i calcoli:'); writeln('1 rivoluzione terrestre = 12 rivoluzioni lunari '); writeln('orbite descritte praticamente circolari,non ellittiche'); writeln('sole,terra,luna complanari:conseguenza:'); writeln('ogni plenilunio si verifica eclisse di luna'); writeln('ogni novilunio si verifica eclisse di sole'); writeln; writeln('indicare numero mesi:2..3..12..'); readln(mesi); clrscr; 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 pausa; (* premere return per proseguire *) var ch:char; begin outtextxy(400,450,'premi return,prego'); ch:=readkey; end; procedure testo(x,y:integer;nome:string); (* stampa legenda testo *) begin outtextxy(x,y,nome); end; procedure disco; begin setfillstyle(1,14); fillellipse(20,20,10,10); getimage(8,8,34,34,sole); setfillstyle(1,2); fillellipse(20,20,10,10); getimage(8,8,34,34,luna); testo(10,50,'luna'); setfillstyle(5,5); fillellipse(420,20,15,15); getimage(404,2,438,40,terra); testo(420,50,'terra'); end; procedure moto; var giri,m1,x,y,r1,r2,m,s1,c1,s2,c2,g1,g2,q1,q2,date,k:integer; rad,rad1,s,c:real; stringa:string; begin g1:=0; g2:=360; r1:=150; r2:=150; x:=300; y:=200; q1:=50; q2:=50; m1:=0; begin line(10,200,600,200); line(300,10,300,400); testo(250,190,'sole'); putimage(290,190,sole,1); testo(10,400,'piano della eclittica:'); testo(10,320,'giorni '); TESTO(10,410,'RIVOLUZIONE DELLA TERRA ATTORNO AL SOLE:anno'); testo(10,420,'rivoluzione della LUNA attorno alla terra:mese'); testo(10,430,'convenzione:1 anno = 12 rivoluzioni lunari '); testo(10,440,'ipotesi di complanarita di sole,luna,terra '); testo(10,450,'conseguenza:eclisse di sole e luna ogni mese'); for giri:=1 to mesi do begin for m:=g1 to g2 do begin if (m/12=int(m/12)) then m1:=m1+1; (* 1080 gradi lunari per 90 terra*) str(m1,stringa); setcolor(14); testo(20,300,stringa); delay(10); rad:=m1*3.14/180; s:=r1*sin(rad); c:=r2*cos(rad); s1:=trunc(s); c1:=trunc(c); putpixel(x+s1,y+c1,14); putimage(x+s1,y+c1,terra,1); rad1:=m*3.14/180; s2:=trunc(q1*sin(rad1)); c2:=trunc(q2*cos(rad1)); putpixel(x+s1+s2,y+c1+c2,5); putimage(x+s1+s2,y+c1+c2,luna,1); for date:=1 to 12 do begin if (m1=data[date]) then k:=1 else if (m1=fase[date]) then k:=2 else k:=0; if (k=1) then testo(10,350,'novilunio:eclisse di sole'); if (k=1) then putimage(290,190,luna,1); (* eclisse di sole *) if (k=2) then testo(350,350,'plenilunio:eclisse di luna'); if (k=2) then putimage(x+s1+s2,y+c1+c2,sole,1);(* eclisse luna *) if (k=2) then putimage(x+s1+s2,y+c1+c2,sole,1);(* eclisse luna *) end; delay(10); putimage(x+s1+s2,y+c1+c2,luna,1); setcolor(1); testo(20,300,stringa); testo(10,350,'novilunio:eclisse di sole'); testo(350,350,'plenilunio:eclisse di luna'); end; putimage(x+s1,y+c1,terra,1); end; end; end; begin (* programma principale *) clrscr; simula; grafica(1); (* attiva pagina grafica *) disco; moto; pausa; closegraph; end.
program terra1; (* MOTO annuale della terra attorno al sole *) (* su disco 65 dispensa 49 \TU55\terra1.mar *) (* variante di anno5.mar con precessiome e sfasamento segni e stelle *) uses crt,graph; type vet=array[1..800] of byte; const zod:array[1..12] of string=('pesci','ariete','toro','gemelli', 'cancro','leone','vergine','bilancia', 'scorpione','sagittario','capricorno','acquario'); mesi:array[1..12] of string=('marzo','aprile','maggio','giugno', 'luglio','agosto','settembre','ottobre', 'novembre','dicembre','gennaio','febbraio'); segno:array[1..12] of string=('ariete','toro','gemelli', 'cancro','leone','vergine','bilancia', 'scorpione','sagittario','capricorno','acquario', 'pesci'); var disco1,disco2:vet; TEMPO,anni:INTEGER; procedure simula; begin writeln('simulazione moto annuale della terra '); writeln('con lo sfondo delle costellazioni zodiacali'); writeln('------------------------------------------------------- '); writeln('ipotesi e convenzioni per semplificare calcoli :'); writeln('durata anno=360 giorni'); writeln('--------------------------------------------------------'); writeln('si visualizza:'); writeln('disco terrestre,costellazioni e segni zodiacali'); writeln('evidenzia costellazioni visibili nel corso dei mesi'); writeln('movimento annuale diretto da ovest a est della terra'); writeln('mese entrata del sole nelle costellazioni zodiacali'); writeln('sfasamento tra segni e costellazioni per precessione 2000 anni'); writeln('========================================================'); writeln('si deve indicare il tempo per regolare velocita movimento'); writeln('scrivere un numero come 10..100..1000.....'); writeln('PROVARE CON TEMPI LUNGHI,1000,PER VEDERE BENE LE SCRITTE'); WRITELN('PROVARE CON TEMPI CORTI,1,PER VEDERE RAPIDAMENTE '); WRITELN('TEMPO=');READLN(TEMPO); writeln('indicare numero anni:1..2..3...'); readln(anni); CLRSCR; 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 pausa; (* premere return per proseguire *) var ch:char; begin setcolor(14); outtextxy(400,440,'premi return,prego'); ch:=readkey; setcolor(1); outtextxy(400,440,'premi return,prego'); end; procedure testo(x,y:integer;nome:string); (* stampa legenda testo *) begin outtextxy(x,y,nome); end; procedure costante; (* disegna terra e asse sole terra *) var a,x,y,c,s,r1,r2,ag,s1,c1:integer; rad,rad1:real; begin a:=360; x:=300; y:=250; r1:=180; r2:=180; setcolor(5); setfillstyle(1,14); fillellipse(300,250,15,15); (* sole *) setcolor(14); testo(50,10,'moto di rivoluzione della terra da ovest a est'); testo(50,20,'dalla terra si vede il sole spostarsi ogni mese in una '); testo(50,30,'diversa costellazione zodiacale '); testo(10,50,'costellazioni'); setcolor(11); testo(560,20,'terra'); testo(530,50,'segni'); setcolor(2); testo(10,470,'SFASAMENTO TRA COSTELLAZIONI E SEGNI,PER PRECESSIONE '); for ag:=1 to 12 do begin SETCOLOR(14); rad:=a*3.14/180; rad1:=(a+10)*3.14/180; s:=trunc(r1*sin(rad)); c:=trunc(r2*cos(rad)); s1:=trunc(150*sin(rad1)); c1:=trunc(140*cos(rad1)); setfillstyle(ag,ag+1); fillellipse(x+s,y+c,30,30); (* cerchi zodiacali*) testo(x+s,y+c,zod[ag]); setcolor(10); testo(x+s1,y+c1,segno[ag]); a:=a+30; end; setcolor(5); testo(10,440,'la terra ruota da ovest verso est'); end; procedure terra(angolo:integer); var x,y,r1,r2,s2,c2,s3,c3,ang:integer; rad,rad2:real; begin x:=300; y:=250; for ang:=angolo to 360+ angolo do begin setcolor(14); if (ang=angolo) then testo(450,400,'il sole tramonta'); if (ang=angolo+180) then testo(450,410,'il sole sorge'); if (ang=angolo+270) then testo(450,420,'il sole culmina'); rad:=ang*3.14/180; rad2:=(90+ang)*3.14/180; s3:=trunc(40*sin(rad2)); c3:=trunc(40*cos(rad2)); s2:=trunc(40*sin(rad)); c2:=trunc(40*cos(rad)); setlinestyle(0,0,3); line(x,y,x+s3,y+c3); (* meridiano rotante *) line(x+s2,y+c2,x-s2,y-c2); (* orizzonte rotante *) testo(x+s2,y+c2,'W'); testo(x-s2,y-c2,'E'); delay(10); setcolor(3); line(x+s2,y+c2,x-s2,y-c2); line(x,y,x+s3,y+c3); testo(x+s2,y+c2,'W'); testo(x-s2,y-c2,'E'); end; setcolor(1); testo(450,400,'il sole tramonta'); testo(450,410,'il sole sorge'); testo(450,420,'il sole culmina'); end; procedure moto(disco1,disco2:vet); var x1, n,x,y,ang,s2,c2,r1,r2,conta,q:integer; rad1,g1,g2:real; begin for conta:=1 to anni do begin n:=1; x1:=100; x:=300; y:=250; r1:=180; r2:=180; for ang:=0 to 360 do begin rad1:=ang*3.14/180; s2:=trunc(r1*sin(rad1)); c2:=trunc(r2*cos(rad1)); g1:=int(ang/30); g2:=(ang/30); if (g1=g2) then q:=1; putimage(x+s2,y+c2,disco1,1); (* sole *) putimage(x-s2,y-c2,disco2,1); (* terra*) if (q=1) then line(x,y,x+s2,y+c2); setcolor(n+1); if (n>12 ) then testo(10,400,'fine rivoluzione'); if (n>12) then setcolor(1); if (q=1) then testo(10,x1,zod[n]); if (q=1) then testo(530,x1,segno[n]); if (q=1) then testo(10,150+x1,mesi[n]); if (q=1) then n:=n+1; if (q=1) then x1:=x1+10; if (q=1) then delay(tempo); (*if (q=1) then terra(ang);*) q:=0; delay(10); (* pausa per cambiare disco 10..100 *) putimage(x+s2,y+c2,disco1,1); putimage(x-s2,y-c2,disco2,1); putpixel(x+s2,y+c2,2); end; end; end; begin (* programma principale *) clrscr; SIMULA; grafica(1); (* attiva pagina grafica *) costante; (* disegno fisso terra *) setfillstyle(1,14); fillellipse(20,20,10,10); getimage(8,8,34,34,disco1);(* disco sole *) setfillstyle(2,2); fillellipse(500,20,10,10); (* disco terra*) getimage(488,8,514,34,disco2); moto(disco1,disco2); pausa; closegraph; end.
program terra2; (* rivoluzione terrestre e lunare con eclissi ogni mese *) (* su disco 65 dispensa 49 \tu54\terra2.mar *) uses crt,graph; type vet=array[1..800] of byte; const data:array[1..12] of integer=(18,50,85,120,153,187,221,255,288,322, 356,400); fase:array[1..12] of integer=(0,35,68,100,135,169,204,237,273,305, 340,0); var luna,terra,sole:vet; mesi:integer; procedure simula; begin writeln('simulazione moto di rivoluzione annuale della terra'); writeln('e moto di rivoluzione mensile della luna attorno alla terra'); writeln; writeln('approssimazioni varie per semplificare i calcoli:'); writeln('1 rivoluzione terrestre = 12 rivoluzioni lunari '); writeln('orbite descritte praticamente circolari,non ellittiche'); writeln('sole,terra,luna complanari:conseguenza:'); writeln('ogni plenilunio si verifica eclisse di luna'); writeln('ogni novilunio si verifica eclisse di sole'); writeln; writeln('indicare numero mesi:2..3..12..'); readln(mesi); clrscr; 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 pausa; (* premere return per proseguire *) var ch:char; begin outtextxy(400,450,'premi return,prego'); ch:=readkey; end; procedure testo(x,y:integer;nome:string); (* stampa legenda testo *) begin outtextxy(x,y,nome); end; procedure disco; begin setfillstyle(1,14); fillellipse(20,20,10,10); getimage(8,8,34,34,sole); setfillstyle(1,2); fillellipse(20,20,10,10); getimage(8,8,34,34,luna); testo(10,50,'luna'); setfillstyle(5,5); fillellipse(420,20,15,15); getimage(404,2,438,40,terra); testo(420,50,'terra'); end; procedure moto; var giri,m1,x,y,r1,r2,m,s1,c1,s2,c2,g1,g2,q1,q2,date,k:integer; rad,rad1,s,c:real; stringa:string; begin g1:=0; g2:=360; r1:=150; r2:=150; x:=300; y:=200; q1:=50; q2:=50; m1:=0; begin line(10,200,600,200); line(300,10,300,400); testo(250,190,'sole'); putimage(290,190,sole,1); testo(10,400,'piano della eclittica:'); testo(10,320,'giorni '); TESTO(10,410,'RIVOLUZIONE DELLA TERRA ATTORNO AL SOLE:anno'); testo(10,420,'rivoluzione della LUNA attorno alla terra:mese'); testo(10,430,'convenzione:1 anno = 12 rivoluzioni lunari '); testo(10,440,'ipotesi di complanarita di sole,luna,terra '); testo(10,450,'conseguenza:eclisse di sole e luna ogni mese'); for giri:=1 to mesi do begin for m:=g1 to g2 do begin if (m/12=int(m/12)) then m1:=m1+1; (* 1080 gradi lunari per 90 terra*) str(m1,stringa); setcolor(14); testo(20,300,stringa); delay(10); rad:=m1*3.14/180; s:=r1*sin(rad); c:=r2*cos(rad); s1:=trunc(s); c1:=trunc(c); putpixel(x+s1,y+c1,14); putimage(x+s1,y+c1,terra,1); rad1:=m*3.14/180; s2:=trunc(q1*sin(rad1)); c2:=trunc(q2*cos(rad1)); putpixel(x+s1+s2,y+c1+c2,5); putimage(x+s1+s2,y+c1+c2,luna,1); for date:=1 to 12 do begin if (m1=data[date]) then k:=1 else if (m1=fase[date]) then k:=2 else k:=0; if (k=1) then testo(10,350,'novilunio:eclisse di sole'); if (k=1) then putimage(290,190,luna,1); (* eclisse di sole *) if (k=2) then testo(350,350,'plenilunio:eclisse di luna'); if (k=2) then putimage(x+s1+s2,y+c1+c2,sole,1);(* eclisse luna *) if (k=2) then putimage(x+s1+s2,y+c1+c2,sole,1);(* eclisse luna *) end; delay(10); putimage(x+s1+s2,y+c1+c2,luna,1); setcolor(1); testo(20,300,stringa); testo(10,350,'novilunio:eclisse di sole'); testo(350,350,'plenilunio:eclisse di luna'); end; putimage(x+s1,y+c1,terra,1); end; end; end; begin (* programma principale *) clrscr; simula; grafica(1); (* attiva pagina grafica *) disco; moto; pausa; closegraph; end.
program terra3; (* rivoluzione terrestre e lunare con eclissi e retrocessione nodale *) (* su disco 65 dispensa 49 \tu54\terra3.mar *) uses crt,graph; type vet=array[1..800] of byte; const data:array[1..12] of integer=(17,50,83,115,148,181,213,246,279, 311,344,378); fase:array[1..12] of integer=(1,33,64,97,130,163,197,230,264,296, 329,363); var luna,terra,sole:vet; mesi:integer; procedure simula; begin writeln('simulazione moto di rivoluzione annuale della terra'); writeln('e moto di rivoluzione mensile della luna attorno alla terra'); writeln; writeln('approssimazioni varie per semplificare i calcoli:'); writeln('1 rivoluzione terrestre = 12 rivoluzioni lunari '); writeln('orbite descritte praticamente circolari,non ellittiche'); writeln('sole,terra complanari:orbita lunare inclinata '); writeln('eclisse di sole o di luna solo se novilunio o plenilunio'); writeln('con sole,terra,luna allineati su linea nodale:'); writeln('e complanari:sole,luna,terra su piano della eclittica'); writeln; writeln('lo spostamemto retrogrado della linea nodale comporta'); writeln('la anticipazione delle ecclissi ogni anno rispetto alla'); writeln('data della eclisse dello anno precedente'); writeln; writeln('indicare numero mesi:2..3..12..:prova completa=12 mesi'); readln(mesi); clrscr; 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 pausa; (* premere return per proseguire *) var ch:char; begin outtextxy(400,450,'premi return,prego'); ch:=readkey; end; procedure testo(x,y:integer;nome:string); (* stampa legenda testo *) begin outtextxy(x,y,nome); end; procedure disco; begin setfillstyle(1,14); fillellipse(20,20,10,10); getimage(8,8,34,34,sole); setfillstyle(1,2); fillellipse(20,20,10,10); getimage(8,8,34,34,luna); testo(10,50,'luna'); setfillstyle(5,5); fillellipse(420,20,15,15); getimage(404,2,438,40,terra); testo(420,50,'terra'); end; procedure moto(n1,n6,p1,p6:integer); var date,giri,m1,x,y,r1,r2,m,s1,c1,s2,c2,g1,g2,q1,q2,k,h:integer; rad,rad1,s,c:real; stringa:string; begin g1:=0; g2:=mesi*360; r1:=150; r2:=150; x:=300; y:=200; q1:=50; q2:=50; m1:=0; begin (*line(10,200,600,200); line(300,10,300,400);*) testo(250,190,'sole'); putimage(290,190,sole,1); testo(10,400,'piano della eclittica:'); testo(10,320,'giorni '); TESTO(10,410,'RIVOLUZIONE DELLA TERRA ATTORNO AL SOLE:anno'); testo(10,420,'rivoluzione della LUNA attorno alla terra:mese'); testo(10,430,'convenzione:1 anno = 12 rivoluzioni lunari '); testo(10,440,'ipotesi :orbita lunare inclinata rispetto a eclittica '); testo(10,450,'eclisse astri allineati su linea nodale o prossimi'); (*for giri:=1 to mesi do begin *) for m:=g1 to g2 do begin if (m/12=int(m/12)) then m1:=m1+1; (* 1080 gradi lunari per 90 terra*) str(m1,stringa); setcolor(14); testo(20,300,stringa); (*delay(10);*) rad:=m1*3.14/180; s:=r1*sin(rad); c:=r2*cos(rad); s1:=trunc(s); c1:=trunc(c); (*putpixel(x+s1,y+c1,14);*) putimage(x+s1,y+c1,terra,1); rad1:=m*3.14/180; s2:=trunc(q1*sin(rad1)); c2:=trunc(q2*cos(rad1)); (*putpixel(x+s1+s2,y+c1+c2,5);*) putimage(x+s1+s2,y+c1+c2,luna,1); for date:=1 to 12 do begin if (m1=data[date]) then h:=1 else if (m1=fase[date]) then h:=2 else h:=0; if (h=1) then testo(10,330,'novilunio'); if (h=2) then testo(10,60,'plenilunio'); end; if (m1=data[n1]) or (m1=data[n6] )then k:=1 else if (m1=fase[p1]) or (m1=fase[p6]) then k:=2 else k:=0; if (k=2) then line (x,y,x+s1+s2,y+c1+c2); if (k=1) then testo(10,350,'novilunio:eclisse di sole'); if (k=1) then putimage(290,190,luna,1); (* eclisse di sole *) if (k=2) then testo(350,350,'plenilunio:eclisse di luna'); if (k=2) then putimage(x+s1+s2,y+c1+c2,sole,1);(* eclisse luna *) if (k=2) then putimage(x+s1+s2,y+c1+c2,sole,1);(* eclisse luna *) delay(1); putimage(x+s1+s2,y+c1+c2,luna,1); setcolor(1); testo(20,300,stringa); testo(10,350,'novilunio:eclisse di sole'); testo(350,350,'plenilunio:eclisse di luna'); testo(10,330,'novilunio'); testo(10,60,'plenilunio'); putimage(x+s1,y+c1,terra,1); end; end; putimage(290,190,sole,1); end; begin (* programma principale *) clrscr; simula; grafica(1); (* attiva pagina grafica *) disco; moto(3,8,3,8); setcolor(14); moto(2,7,2,7); setcolor(14); moto(1,6,1,6); setcolor(14); pausa; closegraph; end.
program terra5; (* rivoluzione terrestre e lunare con eclissi e retrocessione nodale *) (* su disco 65 dispensa 49 \tu54\terra5.mar *) uses crt,graph; type vet=array[1..800] of byte; var luna,terra,sole:vet; orbita,m,m1,sidereo:integer; procedure simula; begin writeln('simulazione moto di rivoluzione annuale della terra'); writeln('e moto di rivoluzione mensile della luna attorno alla terra'); writeln; writeln('approssimazioni varie per semplificare i calcoli:'); writeln('1 rivoluzione terrestre = 12 rivoluzioni lunari '); writeln('orbite descritte praticamente circolari,non ellittiche'); writeln('sole,terra complanari:orbita lunare inclinata '); writeln('eclisse di sole o di luna solo se novilunio o plenilunio'); writeln('con sole,terra,luna allineati su linea nodale o prossimi:'); writeln('e complanari:sole,luna,terra su piano della eclittica'); writeln; writeln('lo spostamemto retrogrado della linea nodale comporta'); writeln('la anticipazione delle ecclissi ogni anno rispetto alla'); writeln('data della eclisse dello anno precedente'); writeln; writeln('SI PROGRAMMA SIMULAZIONE PER TRE ANNI CON RETROCESSIONE '); WRITELN; writeln('indicare se si desidera persistenza orbite si=1..no=2 '); readln(orbita); WRITELN('indicare se si desidera visualizzare mese sidereo si=1..no=2'); readln(sidereo); clrscr; 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 pausa; (* premere return per proseguire *) var ch:char; begin outtextxy(400,350,'premi return,prego'); ch:=readkey; end; procedure testo(x,y:integer;nome:string); (* stampa legenda testo *) begin outtextxy(x,y,nome); end; procedure disco; begin setfillstyle(1,14); fillellipse(20,20,10,10); getimage(8,8,34,34,sole); setfillstyle(1,2); fillellipse(20,20,10,10); getimage(8,8,34,34,luna); testo(10,50,'luna'); setfillstyle(5,5); fillellipse(420,20,15,15); getimage(404,2,438,40,terra); testo(420,50,'terra'); end; procedure moto(n1,n2,n3,n4:integer); var x,y,r1,s1,c1,s2,c2,q1:integer; rad,rad1:real; stringa:string; begin r1:=150; x:=300; y:=200; q1:=50; begin testo(250,190,'sole'); putimage(290,190,sole,1); testo(10,400,'piano della eclittica:'); testo(10,320,'giorni '); TESTO(10,410,'RIVOLUZIONE DELLA TERRA ATTORNO AL SOLE:anno'); testo(10,420,'rivoluzione della LUNA attorno alla terra:mese'); testo(10,430,'convenzione:1 anno = 12 rivoluzioni lunari '); testo(10,440,'ipotesi :orbita lunare inclinata rispetto a eclittica '); testo(10,450,'eclisse astri allineati su linea nodale o prossimi'); while m1<361 do begin m1:=m1+1; (* giorni di rivoluzione terrestre *) str(m1,stringa); setcolor(14); testo(20,300,stringa); rad:=m1*3.14/180; (* terra rivoluzione 360 gradi/anno *) s1:=trunc(r1*sin(rad)); c1:=trunc(r1*cos(rad)); if (orbita=1) then putpixel(x+s1,y+c1,14); putimage(x+s1,y+c1,terra,1); rad1:=m*3.14/180; s2:=trunc(q1*sin(rad1)); c2:=trunc(q1*cos(rad1)); if (orbita=1) then putpixel(x+s1+s2,y+c1+c2,15); putimage(x+s1+s2,y+c1+c2,luna,1); setcolor(14); if (m/360= int(m/360)) then testo(10,100,'inizio,fine,mese sidereo'); if (sidereo=1) and (m/360 = int(m/360)) then delay(1000); m:=m+18; (* modulo rivoluzione lunare *) if (m1=n1) or (m1=n2) then testo(10,150,'eclisse di sole'); if (m1=n1) or (m1=n2) then line(290,190,x+s1+s2,y+c1+c2); if (m1=n1) or (m1=n2) then putimage(290,190,luna,1); if (m1=n1) or (m1=n2) then delay(4000); if (m1=n3) or (m1=n4) then testo(10,160,'eclisse di luna'); if (m1=n3) or (m1=n4) then putimage(x+s1+s2,y+c1+c2,sole,1); if (m1=n3) or (m1=n4) then delay(4000); delay(30); (* pausa per persistenza immagine *) putimage(x+s1+s2,y+c1+c2,luna,0); if (m1=360) then delay(3000); (*pausa dopo ogni 360 giorni *) setcolor(1); testo(20,300,stringa); testo(10,100,'inizio,fine,mese sidereo'); testo(10,150,'eclisse di sole'); testo(10,160,'eclisse di luna'); putimage(x+s1,y+c1,terra,1); putimage(x+s1+s2,y+c1+c2,luna,1); putimage(290,190,sole,0); end; end; putimage(290,190,sole,1); end; begin (* programma principale *) clrscr; simula; grafica(1); (* attiva pagina grafica *) disco; setcolor(14); m1:=0; m:=0; moto(54,223,63,235); (* regressione linea nodale *) setcolor(14); m:=0; m1:=0; moto(33,202,43,213); m:=0; m1:=0; setcolor(14); moto(2,181,12,191); (* regressione linea nodale *) setcolor(14); pausa; closegraph; end.
program tempo1; (* MOTO della terra diurno e attorno al sole *) (* su disco 65 dispensa 49 \TU55\tempo1.mar *) (* girno solare giorno sidereo *) uses crt,graph; type vet=array[1..800] of byte; var disco2,d1,d2,d3,d4,d5:vet; TEMPO,anni:INTEGER; 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 pausa; (* premere return per proseguire *) var ch:char; begin setcolor(14); outtextxy(400,440,'premi return,prego'); ch:=readkey; setcolor(1); outtextxy(400,440,'premi return,prego'); end; procedure testo(x,y:integer;nome:string); (* stampa legenda testo *) begin outtextxy(x,y,nome); end; procedure costante(disco2:vet); (* sole stella orbita fissa *) var r,s,c,ang,x,y:integer; rad:real; begin r:=150; x:=300; y:=200; setlinestyle(0,0,1); line(1,y,600,y); line(1,y+70,160,y+70); setcolor(10); testo(10,y,'*') ; testo(10,y+70,'*'); putimage(x-15,y-15,disco2,1); (* sole *) setcolor(14); for ang:=0 to 360 do begin rad:=ang*3.14/180; s:=trunc(r*sin(rad)); c:=trunc(r*cos(rad)); putpixel(x+s,y+c,2); end; end; procedure terra(d1,d2,d3,d4,d5:vet;fase:integer); (* moto terra *) var r,s,c,ang,x,y,x1,y1:integer; rad:real; begin r:=150; x:=300; y:=200; x1:=x-r-15; y1:=y-15; s:=trunc(r*sin(fase*3.14/180)); c:=trunc(r*cos(fase*3.14/180)); x1:=x-15+s; y1:=y-15+c; testo(10,50,'inizio giorno sidereo e solare'); putimage(x1,y1,d1,1); delay(1000); putimage(x1,y1,d1,1); putimage(x1,y1,d2,1); delay(1000); setcolor(1); testo(10,50,'inizio giorno sidereo e solare'); putimage(x1,y1,d2,1); putimage(x1,y1,d3,1); delay(1000); putimage(x1,y1,d3,1); putimage(x1,y1,d4,1); delay(1000); putimage(x1,y1,d4,1); putimage(x1,y1,d1,1); setcolor(2); if (fase=270) then testo(10,60,'fine giorno solare'); testo(10,50,'fine giorno sidereo'); pausa; setcolor(1); testo(10,50,'fine giorno sidereo'); if (fase=270) then testo(10,60,'fine giorno solare'); putimage(x1,y1,d1,1); setcolor(14); if (fase=300) then line (x,y,x1,y1+17); if (fase=300) then putimage(x1,y1,d5,1); if (fase=300) then testo(10,60,'fine giorno solare'); pausa; setcolor(1); testo(10,60,'fine giorno solare'); end; begin (* programma principale *) clrscr; grafica(1); (* attiva pagina grafica *) testo(10,40,'sole'); testo(500,40,'terra'); testo(500,50,'stella fissa *'); setfillstyle(1,14); fillellipse(20,20,10,10); getimage(8,8,34,34,disco2);(* disco sole *) setfillstyle(1,2); fillellipse(500,20,10,10); (* disco terra 1*) setlinestyle(0,0,3); line(490,20,510,20); line(500,10,500,20); getimage(488,8,514,34,d1); fillellipse(500,20,10,10); (* disco terra 2*) setlinestyle(0,0,3); line(490,20,500,20); line(500,10,500,30); getimage(488,8,514,34,d2); fillellipse(500,20,10,10); (* disco terra 3 *) setlinestyle(0,0,3); line(490,20,510,20); line(500,20,500,30); getimage(488,8,514,34,d3); fillellipse(500,20,10,10); (* disco terra 4 *) setlinestyle(0,0,3); line(500,10,500,30); line(500,20,510,20); getimage(488,8,514,34,d4); fillellipse(500,20,10,10); (* disco terra 5 *) setlinestyle(0,0,3); line(490,25,510,15); line(495,10,500,20); getimage(488,8,514,34,d5); costante(disco2); testo(350,400,'giorno solare=giorno sidereo'); testo(350,410,'se la ruotasse senza rivoluzione'); terra(d1,d2,d3,d4,d5,270); setcolor(1); testo(350,400,'giorno solare=giorno sidereo'); testo(350,410,'se la ruotasse senza rivoluzione'); setcolor(2); testo(10,370,'giorno solare > giorno sidereo:4 minuti'); testo(10,380,'per rivoluzione di 1 grado attorno al sole'); terra(d1,d2,d3,d4,d5,300); setcolor(14); testo(10,400,'il giorno solare varia durante il corso annuale'); testo(10,410,'infatti la terra descrive archi variabili per'); testo(10,420,'effetto della diversa velocita nella orbita ellittica'); pausa; end.
program solare1; (* su disco 65 dispensa 45 \tu56\solare1.mar *) (* moto diurno del sole e della luna*) (* novilunio,quadratura,plenilunio *) uses crt,graph; type vet=array[1..800] of byte; var sole,luna:vet; luogo1,luogo2,culmina:string; t,orbite,sosta:integer; procedure simula; (* introduzione a programma *) begin writeln('simulazione moto diurno del sole e della luna'); writeln('novilunio,quadratura,plenilunio '); writeln('il sole e la luna si muovono da est verso ovest'); writeln('viene indicata la fase'); writeln('viene indicata ora del sorgere,culminazione,tramonto'); 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 1,2,3,4..'); readln(orbite); orbite:=360*orbite; writeln('scrivi valore pausa punti speciali'); writeln('1000...2000...5000....prova 1000 '); readln(sosta); 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,sosta1:integer; rad,rad1,s,c:real; 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)); 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(480,p1,luogo2); if m=180 then outtextxy(270,cu,culmina); if (m=90) or(m=180) or(m=270) or (m=360) then sosta1:=sosta; delay(sosta1); sosta1:=0; end; delay(t); 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(150,210,450,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,'attendere inizio simulazione,prego'); setfillstyle(1,14); fillellipse(20,20,10,10); (* sole *) getimage(5,5,35,35,sole); (* vettore sole *) setfillstyle(3,5); fillellipse(500,20,10,10); (* luna*) getimage(485,5,515,35,luna); (* vettore luna *) 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' 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,290,'novilunio'); luogo1:='sorge alle 6'; luogo2:='tramonta alle 18'; culmina:='culmina alle 12'; moto(-280,190,0,400,-250,160,150,sole,luna,luogo1,luogo2); (* animazione *) setcolor(4); testo(270,300,'primo quarto'); luogo1:='sorge alle 12'; luogo2:='tramonta alle 24 '; culmina:='culmina alle 18'; moto(-280,190,90,410,250,-160,160,sole,luna,luogo1,luogo2); setcolor(5); testo(270,310,'plenilunio'); luogo1:='sorge alle 18'; luogo2:='tramonta alle 6'; culmina:='culmina alle 24'; moto(-250,190,180,420,-250,160,170,luna,sole,luogo1,luogo2); setcolor(2); testo(270,320,'ultimo quarto'); luogo1:='sorge alle 24'; luogo2:='tramonta alle 12'; culmina:='culmina alle 6'; moto(-250,190,90,430,250,-160,180,luna,sole,luogo1,luogo2); readln; scelta; (* opzione fine o rivedere *) end; begin programma; (* programma principale *) pausa; end.
program sole1; (* su disco 65 dispensa 49 \tu56\sole1.mar *) (* 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('il sole si sposta apparentemente da est a ovest'); writeln('descrivendo archi di diversa ampiezza'); writeln('spostando il punto del sorgere e tramontare'); writeln('e raggiungemdo altezze variabili con la stagione'); 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=175 then outtextxy(240,300,'il sole culmina a sud'); if (m=175) or (m=90) or (m=270) then delay(2000); end; 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); ch:=upcase(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 *) 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.