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.