190 lines
7.5 KiB
PHP
Executable file
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>
|
|
<?
|
|
}
|
|
?>
|