let Pi=4.*.atan(1.0);;
#Pi : float = 3.14159265359
type plein_point=plein|point;;
#Le type plein_point est défini.
type foyer=soleil|autre;;
#Le type foyer est défini.
type conique={e:float;p:float;aap:float};;
#Le type conique est défini.
type comete={equ:conique;foyer:foyer};;
#Le type comete est défini.
let n_element tableau n=let l=vect_length tableau in
tableau.(n-(l*(n/l)));;
#n_element : 'a vect -> int -> 'a = <fun>
let fond_ecran couleur=set_color couleur;
fill_rect 0 0 (size_x()) (size_y());
set_color black;;
#fond_ecran : color -> unit = <fun>
#open "random";;
let etoiles nombre couleur=set_color couleur;
for i=1 to nombre do
point_ecr {X=(int (size_x()));Y=(int (size_y()))};done;
set_color black;;
#etoiles : int -> color -> unit = <fun>
let ciel n couleurs=let y=(vect_length couleurs) in
for i=0 to (y-1) do
etoiles (n/y) (couleurs.(i));done;;
#ciel : int -> color vect -> unit = <fun>
let ciel2 n=for i=0 to n do etoiles 1 (rgb (int 255) (int 255) (int 255)) done;;
#ciel2 : int -> unit = <fun>
let astre_solaire rayon repère= set_color yellow;
fill_circle (repère.O.X) (repère.O.Y) (int_of_float((float_of_int(repère.I))*.rayon));
set_color red;
move_rep {x=(-.rayon);y=0.} repère;
line_rep {x=rayon;y=0.} repère;
move_rep {x=0.;y=(1./.2.)*.rayon} repère;
line_rep {x=0.;y=(1./.2.)*.(-.rayon)} repère;
set_color black;;
#astre_solaire : float -> repere -> unit = <fun>
let color_conique nom repere pp n tableau depart intervalle=
let dt=(intervalle)/.(float_of_int n)
and valeur p e teta aap=p/.(1.+.(e*.cos(teta-.aap)))
and p=nom.equ.p and e=nom.equ.e and aap=nom.equ.aap in
let t=ref(depart+.aap+.dt) in
begin
match pp with
|plein ->set_color (n_element tableau 1);
move_rep {x=(valeur p e (!t) aap)*.cos(!t);y=(valeur p e (!t) aap)*.sin(!t)} repere;
for i=2 to n-1 do
t:=!t+.dt;
set_color (n_element tableau i);
line_rep {x=((valeur p e !t aap)*.cos(!t));y=((valeur p e !t aap)*.sin(!t))} repere;
done;
|point ->for i=1 to n-1 do
set_color (n_element tableau i);
point_rep {x=((valeur p e !t aap)*.cos(!t));y=((valeur p e !t aap)*.sin(!t))} repere;
t:=!t+.dt;
done;
end;
set_color black;;
#color_conique :.comete -> repere -> plein_point -> int -> color vect -> float -> float -> unit = <fun>
let trace_comete nom repere pp n tableau=
match (nom.equ.e) with
|1.0->color_conique nom repere pp n tableau (-.Pi) (2.*.Pi)
|x when x<.1. ->color_conique nom repere pp n tableau (0.) (2.*.Pi)
|x ->let g=acos(-.1./.x) in
match (nom.foyer) with
|soleil->color_conique nom repere pp n tableau (-.g) (2.*.g)
|autre->color_conique nom repere pp n tableau (g) ((2.*.Pi)-.(2.*.g));;
#trace_comete : comete -> repere -> plein_point -> int -> color vect -> unit = <fun>
let trajectoire comète pp centre largeur=clear_graph();
let repere=(vision centre largeur) in
fond_ecran black;
ciel 150 [|white;yellow;cyan|];
trace_rep repere 1 blue;
astre_solaire ((comète.equ.p)/.5.) repere;
trace_comete comète repere pp 500 [|blue;white;red;yellow;magenta|];;
#trajectoire : comete -> plein_point -> float * float -> float -> unit = <fun>
| |
| Les unités en abscisse sont en ua (unité astronomique=146.6 millions de km =distance moyenne terre/soleil). | |
|---|---|
Agrandissement au voisinage du soleil. trajectoire equ={e=0.9673; p=(0.5871*.1.9673); aap=(111.85*.Pi/.180.)}; foyer=soleil} point (0.,-.2.) 8.;; | ![]() |