astronomia con pascal

esci turboastro.htm

leggi di Keplero

program keplero;
(* leggi di keplero *)
(* su disco 65 dispensa 49 \tu55\keplero.mar *)

uses crt,dos,graph;
type vet=array[1..800] of byte;
var sole,pianeta1,pianeta2:vet;
tempo,anni:integer;

procedure simula;
begin
textcolor(2);
textbackground(4);
writeln('rappresentazione delle tre leggi di KEPLERO............... ');
writeln;
writeln('si visualizza:.............................................');
writeln('sole,linea apsidale,afelio,perielio........................');
writeln('prima,seconda,terza legge con testo esplicativo............');
writeln('e pianeta o pianeti in rivoluzione attorno al sole.........');
writeln('-----------------------------------------------------------');
writeln('indicare velocita per rivoluzione.1.5.10 prova 1...........');
readln(tempo);
writeln('indicare numero volte per rivedere ogni legge 1.2.3.prova 1');
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 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
setcolor(14);
testo(10,450,'premi return,prego');
ch:=readkey;
setcolor(1);
testo(10,450,'premi return,prego');
end;



procedure dischi;
begin
setfillstyle(1,14);
fillellipse(20,20,10,10);
getimage(8,8,34,34,sole);
setfillstyle(1,5);
fillellipse(20,20,10,10);
getimage(8,8,34,34,pianeta1);
testo(10,40,'pianeta');
setfillstyle(2,2);
fillellipse(20,20,10,10);
getimage(8,8,34,34,pianeta2);
setcolor(14);
settextstyle(1,0,3);
testo(10,190,'afelio');
testo(550,190,'perielio');
testo(300,190,'sole');
settextstyle(0,0,1);
end;

procedure moto(sole,pianeta1:vet;k:integer);
var x,y,rx,ry,s,c,a,GIRI,ritardo,nota:integer;
rad:real;

begin
x:=300;
y:=200;
rx:=200;
ry:=150;
ritardo:=100;
nota:=100;
setcolor(2);

line(x-250,y,x+250,y);
putimage(x+40,y-10,sole,1);
FOR GIRI:=1 TO anni DO
BEGIN
setcolor(14);
for a:=0 to 360 do
begin
rad:=a*3.14/180;
s:=trunc(rx*sin(rad));
c:=trunc(ry*cos(rad));
putpixel(x+s,y+c,14);
putimage(x-10+s,y-10+c,pianeta1,1);
putpixel(x+s,y+c,14);
delay(tempo); (* variazione velocita *)
delay(ritardo);
if (a>=0) and (a<=180) then nota:=nota+1
else nota:=nota-1;
sound(nota);
if (a>=0 ) and (a<=90) then ritardo:=ritardo-1;
if (a>90 ) and (a<=270) then ritardo:=ritardo+1;
if (a>270) and (a<360) then ritardo:=ritardo-1;
putimage(x-10+s,y-10+c,pianeta1,1); (* cancella pianeti *)
if (k=2) and (a>=60) and (a<=120) then line(x+40,y,x+5+s,y+c);
if (k=2) and (a>=250) and(a<=290) then line(x+40,y,x-5+s,y+c);

end;
end;
END;


procedure moto1(pianeta1:vet;k:integer);
var x,y,rx,ry,s,c,a,GIRI,s1,c1,ritardo,nota:integer;
rad,rad2:real;
min,sec:string;
ora,minuti,secondi,decimi:word;

begin
x:=300;
y:=200;
rx:=200;
ry:=150;
ritardo:=100;
nota:=100;
setcolor(2);
testo(500,380,'minuti-secondi');
FOR GIRI:=1 TO anni DO
BEGIN
setcolor(14);
for a:=0 to 360 do
begin
rad:=a*3.14/180;
rad2:=(a)*3.14/180;
s:=trunc(rx*sin(rad));
c:=trunc(ry*cos(rad));
s1:=trunc((rx+20)*sin(rad2));
c1:=trunc((ry+20)*cos(rad2));
if (k=3) then putpixel(x+s,y+c,14);
if (k=3) then putimage(x-10+s,y-10+c,pianeta1,1);
putpixel(x+s,y+c,14);
if (k=4) then putpixel(x+s1,y+c1,2);
if (k=4) then putimage(x-10+s1,y-10+c1,pianeta2,1);
delay(tempo); (* variazione velocita *)
delay(ritardo);
gettime(ora,minuti,secondi,decimi);
str(secondi,sec);
str(minuti,min);
if (k=3) then testo(500,400,min+' '+sec);
if (k=4) then testo(500,420,min+' '+sec);
if (a>=0) and (a<=180) then nota:=nota+1
else nota:=nota-1;
sound(nota);
if (k=4) then delay(100);
if (a>=0 ) and (a<=90) then ritardo:=ritardo-1;
if (a>90 ) and (a<=270) then ritardo:=ritardo+1;
if (a>270) and (a<360) then ritardo:=ritardo-1;
if (k=3) then putimage(x-10+s,y-10+c,pianeta1,1); (* cancella pianeti *)
if (k=4) then putimage(x-10+s1,y-10+c1,pianeta2,1);
setcolor(1);
if (k=3) then testo(500,400,min+' '+sec);
if (k=4) then testo(500,420,min+' '+sec);
setcolor(14);

end;
if (k=3) then testo(500,400,min+' '+sec);
if (k=4) then testo(500,420,min+' '+sec);
end;
END;

begin (* programma principale *)
clrscr;
simula;
grafica(1); (* attiva pagina grafica *)
dischi;
setcolor(2);
testo(10,360,'ogni pianeta descrive orbite ellittiche attorno al sole');
testo(10,370,'il sole si trova su un fuoco della ellisse');
testo(10,380,'la linea apsidale congiunge afelio e perielio');
setcolor(2);
SETTEXTSTYLE(1,0,3);
testo(300,10,'PRIMA LEGGE DI KEPLERO');
moto(sole,pianeta1,1);
TESTO(300,30,'SECONDA LEGGE DI KEPLERO');
settextstyle(0,0,1);
TESTO(10,390,'raggio congiungente pianeta con sole descrive ');
testo(10,400,'aree equivalenti in tempi uguali:ne consegue ');
testo(10,410,'che la velocita varia nel corso della orbita ');
testo(10,420,'massima in perielio e minima in afelio ');
moto(sole,pianeta1,2);
setcolor(5);
settextstyle(1,0,3);
testo(300,50,'terza legge di keplero');
settextstyle(0,0,1);
testo(10,430,'i quadrati dei tempi di rivoluzione dei pianeti');
testo(10,440,'sono proporzionali ai cubi delle distanze dal sole');
settime(00,00,00,00);
moto1(pianeta2,3);
settime(00,00,00,00);
moto1(pianeta2,4);
nosound;
pausa;
end.