precessione asse terrestre, stagioni, sistema terra luna

precex2,stagione, sistema1


program precex2;
(* precessione asse terrestre *)
(* su disco 65\tu53\ dispensa 49 con turbo pascal v.5 *)

uses crt,graph;

var     sosta,fissa,gradi:integer;

procedure presenta;
var stringa:string[30];
begin;
stringa:='premi return,prego';
writeln('simulazione precessione asse terrestre');
writeln;
writeln('moto di precessione asse di rotazione terrestre');
writeln('attorno ad asse della eclittica in circa 26000 anni');
writeln('in senso contrario a quello di rotazione terrestre');
writeln;
writeln('cause principali:');
writeln('1..asse rotazione inclinato rispetto piano eclittica..66 gradi');
writeln('2..terra in rotazione attorno ad asse nord-sud');
writeln('3..rigonfiamento equatoriale globo terrestre');
writeln('4..attrazione luni-solare variabile nel tempo');
WRITELN(stringa);READLN; clrscr;
WRITELN('CONSEGUENZA :');
writeln('il rigonfiamento equatoriale viene attratto in modo diverso');
writeln('dal sole e dalla luna nel corso del tempo:');
writeln('periodo annuale:influenza del sole');
writeln('periodo mensile:influenza della luna');
writeln('EFFETTO LUNARE:NUTAZIONE ,ondulazione moto precessione');
writeln('come effetto si dovrebbe verificare il raddrizzamento assiale');
writeln('riportando il piano equatoriale sul piano della eclittica');
writeln('e asse rotazione parallelo ad asse eclittica');
writeln;
writeln('si verifica invece un moto di rotazione assiale attorno');
writeln('ad asse della eclittica,in circa 26000 anni');
writeln('ridotto a circa 21000 anni per spostamento linea apsidale');
writeln(stringa);readln;clrscr;
writeln('CONSEGUENZE MOTO DI PRECESSIONE:');
writeln('1..anticipazione degli equinozi :20 minuti ogni anno');
writeln('2..anno tropico minore di anno sidereo');
writeln('3..variazione durata delle stagioni');
writeln('4..sfasamento tra segni zodiacali e costellazioni zodiacali');
writeln('5..variazione polo celeste..polare..vega..');
writeln('6..variazione coordinate stellari...');
writeln(stringa);readln;clrscr;
writeln('indica tempo per velocita:100 rapido...1000 lento');readln(sosta);
writeln('indica modulo angolare:2..5..10...prova 2...');readln(gradi);
writeln(stringa);
readln;
end;

procedure grafica(f,sc,tp:integer);   (* attiva pagina grafica*)
var    stringa:string;
begin
 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(2);
testo(10,400,'premi return,prego');
 ch:=readkey;
 setcolor(1);
 testo(10,400,'premi return,prego');
end;

procedure terra;
var x:integer;
begin
x:=200;
 circle(x,200,20);
 circle(500,200,20);  (* sole*)
 line(x,10,x,400);    (* asse eclittica*)
 line(10,200,500,200);(* piano eclittica*)
 testo(100,10,'asse eclittica');
 testo(10,190,'piano eclittica');
 testo(210,30,'      *  polare ');
 testo(40,30,'vega     *  ');
 testo(500,300,'sole');
 testo(100,380,'asse terrestre inclinato 23 gradi rispetto asse eclittica ');
end;

procedure sistema;   (* indica forze attrazione sole-luna-terra *)
var x,a1,b1,ang:integer;
    sx,sy:real;
begin
x:=200;
ang:=25;
 circle(x,200,100);   (* terra *)
 circle(500,200,30);(* sole *)
 line(x,10,x,400);    (* asse eclittica*)
 line(10,200,500,200);(* piano eclittica*)
 testo(100,10,'asse eclittica');
 testo(10,190,'piano eclittica');
 for ang:=25 downto 0 do
 begin
 sx:=sin(ang*3.14/180);
 sy:=cos(ang*3.14/180);
 a1:=trunc(100*sx);
 b1:=trunc(100*sy);
 setcolor(2);
 testo(100,380,'asse terrestre inclinato 23 gradi rispetto asse eclittica ');
 line(x+a1,200+b1,x-a1,200-b1);
 testo(100,100,'nord');
 testo(250,300,'sud');
 setcolor(4);
 line(x+b1,200-a1,x-b1,200+a1);
 testo(100,250,'equatore');
 testo(100,390,'equatore inclinato 23 gradi rispetto piano eclittica');
 setcolor(14);
 testo(200,20,'centro terra e sole su piano eclittica');
 line(500,200,x+b1,200-a1);
 line(500,200,x+-b1,200+a1);
 testo(300,150,'A ');
 testo(100,270,'B ');
 testo(200,30,'attrazione del sole su rigonfiamento equatoriale');
 testo(200,40,'massima in A ,minima in B');
 testo(200,50,'tendenza al raddrizzamento asse rotazione');
 delay(sosta);
 setcolor(1);
 if (ang=0) then setcolor(2);
 line(x+a1,200+b1,x-a1,200-b1);
 testo(100,100,'nord');
 testo(250,300,'sud');
 if (ang=0) then setcolor(14);
 line(500,200,x+b1,200-a1);
 line(500,200,x-b1,200+a1);
 if (ang=0) then setcolor(4);
 line(x+b1,200-a1,x-b1,200+a1);
 if (ang=0) then setcolor(1);
 testo(300,150,'A ');
 testo(100,270,'B ');
 end;
 end;

procedure cerchi;
begin
circle(200,100,40);
circle(200,300,40);
end;

procedure moto(x,y,x1,y1,fissa:integer);
var s,c,a,r,n,s1,c1,girate:integer;
    rad,rad1:real;
begin
r:=40;
n:=0;
cerchi;
girate:=trunc(360/gradi);
for a:=0 to girate do
 begin
 setcolor(14);
 circle(x,200,20);
 line(x,10,x,400);    (* asse eclittica*)
 line(10,200,500,200);(* piano eclittica*)
 rad:=n*3.14/180;
 rad1:=(180+n)*3.14/180;
 c:=-trunc(r*cos(rad));
 s:=trunc(r*sin(rad));
 c1:=-trunc(r*cos(rad1));
 s1:=trunc(r*sin(rad1));
 if (n>=90) then setcolor(2);
 line(x+s,y+c,x+s1,y1+c1);
 if (fissa=2) then  testo(x+s,y+c-20,'N');
 if (fissa=2) then  testo(x+s1,y1+c1+20,'S');
 cerchi;
 if (n=90) then testo(300,50,'anno 1990:asse rivolto verso la polare');
 if (n=270) then testo(300,50,'anno 13000:asse rivolto verso vega ');
 if (n>=270) then setcolor(4);
 if (n=90) or (n=270) then pausa;
 delay(sosta);
 setcolor(1);
 if (fissa=2) then line(x+s,y+c,x+s1,y1+c1);
 if (fissa=2) then testo(x+s,y+c-20,'N');
 if (fissa=2) then testo(x+s1,y1+c1+20,'S');
 if (n=90) then testo(300,50,'anno 1990:asse rivolto verso la polare');
 if (n=270) then testo(300,50,'anno 13000:asse rivolto verso vega ');
 n:=n+gradi;
 end;
end;

 begin                    (* programma principale *)
 clrscr;
 presenta;
 grafica(1,0,0);          (* attiva pagina grafica f,sc,tp *)
 sistema;                 (* sistema terra sole e attrazione *)
 pausa;
 grafica(1,0,0);
 terra;
 moto(200,100,200,300,1);   (* x y x1 y1 *)
 pausa;
 grafica(1,0,0);
 terra;
 moto(200,100,200,300,2);
 setcolor(14);
 terra;
 cerchi;
 pausa;
 end.

program stagione;
(* spostamento linea equinoziale e durata stagioni *)
(* su disco 65 dispensa 49 \tu55\stagione.mar *)

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

procedure simula;
 begin
  textcolor(2);
  textbackground(4);
  writeln('rappresentazione diversa durata delle stagioni............ ');
  writeln;
  writeln('si visualizza:.............................................');
  writeln('sole,linea apsidale,afelio,perielio........................');
  writeln('linea equinoziale e sua precessione........................');
  writeln('terra   in rivoluzione attorno al sole.....................');
  writeln('varia durata stagioni per spostamento linea equinoziale....');
  writeln('-----------------------------------------------------------');
  writeln('indicare velocita per rivoluzione.1.5.10 prova 1...........');
  readln(tempo);
  writeln('indicare numero anni....1..12............prova 12..........');
  readln(anni);
  writeln('indicare valore precessione 15..30..45...prova 30..........');
  readln(pre);
  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,'terra');
 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);
var x,y,rx,ry,s,c,a,GIRI,k,s1,c1,b,co,a1:integer;
    rad,rad2:real;

begin
 x:=300;
 y:=200;
 rx:=200;
 ry:=150;
 co:=2;
 a1:=0;
 setcolor(2);
 line(x+50,y-150,x+50,y+150);
 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:=a1 to 360+a1 do
  begin
  rad:=a*3.14/180;
  rad2:=(360+a)*3.14/180;
  s:=trunc(rx*sin(rad));
  c:=trunc(ry*cos(rad));
   s1:=-trunc(rx*sin(rad2));
  c1:=trunc(ry*cos(rad2));
  putpixel(x+50-s1,y+c1,14);
  delay(tempo);    (* variazione velocita *)
  delay(1);
  if (a>=a1) and (a<=180+a1) then k:=1
   else k:=0;
  if (k=1) then line(x+50,y,x+50-s,y+c);
  setcolor(co);
  end;
 begin
 setcolor(14);
 testo(10,350,'equinozio di primavera');
 testo(10,360,'precessione linea equinoziale');
 for b:=180-a1 to 540-a1  do
 begin
  rad2:=(360+b)*3.14/180;
   s1:=-trunc(rx*sin(rad2));
  c1:=trunc(ry*cos(rad2));
  putimage(x+50-s1,y+c1,pianeta1,1);
  delay(tempo);    (* variazione velocita *)
  delay(1);
  putimage(x+50-s1,y+c1,pianeta1,1);   (* cancella pianeti *)
  if (b=540-a1) then putimage(x+50-s1,y+c1,pianeta1,1);
  setcolor(co);
  a1:=a1+pre;
  co:=co+1;
  if (co=15) then co:=2;
  end;
  setcolor(1);
  testo(10,350,'equinozio di primavera');
  testo(10,360,'precessione linea equinoziale');
  end;
 END;
 end;

 begin                    (* programma principale *)
 clrscr;
 simula;
 grafica(1);              (* attiva pagina grafica *)
 dischi;
 setcolor(2);
 testo(10,380,'la linea apsidale congiunge afelio e perielio');
 testo(10,390,'la linea equinoziale si sposta in senso orario');
 testo(10,400,'avvicinandosi agli apsidi:20 minuti ogni anno ');
 setcolor(2);
 SETTEXTSTYLE(1,0,3);
 testo(300,10,'variazione durata stagioni');
 testo(10,410,'semestre estivo : zona con tratteggio');
 settextstyle(0,0,1);
 testo(400,440,'tra equinozi 21/3 e 22/9 ');
 moto(sole,pianeta1);
 pausa;
 end.

program sistema1;
(* spostamento sistema terra luna attorno al sole *)

uses crt,graph;

type vet=array[1..800] of byte;
const novi:array[1..11] of integer=(8,25,41,58,74,90,107,123,139,156,172);
      pleni:array[1..11] of integer=(16,32,49,65,81,98,115,132,148,165,180);
var   luna,terra:vet;
      tempo,sosta:integer;

procedure simula;
 begin
  writeln('simulazione rivoluzione annuale terra-luna attorno al sole');
  writeln('e rivoluzione sistema terra-luna attorno a baricentro comune');
  writeln;
  writeln('indicare valore per velocita...:veloce=10...lento=5000..');
  writeln('prova 1000.....');
  readln(tempo);
  writeln('indicare se si desidera visualizzare avviso per ogni');
  writeln('plenilunio e novilunio: si=1...no=2...');
  writeln('con NO si rende piu visibile rotazione sistema,senza scritte');
  writeln('prova entrambi i modi...');
  readln(sosta);
  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
testo(10,400,'premi return,prego');
 ch:=readkey;
end;

procedure disco;
begin
setfillstyle(1,2);
fillellipse(20,20,10,10);
getimage(8,8,34,34,luna);
putimage(500,20,luna,1);
testo(500,50,'luna');
setfillstyle(1,14);
fillellipse(20,20,15,15);
getimage(2,2,40,40,terra);
testo(20,50,'terra');
end;

procedure moto;
var x,y,st,ct,sl,cl,s,c,a,b,r,rt,rl,giri,date,px:integer;
    rad1,rad:real;
    stringa:string;

begin
setfillstyle(2,14);
x:=300;
y:=200;
r:=150;
if (sosta=1) then rt:=5
 else rt:=10;
rl:=50;
giri:=0;
a:=0;
b:=0;
fillellipse(x,y,30,30); (* sole *)
testo(300,200,'sole');
for giri:=1 to 180 do
  begin
  str(giri,stringa);
  testo(10,400,stringa);
   rad:=b*3.14/180;
   a:=a+24;
    rad1:=a*3.14/180;
   s:=trunc(r*sin(rad));
   c:=trunc(r*cos(rad));
   st:=trunc(rt*sin(rad1));
   ct:=trunc(rt*cos(rad1));
   sl:=-trunc(rl*sin(rad1));
   cl:=-trunc(rl*cos(rad1));
    for date:=1 to 11 do
    begin
     if (giri=pleni[date]) and (sosta=1) then testo(10,300,'novilunio')
      else
     if (giri=novi[date]) and (sosta=1) then testo(10,330,'plenilunio');
     if (giri=pleni[date]) or (giri=novi[date]) then px:=1;
    end;
   putpixel(x+s,y+c,4);
   setlinestyle(3,1,3);
   putpixel(x+s+st,y+c+ct,14);
   putpixel(x+s+sl,y+c+cl,15);
   putimage(x+s+st,y+c+ct,terra,1);
   putimage(x+s+sl,y+c+cl,luna,1);
   b:=b+2;
   delay(tempo);
   if (px=1) and(sosta=1) then delay(1000);
    putimage(x+s+st,y+c+ct,terra,1);
   putimage(x+s+sl,y+c+cl,luna,1);
   setcolor(1);
   testo(10,300,'novilunio');
   testo(10,330,'plenilunio');
   testo(10,400,stringa);
   setcolor(14);
   px:=0;
  end;
  end;

 begin                    (* programma principale *)
 clrscr;
 simula;
 grafica(1);              (* attiva pagina grafica *)
 disco;
 moto;
 pausa;
  closegraph;
 end.