website_jukni/tools/aleatoire_celestia.php
2017-12-29 15:51:59 +01:00

190 lines
7.5 KiB
PHP
Executable file

/*
Fichier permettant de générer un contenu aléatoire pour le fichier .stc, c'est à dire les étoiles distantes dans Celestia.
*/
<?php
if($_POST['proba_classe'])
{
/*
Paramètres des données :
"MonEtoile" {
RA [0;360]
Dec [-180;180]
Distance [4;16000]
SpectralType "Dépend"
AppMag [-5;7]/Au moins 2 décimales
}
On a 18 classes, 10 températures différentes et 9 classes de luminosités
Les magnitudes vont normalement de -5 à 7 ; 7 étant la plus commune ;
7 devient 0, -5 devient 12.
lambda=0.4 me donne 99% de valeurs dans [0;12]
On génère un tableau avec les proba de [0;1], ]1;2]...On fait un random pour choisir la classe puis un random pour choisir dans la classe.
*/
//Constantes de base
$classe=array("O","B","A","F","G","K","M",
"L","T","R","N","S","C","WC","WN","D","Q","X");
$temperature=array(0,1,2,3,4,5,6,7,8,9);
$classe_lum=array("I-a0","I-a","Ib","II","III","IV","V","Vi,sd","D");
$magnitude=array(0=>7,1=>6,2=>5,3=>4,4=>3,5=>2,6=>1,7=>0,8=>-1,9=>-2,10=>-3,11=>-4,12=>-5);
$proba_classe=explode(",",$_POST['proba_classe']);
$proba_temperature=explode(",",$_POST['proba_temperature']);
$proba_classe_lum=explode(",",$_POST['proba_classe_lum']);
$nombre_objet=$_POST['nombre_objet'];
$decimales=$_POST['decimales'];
$decimales_exp=6;
$lambda=$_POST['lambda'];
$separateur="<br />";
function cumul_proba($proba)
{
$proba_cumulee=array($proba[0]);
for($i=1;$i<count($proba);$i++)
{
$proba_cumulee[$i]=$proba_cumulee[$i-1]+$proba[$i];
}
return $proba_cumulee;
}
function random($min, $max, $decimales)
{
$factor = pow(10, $decimales);
return rand($min*$factor, $max*$factor) / $factor;
}
function generation_proba_magnitude($lambda,$decimales_exp)
{
$proba_magnitude=array();
for($i=0;$i<12;$i++)
{
$proba_magnitude[$i]=round(exp((-1)*$lambda*$i)-exp((-1)*$lambda*($i+1)),$decimales_exp)*pow(10,$decimales_exp);
}
return $proba_magnitude;
}
function generation_spectral_type($classe,$temperature,$classe_lum,$proba_cumu_classe,$proba_cumu_temperature,$proba_cumu_classe_lum)
{
$spectral_type="";
//Pour générer une classe aléatoire non équiprobable : on tire entre 1 et la somme totale, si on est <= à l'indice en cours alors on prend la classe de l'indice en cours.
$rand_classe=mt_rand(1,$proba_cumu_classe[count($proba_cumu_classe)-1]);
for($i=0;$i<count($proba_cumu_classe);$i++)
{
if($proba_cumu_classe[$i]>=$rand_classe)
{
$spectral_type.=$classe[$i];
break;
}
}
$rand_temperature=mt_rand(1,$proba_cumu_temperature[count($proba_cumu_temperature)-1]);
for($i=0;$i<count($proba_cumu_temperature);$i++)
{
if($proba_cumu_temperature[$i]>=$rand_temperature)
{
$spectral_type.=$temperature[$i];
break;
}
}
$rand_classe_lum=mt_rand(1,$proba_cumu_classe_lum[count($proba_cumu_classe_lum)-1]);
for($i=0;$i<count($proba_cumu_classe_lum);$i++)
{
if($proba_cumu_classe_lum[$i]>=$rand_classe_lum)
{
$spectral_type.=$classe_lum[$i];
break;
}
}
return $spectral_type;
}
function generation_magnitude($proba_cumu_magnitude,$magnitude,$decimales)
{
$rand_magnitude=mt_rand(1,$proba_cumu_magnitude[count($proba_cumu_magnitude)-1]);
for($i=0;$i<count($proba_cumu_magnitude);$i++)
{
if($proba_cumu_magnitude[$i]>=$rand_magnitude)
{
$intervalle_choisi=$magnitude[$i];
return random($intervalle_choisi,$intervalle_choisi-1,$decimales);
}
}
}
$proba_cumu_classe=cumul_proba($proba_classe);
$proba_cumu_temperature=cumul_proba($proba_temperature);
$proba_cumu_classe_lum=cumul_proba($proba_classe_lum);
$proba_magnitude=generation_proba_magnitude($lambda,$decimales_exp);
$proba_cumu_magnitude=cumul_proba($proba_magnitude);
if(count($proba_classe)!=count($classe))
{
echo "Nombre de probabilités pour les classes différent du nombre de classes. Arrêt de la génération";
echo $separateur;
exit;
}
if(count($proba_temperature)!=count($temperature))
{
echo "Nombre de probabilités pour les températures différent du nombre de températures. Arrêt de la génération";
echo $separateur;
exit;
}
if(count($proba_classe_lum)!=count($classe_lum))
{
echo "Nombre de probabilités pour les classes lumineuses différent du nombre de classes lumineuses. Arrêt de la génération";
echo $separateur;
exit;
}
$output="";
if($_POST['affichage_loi'])
{
$nb_magnitude=count($proba_magnitude);
for($i=1;$i<$nb_magnitude;$i++)
{
$glouglou=$magnitude[$i]-1;
echo 'Pour l\'intervalle ['.$magnitude[$i].';.'.$glouglou.'], il y a '.$proba_magnitude[$i]/$proba_magnitude[$nb_magnitude-1].' objets.'.$separateur;
}
}
for($i=1;$i<$nombre_objet;$i++)
{
$nom_etoile=$i;
$ra=random(0,360,$decimales);
$dec=random(-180,180,$decimales);
$distance=random(4,16000,$decimales);
$spectral_type=generation_spectral_type($classe,$temperature,$classe_lum,$proba_cumu_classe,$proba_cumu_temperature,$proba_cumu_classe_lum);
$app_mag=generation_magnitude($proba_cumu_magnitude,$magnitude,$decimales);
$output.='"'.$nom_etoile.'" {';
$output.=$separateur;
$output.='RA '.$ra;
$output.=$separateur;
$output.='Dec '.$dec;
$output.=$separateur;
$output.='Distance '.$distance;
$output.=$separateur;
$output.='SpectralType "'.$spectral_type.'"';
$output.=$separateur;
$output.='AppMag '.$app_mag;
$output.=$separateur;
$output.='}';
$output.=$separateur;
}
echo $output;
}
else {
header("Content-type: text/html; charset=UTF-8");
?>
<html>
<p>
Pour les probabilités, indiquez les probabilités individuelles sous la forme p1,p2,p3...,pn dans l'ordre suivant :<br />
O, B, A, F, G, K, M , L, T, R, N, S, C, WC, WN, D, Q, X pour les classes<br />
0, 1, 2, 3, 4, 5, 6, 7, 8, 9 pour les températures<br />
I-a0, I-a, Ib, II, III, IV, V, "Vi,sd", D pour les classes lumineuses<br />
<br />
</p>
<form action="aleatoire_celestia.php" method="post">
Nombre d'objets céleste à calculer : <input type="text" name="nombre_objet" value="10" /><br />
Nombre de décimales à garder : <input type="text" name="decimales" value="3" /> <br />
Probabilités pour les classes : <textarea rows="1" cols="100" name="proba_classe">10,10,10,10,10,10,10,1,1,1,1,1,1,1,1,1,1,1</textarea><br />
Probabilités pour les températures : <textarea rows="1" cols="100" name="proba_temperature">1,1,1,1,1,1,1,1,1,1</textarea><br />
Probabilités pour les classes lumineuses : <textarea rows="1" cols="100" name="proba_classe_lum">1,1,1,1,1,1,1,1,1</textarea><br />
Paramètre de la loi exponentielle pour la répartition (plus il est élevée, plus la probabilité d'avoir une magnitude élevée est importante) <input type="text" name="lambda" value="0.4" /><br />
Afficher la répartition de la loi exponentielle ? <input type="checkbox" name="affichage_loi" /><br />
<input type="submit" value="Valider" />
</form>
</html>
<?
}
?>