JeuWeb - Crée ton jeu par navigateur
Générateur de constellation - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Générateur de constellation (/showthread.php?tid=7203)



Générateur de constellation - julie11800 - 03-07-2014

Bonjour,
Je rencontre un problème d'ordre algorithmique sur un script que j'ai créé en speed pour peuplé mon univers de jeu Smile

Ce script me permet de généré un univers de jeu constituer de secteur.
Chaque secteur contient des systèmes et chaque système des planètes

Mon souci est que je ne parviens pas a trouvé un algo pour générer des constellations aléatoire, une constellation étant un groupement de système.
Je souhaiterai générer aléatoirement des constellations d'étoile (comme dans la vraie vie).

Le traitement peux ce faire via ce script ou via un 2e script ça ne me dérange pas.

Autre souci si vous avez une idée. Une fois que j'ai généré tous mes point je souhaiterais appliquer une rotation a tous les point d'on l'origine serai le centre de tous les secteurs...


Mes cours de math sont loin et je sèche complètement --'.


Cordialement.

Code :
<?php
ini_set('memory_limit', '1024M');
mysql_connect('localhost','hey', 'hey');
mysql_select_db('xprodx');
//---------------------------------------------------------------------------------------------------------
// DEBUT DE LA BDD POUR PEUPLE LA GALAXY
//---------------------------------------------------------------------------------------------------------

//Tableau des secteur de la galaxy dispo chaque systeme présent dans le secteur en cour poura ce trouver entre les coordonée
// x et y et sera composer au minimum de `density_min` systeme et au maximum de `density_max` systeme
$array_secteur = array(1 =>array('x'=>array(0,100),     'y'=>array(0,100),'density_min'=>60,'density_max'=>180),
                       2 =>array('x'=>array(101,200),'y'=>array(0,100),'density_min'=>70,'density_max'=>190),
                       3 =>array('x'=>array(0,100),'y'=>array(101,200),'density_min'=>100,'density_max'=>220),
                       4 =>array('x'=>array(101,200),'y'=>array(101,200),'density_min'=>110,'density_max'=>230),
                        );
//Tableau des "Soleil" chaque systeme est constituer d'un astre en sont centre l'astre présent sera calculer au "pour 1000"
//Le soleil présent définira le modificateur de température du systeme
$array_soleil = array(1=> array(0=>array('label'=>'Naine blanche','pourcent'=>30,'modif_temp'=>-30,'img'=>array('naineblanche1','naineblanche2','naineblanche3','naineblanche4','naineblanche5','naineblanche6')),
                                1=>array('label'=>'Naine jaune','pourcent'=>120,'modif_temp'=>0,'img'=>array('nainejaune1','nainejaune2','nainejaune3','nainejaune4','nainejaune5','nainejaune6','nainejaune7')),
                                2=>array('label'=>'Naine rouge','pourcent'=>600,'modif_temp'=>-10,'img'=>array('nainerouge1','nainerouge2','nainerouge3','nainerouge4')),
                                3=>array('label'=>'Naine brune','pourcent'=>30,'modif_temp'=>-20,'img'=>array('nainebrune1','nainebrune2','nainebrune3','nainebrune4')),
                                4=>array('label'=>'Naine noire','pourcent'=>30,'modif_temp'=>-40,'img'=>array('nainenoire1','nainenoire2','nainenoire3')),
                                5=>array('label'=>'Geante rouge','pourcent'=>90,'modif_temp'=>20,'img'=>array('geanterouge1','geanterouge2','geanterouge3')),
                                6=>array('label'=>'Geante bleu','pourcent'=>30,'modif_temp'=>60,'img'=>array('geantebleu1','geantebleu2','geantebleu3','geantebleu4','geantebleu5')),
                                7=>array('label'=>'Supergeante rouge','pourcent'=>40,'modif_temp'=>50,'img'=>array('supergeanterouge1','supergeanterouge2')),
                                8=>array('label'=>'Etoile a neutron','pourcent'=>20,'modif_temp'=>30,'img'=>array('neutron1','neutron2','neutron3','neutron4')),
                                9=>array('label'=>'Trou noir','pourcent'=>20,'modif_temp'=>-60,'img'=>array('trounoir1','trounoir2','trounoir3','trounoir4','trounoir5'))),
//Les systeme on des chance d'etre des systeme a soleil multiple dans ce cas les les autre astre ne pourons etre que des astre présent dans cette liste
                    2=> array(0=>array('label'=>'Naine blanche','pourcent'=>40),
                                1=>array('label'=>'Naine jaune','pourcent'=>160),
                                2=>array('label'=>'Naine rouge','pourcent'=>700),
                                3=>array('label'=>'Naine brune','pourcent'=>40),
                                4=>array('label'=>'Naine noire','pourcent'=>40),
                                5=>array('label'=>'Geante rouge','pourcent'=>10),
                                6=>array('label'=>'Geante bleu','pourcent'=>10)));
//Les type de planete que l'on peux rencontré dans un systeme
$array_planete =  array(0=>array('label'=>'Telurique',                        'pourcent'=>array(0=>75,1=>10,2=>6, 3=>5 ,4=>10),'classe'=>array('H1','H2','H3','H4','H5')),
                        1=>array('label'=>'Jovienne',                        'pourcent'=>array(0=>10,1=>6 ,2=>10,3=>45,4=>35),'classe'=>array('B1','B2','B3','B4','B5')),
                        2=>array('label'=>'Habitable',                        'pourcent'=>array(0=>5,    1=>72,2=>75,3=>30,4=>5)    ,'classe'=>array('C1','C2','C3','C4','C5')),
                        3=>array('label'=>'Nuange de gaz',                    'pourcent'=>array(0=>0,    1=>2 ,2=>5, 3=>10,4=>20),'classe'=>array('X1','X2','X3','X4','X5')),
                        4=>array('label'=>'Champ d\'asteroide metalique',    'pourcent'=>array(0=>5,    1=>5 ,2=>2, 3=>5 ,4=>15),'classe'=>array('Z1','Z2','Z3','Z4','Z5')),
                        5=>array('label'=>'Champ d\'asteroide alcalin',        'pourcent'=>array(0=>5,    1=>5 ,2=>2, 3=>5 ,4=>15),'classe'=>array('Z1','Z2','Z3','Z4','Z5')));          
//Pour définir les température et taille des planette
$array_temp = array(0=> array('temp_min'=>260,'temp_max'=>300,  'taille_min'=>95, 'taille_max'=>108    ,'dist_min'=>30        ,'dist_max'=>34),//trés proche
                    1=> array('temp_min'=>230,'temp_max'=>270,  'taille_min'=>97, 'taille_max'=>110    ,'dist_min'=>35        ,'dist_max'=>40),//trés proche
                    2=> array('temp_min'=>220,'temp_max'=>260,  'taille_min'=>98, 'taille_max'=>137    ,'dist_min'=>41        ,'dist_max'=>45),//trés proche
                    3=> array('temp_min'=>210,'temp_max'=>250,  'taille_min'=>107,'taille_max'=>147    ,'dist_min'=>46        ,'dist_max'=>50),//trés proche
                    4=> array('temp_min'=>160,'temp_max'=>200,  'taille_min'=>108,'taille_max'=>149    ,'dist_min'=>51        ,'dist_max'=>55),//trés proche
                    5=> array('temp_min'=>150,'temp_max'=>190,  'taille_min'=>110,'taille_max'=>154    ,'dist_min'=>75        ,'dist_max'=>80),//proche
                    6=> array('temp_min'=>140,'temp_max'=>180,  'taille_min'=>112,'taille_max'=>157    ,'dist_min'=>85        ,'dist_max'=>90),//proche
                    7=> array('temp_min'=>130,'temp_max'=>170,  'taille_min'=>115,'taille_max'=>159    ,'dist_min'=>91        ,'dist_max'=>100),//proche
                    8=> array('temp_min'=>120,'temp_max'=>160,  'taille_min'=>116,'taille_max'=>166    ,'dist_min'=>101    ,'dist_max'=>110),//proche
                    9=> array('temp_min'=>100,'temp_max'=>140,  'taille_min'=>118,'taille_max'=>170    ,'dist_min'=>111    ,'dist_max'=>115),//proche
                    10=>array('temp_min'=>80,'temp_max'=>120,   'taille_min'=>121,'taille_max'=>198    ,'dist_min'=>121    ,'dist_max'=>125),//Medium
                    11=>array('temp_min'=>50,'temp_max'=>90,    'taille_min'=>123,'taille_max'=>212    ,'dist_min'=>126    ,'dist_max'=>130),//Medium
                    12=>array('temp_min'=>40,'temp_max'=>80,    'taille_min'=>129,'taille_max'=>249    ,'dist_min'=>131    ,'dist_max'=>135),//Medium
                    13=>array('temp_min'=>30,'temp_max'=>70,    'taille_min'=>147,'taille_max'=>256    ,'dist_min'=>136    ,'dist_max'=>140),//Medium
                    14=>array('temp_min'=>20,'temp_max'=>60,    'taille_min'=>167,'taille_max'=>237    ,'dist_min'=>141    ,'dist_max'=>150),//Medium
                    15=>array('temp_min'=>-10,'temp_max'=>30,   'taille_min'=>182,'taille_max'=>348    ,'dist_min'=>151    ,'dist_max'=>160),//Medium
                    16=>array('temp_min'=>-20,'temp_max'=>20,   'taille_min'=>179,'taille_max'=>325    ,'dist_min'=>161    ,'dist_max'=>180),//Medium
                    17=>array('temp_min'=>-30,'temp_max'=>10,   'taille_min'=>154,'taille_max'=>297    ,'dist_min'=>181    ,'dist_max'=>210),//Medium
                    18=>array('temp_min'=>-40,'temp_max'=>0,    'taille_min'=>142,'taille_max'=>223    ,'dist_min'=>211    ,'dist_max'=>240),//Medium
                    19=>array('temp_min'=>-50,'temp_max'=>-10,  'taille_min'=>131,'taille_max'=>330    ,'dist_min'=>241    ,'dist_max'=>300),//Medium
                    20=>array('temp_min'=>-70,'temp_max'=>-30,  'taille_min'=>125,'taille_max'=>412    ,'dist_min'=>350    ,'dist_max'=>420),//eloigné
                    21=>array('temp_min'=>-90,'temp_max'=>-50,  'taille_min'=>162,'taille_max'=>437    ,'dist_min'=>421    ,'dist_max'=>510),//eloigné
                    22=>array('temp_min'=>-100,'temp_max'=>-60, 'taille_min'=>179,'taille_max'=>412    ,'dist_min'=>520    ,'dist_max'=>630),//eloigné
                    23=>array('temp_min'=>-110,'temp_max'=>-70, 'taille_min'=>212,'taille_max'=>348    ,'dist_min'=>650    ,'dist_max'=>750),//eloigné
                    24=>array('temp_min'=>-120,'temp_max'=>-80, 'taille_min'=>179,'taille_max'=>239    ,'dist_min'=>760    ,'dist_max'=>890),//eloigné
                    25=>array('temp_min'=>-130,'temp_max'=>-90, 'taille_min'=>112,'taille_max'=>214    ,'dist_min'=>1060    ,'dist_max'=>1270),//Trés éloigné
                    26=>array('temp_min'=>-140,'temp_max'=>-100,'taille_min'=>97, 'taille_max'=>195    ,'dist_min'=>1311    ,'dist_max'=>1589),//Trés éloigné
                    27=>array('temp_min'=>-150,'temp_max'=>-110,'taille_min'=>81, 'taille_max'=>167    ,'dist_min'=>1645    ,'dist_max'=>1926),//Trés éloigné
                    28=>array('temp_min'=>-160,'temp_max'=>-120,'taille_min'=>64, 'taille_max'=>149    ,'dist_min'=>2301    ,'dist_max'=>2915),//Trés éloigné
                    29=>array('temp_min'=>-170,'temp_max'=>-130,'taille_min'=>41, 'taille_max'=>121    ,'dist_min'=>3000    ,'dist_max'=>4000));//Trés éloigné);
//Pour définir les images des planette
$img = array(0=>'normaltempplanet01',
1=>'normaltempplanet02',
2=>'normaltempplanet03',
3=>'normaltempplanet04',
4=>'normaltempplanet05',
5=>'normaltempplanet06',
6=>'normaltempplanet07',
7=>'trockenplanet01',
8=>'trockenplanet02',
9=>'trockenplanet03',
10=>'trockenplanet04',
11=>'trockenplanet05',
12=>'trockenplanet06',
13=>'trockenplanet07',
14=>'trockenplanet08',
15=>'trockenplanet09',
16=>'trockenplanet10',
17=>'wasserplanet01',
18=>'wasserplanet02',
19=>'wasserplanet03',
20=>'wasserplanet04',
21=>'wasserplanet05',
22=>'wasserplanet06',
23=>'wasserplanet07',
24=>'wasserplanet08',
25=>'wasserplanet09',
26=>'wuestenplanet01',
27=>'wuestenplanet02',
28=>'wuestenplanet03',
29=>'wuestenplanet04',
30=>'gasplanet01',
31=>'gasplanet02',
32=>'gasplanet03',
33=>'gasplanet04',
34=>'gasplanet05',
35=>'gasplanet06',
36=>'gasplanet07',
37=>'gasplanet08',
38=>'eisplanet01',
39=>'eisplanet02',
40=>'eisplanet03',
41=>'eisplanet04',
42=>'eisplanet05',
43=>'eisplanet06',
44=>'eisplanet07',
45=>'eisplanet08',
46=>'eisplanet09',
47=>'eisplanet10',
48=>'dschjungelplanet01',
49=>'dschjungelplanet02',
50=>'dschjungelplanet03',
51=>'dschjungelplanet04',
52=>'dschjungelplanet05',
53=>'dschjungelplanet06',
54=>'dschjungelplanet07',
55=>'dschjungelplanet08',
56=>'dschjungelplanet09',
57=>'dschjungelplanet10');                

//---------------------------------------------------------------------------------------------------------
// FIN DE LA BDD POUR PEUPLE LA GALAXY
//---------------------------------------------------------------------------------------------------------

//Permet de définir la distance entre une planete et sont etoile en fonction de ca position orbitale
function calcul_distance_etoile($position){
    global $array_temp;
    $rand1 = mt_rand($array_temp[($position-1)]['dist_min'],$array_temp[($position-1)]['dist_max']);
    $rand2 = mt_rand(100000,900000);
    return number_format($rand1.$rand2,0,'','.').'km';
}

//Pour selection le soleil principal puis les autre en cas de systeme multiple            
function select_soleil($array_soleil,$index){
    $arr_ok = array();
    for($i=0,$j=count($array_soleil[$index]);$i<$j;$i++){
        for($k=0,$l=$array_soleil[$index][$i]['pourcent'];$k<$l;$k++){
            $arr_ok[] = $array_soleil[$index][$i]['label'];
            if($index != 2){
                $arr_ok2[] = $array_soleil[$index][$i]['modif_temp'];
            }
        }
    }
    $rand = mt_rand(0,count($arr_ok)-1);
    if($index != 2){
        return array($arr_ok[$rand],$arr_ok2[$rand]);    
    }else{
        return $arr_ok[$rand];
    }
}
//Calculer la taille esploitable des colonie
function calcul_case($position){
    global $modificateur_case,$array_temp ;
    $modificateur = 0;
    $rand = mt_rand(1,2);
    $valeurmodif = mt_rand($modificateur_case[0],$modificateur_case[1]);
    if($rand == 1){
        $modificateur = 0-$valeurmodif;
    }else{
        $modificateur = $valeurmodif;
    }
    $case_min = $array_temp[($position-1)]['taille_min']+$modificateur;
    $case_max = $array_temp[($position-1)]['taille_max']+$modificateur;
    if ($case_min <= 0){
         $case_min = mt_rand(10,25);
    }
    if ($case_max < $case_min){
         $case_max = $case_min+mt_rand(40,80);
    }
    $case = mt_rand($case_min,$case_max);
    return $case;
}
//Calculé le diametre des colonie
function calcul_diametre($case,$type){
    if($type="Jovienne"){
        $modificateur = mt_rand(8,15);
    }elseif($type="Telurique"){
        $modificateur = mt_rand(1,5);
    }elseif($type="Habitable"){
        $modificateur = mt_rand(1,3);
    }elseif($type="Nuange de gaz"){
        $modificateur = mt_rand(18,25);
    }else{
        $modificateur = mt_rand(15,26);
    }    
    
        $base = (($case*mt_rand(2,4))*mt_rand(4,10))*$modificateur;
    return $base;
}
//calculé la température des colonie
function calcul_temp($position,$modif_soleil){
    global $array_temp,$pourcent_variation_temp;
    $posneg = mt_rand(1,2);
    $variation = $pourcent_variation_temp[mt_rand(0,3)];
    if($posneg == 1){//positif!
        $temp_min = ($array_temp[($position-1)]['temp_min'])+($array_temp[($position-1)]['temp_min']*$variation)+(($modif_soleil*$variation)+($modif_soleil));
    }else{//negatif!
        $temp_min = ($array_temp[($position-1)]['temp_min'])-($array_temp[($position-1)]['temp_min']*$variation)-(($modif_soleil*$variation)+($modif_soleil));
    }
    if($posneg == 1){//positif!
        $temp_max = ($array_temp[($position-1)]['temp_max'])+($array_temp[($position-1)]['temp_max']*$variation)+(($modif_soleil*$variation)+($modif_soleil));
    }else{//negatif!
        $temp_max = ($array_temp[($position-1)]['temp_max'])-($array_temp[($position-1)]['temp_max']*$variation)-(($modif_soleil*$variation)+($modif_soleil));
    }
    return array($temp_min,$temp_max);
}

//Pour généré une planette
function generate_planete($array_planete,$position){
    global $pourcent_orbite_vide;

    if(mt_rand(0,100)<= $pourcent_orbite_vide){
        return 'vide';
    }
    if($position <= 5){//trés proche 1-5
        $index = 0;
    }elseif(($position > 5)&&($position <= 10)){//proche 6-10
        $index = 1;
    }elseif(($position > 10)&&($position <= 20)){//Medium 11 - 20
        $index = 2;
    }elseif(($position > 20)&&($position <= 25)){//eloigné 21 - 25
        $index = 3;
    }elseif(($position > 25)&&($position <= 30)){//Trés éloigné 26 - 30
        $index = 4;
    }else{
    
    }
    $arr_ok = array();
    for($i=0,$j=count($array_planete);$i<$j;$i++){
        for($k=0,$l=$array_planete[$i]['pourcent'][$index];$k<$l;$k++){
            $arr_ok[] = $array_planete[$i]['label'];
        }
    }
    return $arr_ok[mt_rand(0,count($arr_ok)-1)];    
}

$nbsysteme = 0;
$coordd = array();
$aff = '';
$result = array();
$orbite_systeme = 30;
$pourcent_binaire = 20;
$pourcent_ternaire = 8;
$pourcent_quadruple = 2;
$pourcent_quintuple = 1;
$pourcent_orbite_vide = 50;
$pourcent_variation_temp = array(0,0.1,0.2,0.3);
$planette = '';
$resultat = '';
$nbcolonie = 0;
$requette_b =     'INSERT INTO `xgp_planets` (`name`, `id_owner`, `galaxy`, `system`,`planet`,`last_update`,`planet_type`,`image`,`diameter`,`field_max`,`temp_min`,`temp_max`,`coord_x`,`coord_y`) VALUE';
$requette_gal_b = 'INSERT INTO `xgp_galaxy` (`galaxy`, `system`, `planet`, `id_planet`,`coord_x`,`coord_y`) VALUE';

$modificateur_case = array(0,40);
for ($i=1,$j=count($array_secteur);$i<=$j;$i++){                      
    for($k=1,$l=mt_rand($array_secteur[$i]['density_min'],$array_secteur[$i]['density_max']);$k <= $l;$k++){
        
        $rand_x = mt_rand($array_secteur[$i]['x'][0],$array_secteur[$i]['x'][1] );
        $rand_y = mt_rand($array_secteur[$i]['y'][0],$array_secteur[$i]['y'][1] );
        if(in_array($rand_x.'|'.$rand_y, $result)){
            $k = $k-1;
            continue;
        }
        $result[] = $rand_x.'|'.$rand_y;
        $aff .= '<div style="background:#000;width:1px;height:1px;position:absolute;top:'.$rand_y.';left:'.$rand_x.'"></div>';
        $planette = '';
        $position = 0;
        $modif_temps = 0;
        for($m=0,$n=$orbite_systeme;$m<=$n;$m++){
            //Le premier élément est TOUJOUR un soleil;
            
            if($m == 0){
                $results_1 = select_soleil($array_soleil,1);
                $soleil = $results_1[0].' Modificateur de temp: '.$results_1[1];
                $modif_temps = $results_1[1];
                $position = 0;
                $result_s = $results_1[0];
                $plan = false;
            }
            //Cas particulier on peux avoir des systeme binaire :)
            if($m == 1){
                $rand_binaire = mt_rand(1,100);
                if($rand_binaire <= $pourcent_binaire){//C'est un systeme binaire!!!!
                    
                    $bin = true;
                    $position++;
                    
                $result_s = select_soleil($array_soleil,2);
                    $planette .= '<li>'.$i.':'.$k.':'.$position.' =>'.$result_s.'</li>';
                }else{//Ce n'est pas un systeme binaire!
                $plan = true;
                    $bin = false;
                    $retour = generate_planete($array_planete,$m);
                    if($retour == 'vide'){
                        
                        continue;
                    }
                    $position++;
                    $temp = calcul_temp($m,$modif_temps);
                    if($retour == 'Habitable'){$nbcolonie++;}
                    $case = calcul_case($m);
                    $diametre_p = calcul_diametre($case,$retour);
                    $planette .= '<li>'.$i.':'.$k.':'.$position.' =>'.$retour.' | Temp: min->'.$temp[0].'&deg; max->'.$temp[1].'&deg; | taille : '.$case.' | diametre : '.$diametre_p.'km | distance etoile => '.calcul_distance_etoile($m).'</li>';
                    
                }
            }
            if($m == 2){
                $rand_ternaire = mt_rand(1,100);
                if(($bin == true)&&($rand_ternaire <= $pourcent_ternaire)){
                    $ter = true;
                    $position++;
                        $result_s = select_soleil($array_soleil,2);
                    $planette .= '<li>'.$i.':'.$k.':'.$position.' =>'.$result_s.'</li>';
                }else{
                $plan = true;
                    $ter = false;
                    $retour = generate_planete($array_planete,$m);
                    if($retour == 'vide'){
                        
                        continue;
                    }
                    $position++;
                    $temp = calcul_temp($m,$modif_temps);
                    if($retour == 'Habitable'){$nbcolonie++;}
                    $case = calcul_case($m);
                    $diametre_p = calcul_diametre($case,$retour);
                    $planette .= '<li>'.$i.':'.$k.':'.$position.' =>'.$retour.' | Temp: min->'.$temp[0].'&deg; max->'.$temp[1].'&deg; | taille : '.$case.' | diametre : '.$diametre_p.'km | distance etoile => '.calcul_distance_etoile($m).'</li>';
                }
            }
            if($m == 3){
                $rand_quadruple = mt_rand(1,100);
                if(($ter == true)&&($rand_quadruple <= $pourcent_quadruple)){
                    $qua = true;
                    $position++;
                        $result_s = select_soleil($array_soleil,2);
                    $planette .= '<li>'.$i.':'.$k.':'.$position.' =>'.$result_s.'</li>';
                }else{
                    $plan = true;
                    $qua = false;
                    $retour = generate_planete($array_planete,$m);
                    if($retour == 'vide'){
                        
                        continue;
                    }
                    $position++;
                    $temp = calcul_temp($m,$modif_temps);
                    if($retour == 'Habitable'){$nbcolonie++;}
                    $case = calcul_case($m);
                    $diametre_p = calcul_diametre($case,$retour);
                    $planette .= '<li>'.$i.':'.$k.':'.$position.' =>'.$retour.' | Temp: min->'.$temp[0].'&deg; max->'.$temp[1].'&deg; | taille : '.$case.' | diametre : '.$diametre_p.'km | distance etoile => '.calcul_distance_etoile($m).'</li>';
                }
            }
            if($m == 4){
                $rand_quintuple = mt_rand(1,100);
                if(($qua == true)&&($rand_quintuple <= $pourcent_quintuple)){
                    $qui = true;
                    $position++;
                        $result_s = select_soleil($array_soleil,2);
                    $planette .= '<li>'.$i.':'.$k.':'.$position.' =>'.$result_s.'</li>';
                }else{
                    $plan = true;
                    $qui = false;
                    $retour = generate_planete($array_planete,$m);
                    if($retour == 'vide'){
                        
                        continue;
                    }
                    $position++;
                    $temp = calcul_temp($m,$modif_temps);
                    if($retour == 'Habitable'){$nbcolonie++;}
                    $case = calcul_case($m);
                    $diametre_p = calcul_diametre($case,$retour);
                    $planette .= '<li>'.$i.':'.$k.':'.$position.' =>'.$retour.' | Temp: min->'.$temp[0].'&deg; max->'.$temp[1].'&deg; | taille : '.$case.' | diametre : '.$diametre_p.'km | distance etoile => '.calcul_distance_etoile($m).'</li>';
                }
            }
            if($m>4){
                $plan = true;
                $retour = generate_planete($array_planete,$m);
                if($retour == 'vide'){
                    
                    continue;
                }
                $position++;
                $temp = calcul_temp($m,$modif_temps);
                if($retour == 'Habitable'){$nbcolonie++;}
                    $case = calcul_case($m);
                    $diametre_p = calcul_diametre($case,$retour);
                    $planette .= '<li>'.$i.':'.$k.':'.$position.' =>'.$retour.' | Temp: min->'.$temp[0].'&deg; max->'.$temp[1].'&deg; | taille : '.$case.' | diametre : '.$diametre_p.'km | distance etoile => '.calcul_distance_etoile($m).'</li>';
            }
            if ($plan){
                if($retour == 'Habitable'){
                    $type_p = 1;
                    $images = $img[mt_rand(0,57)];
                }elseif($retour == 'Jovienne'){
                    $type_p = 4;
                    $images = $img[mt_rand(0,57)];
                }elseif($retour == 'Telurique'){
                    $type_p = 5;
                    $images = $img[mt_rand(0,57)];
                }elseif($retour == 'Nuange de gaz'){
                    $type_p = 6;
                    $images = $img[mt_rand(0,57)];
                }elseif($retour == 'Champ d\'asteroide metalique'){
                    $type_p = 7;
                    $images = $img[mt_rand(0,57)];
                }else{
                    $type_p = 8;
                    $images = $img[mt_rand(0,57)];
                }
            }else{
                if($result_s == 'Naine blanche'){
                    $count = count($array_soleil[1][0]['img'])-1;
                    $images = $array_soleil[1][0]['img'][mt_rand(0,$count)];
                }elseif($result_s == 'Naine jaune'){
                    $count = count($array_soleil[1][1]['img'])-1;
                    $images = $array_soleil[1][1]['img'][mt_rand(0,$count)];
                }elseif($result_s == 'Naine rouge'){
                    $count = count($array_soleil[1][2]['img'])-1;
                    $images = $array_soleil[1][2]['img'][mt_rand(0,$count)];
                }elseif($result_s == 'Naine brune'){
                    $count = count($array_soleil[1][3]['img'])-1;
                    $images = $array_soleil[1][3]['img'][mt_rand(0,$count)];
                }elseif($result_s == 'Naine noire'){
                    $count = count($array_soleil[1][4]['img'])-1;
                    $images = $array_soleil[1][4]['img'][mt_rand(0,$count)];;
                }elseif($result_s == 'Geante rouge'){
                    $count = count($array_soleil[1][5]['img'])-1;
                    $images = $array_soleil[1][5]['img'][mt_rand(0,$count)];
                }elseif($result_s == 'Geante bleu'){
                    $count = count($array_soleil[1][6]['img'])-1;
                    $images = $array_soleil[1][6]['img'][mt_rand(0,$count)];
                }elseif($result_s == 'Supergeante rouge'){
                    $count = count($array_soleil[1][7]['img'])-1;
                    $images = $array_soleil[1][7]['img'][mt_rand(0,$count)];
                }elseif($result_s == 'Etoile a neutron'){
                    $count = count($array_soleil[1][8]['img'])-1;
                    $images = $array_soleil[1][8]['img'][mt_rand(0,$count)];
                }else{
                    $count = count($array_soleil[1][9]['img'])-1;
                    $images = $array_soleil[1][9]['img'][mt_rand(0,$count)];
                }
            }
            
            
            
            
            
            
            
            
            
            
            
            
            
            if ($plan){               //(`name`, `id_owner`, `galaxy`, `system`,`planet` ,`last_update`,`planet_type`,    `diameter`,   `field_max`,`temp_min`,      `temp_max`,  `coord_x`,`coord_y`) VALUE';
                $requette = "('".addslashes ($retour)."', '0', '".$i."', '".$k."','".$position."','".time()."','".$type_p."','".$images."','".$diametre_p."','".$case."','".$temp[0]."','".$temp[1]."','".$rand_x.sprintf('%03d',$position)."','".$rand_y.sprintf('%03d',$position)."')";        
            }else{
                $requette = "('".addslashes ($result_s)."', '0', '".$i."', '".$k."','".$position."','".time()."','0','".$images."','0','0','0','0','".$rand_x.sprintf('%03d',$position)."','".$rand_y.sprintf('%03d',$position)."')";        
            }
            
            echo $requette_b.$requette.'<br />';
            mysql_query($requette_b.$requette) or die(mysql_error());
                        $requette_gal = "('".$i."', '".$k."', '".$position."', '".mysql_insert_id()."','".$rand_x.sprintf('%03d',$position)."','".$rand_y.sprintf('%03d',$position)."')";

            echo $requette_gal_b.$requette_gal.'<br />';
            mysql_query($requette_gal_b.$requette_gal) or die(mysql_error());
            //mysql_query();
        }
        
        $resultat .='<ul><li>'.$i.':'.$k.' x='.$rand_x.'/y='.$rand_y.'</li><li><ul><li>'.$i.':'.$k.':0 =>'.$soleil.'</li>'.$planette.'</ul></li></ul>';
        
        $nbsysteme ++;
    }
}
//file_put_contents('req_colo.sql',$requette);
//echo $requette;
?>
<div style="float:left;width:400px;height:230px"><?=$aff?></div><div style="float;left;width:200px">
Nombre de systeme: <?=$nbsysteme?><br />
Nombre de plantes colonisable : <?=$nbcolonie?></div>

Liste des coordonee;
<pre>
<?=$resultat ?>
</pre>



RE: Générateur de constellation - keke - 04-07-2014

Coucou Julie ...
honnètement, j'aime bien ta problématique, j'aime bien les maths ... mais il faudrait nous découper ton code et l'expliquer un peu. Je vais pas lire tout ton code.

D'ailleurs, simplement, essaye de réduire ton code un chouilla, tu trouveras alors peut-etre toi même plus facilement ton problème. par exemple, tu fais des trie selon les naines, les géantes, les neutrinos ... est-ce utile à ton debuggage ?

kéké


RE: Générateur de constellation - julie11800 - 04-07-2014

(04-07-2014, 09:38 AM)keke a écrit : Coucou Julie ...
honnètement, j'aime bien ta problématique, j'aime bien les maths ... mais il faudrait nous découper ton code et l'expliquer un peu. Je vais pas lire tout ton code.

D'ailleurs, simplement, essaye de réduire ton code un chouilla, tu trouveras alors peut-etre toi même plus facilement ton problème. par exemple, tu fais des trie selon les naines, les géantes, les neutrinos ... est-ce utile à ton debuggage ?

kéké

Bon je vais éditer mon code Smile
Il est crado oui mais il n'est sensé tourné qu'une fois au lancement du jeu.

Il me permet de peuplé l'univers

Il fonctionne très bien, il me permet de crée ce genre de chose:
http://spaceg.net/carte2d.php (ne pas faire attention aux points jaunes)

Je chercher un algo qui peut me permettre de relier des points proches entre eux pou généré des constellations aléatoires (style la grande ourse, Orion...) puis de sauvegarder ces constellations en bdd:

Constellation 1 => système 1/2/5/12
Constellation 2 = système 7/8/9/14/16
...


RE: Générateur de constellation - Xenos - 04-07-2014

Les constellations ne sont pas des étoiles proches physiquement: ce sont uniquement des étoiles dont le projeté 2D est proche:


[Image: astronomy-constellation-3d.jpg]

[Image: constellation-3d1.jpg]


Sinon, si on ne considère pas la 3D (j'ai moi non plus pas lu le code, mais au survol, beaucoup de lignes sont copiées-collées: classes, fonctions et commentaires le simplifieront énormément), oublie tout algorithme intuitif du type "prendre les 3 points les plus proches de chaque étoile" (la taille des constellations va exploser).

Je ne sais pas si "tes cours de maths étant loin", tu sauras construire ton algo à partir d'une courte présentation des algorithmes de partitionnements (les k-moyennes sont probablement les plus aisées à implémenter).

Une idée simple serait alors de faire les k-moyennes sans itération (comme ça, tu pourras ajouter les itérations une fois qu'elles marcheront). l'idée est:
  • Placer, au hasard, des points (x,y) dans l'image (aka, dans le carré contenant les étoiles); chaque point représentera une constellation
  • Pour chaque point, créer un tableau vide qui contiendra les identifiants des étoiles de la constellation
  • Pour chaque étoile, chercher le point le plus proche (calculer les distances entre l'étoile et chaque point, les stocker dans un tableau, et piocher la distance minimale)
  • Ajouter l'étoile à la constellation que représente ce point

C'est assez simple, c'est complet (chaque étoile appartient à au moins une constellation), et chaque étoile n'est liée qu'à une seule constellation.

Pour aller plus loin: les k-moyennes consistent "simplement" à ajouter deux étapes à l'algorithme précédent (une fois chaque étoile liée à un point représentant une constellation):
  • Pour chaque constellation: déplacer le point qui lui correspond au centre de la constellation (on fait une moyenne, pondérée ou non, des coordonnées des étoiles de la constellation; la pondération peut être sympa si les étoiles ont des masses/tailles différentes)
  • Recommencer l'algorithme à l'étape 2 (vider le tableau des constellation, puis le repeupler), en utilisant la nouvelle position des points calculées précédemment



RE: Générateur de constellation - julie11800 - 04-07-2014

(04-07-2014, 11:33 AM)Xenos a écrit : Les constellations ne sont pas des étoiles proches physiquement: ce sont uniquement des étoiles dont le projeté 2D est proche:


[Image: astronomy-constellation-3d.jpg]

[Image: constellation-3d1.jpg]


Sinon, si on ne considère pas la 3D (j'ai moi non plus pas lu le code, mais au survol, beaucoup de lignes sont copiées-collées: classes, fonctions et commentaires le simplifieront énormément), oublie tout algorithme intuitif du type "prendre les 3 points les plus proches de chaque étoile" (la taille des constellations va exploser).

Je ne sais pas si "tes cours de maths étant loin", tu sauras construire ton algo à partir d'une courte présentation des algorithmes de partitionnements (les k-moyennes sont probablement les plus aisées à implémenter).

Une idée simple serait alors de faire les k-moyennes sans itération (comme ça, tu pourras ajouter les itérations une fois qu'elles marcheront). l'idée est:
  • Placer, au hasard, des points (x,y) dans l'image (aka, dans le carré contenant les étoiles); chaque point représentera une constellation
  • Pour chaque point, créer un tableau vide qui contiendra les identifiants des étoiles de la constellation
  • Pour chaque étoile, chercher le point le plus proche (calculer les distances entre l'étoile et chaque point, les stocker dans un tableau, et piocher la distance minimale)
  • Ajouter l'étoile à la constellation que représente ce point

C'est assez simple, c'est complet (chaque étoile appartient à au moins une constellation), et chaque étoile n'est liée qu'à une seule constellation.

Pour aller plus loin: les k-moyennes consistent "simplement" à ajouter deux étapes à l'algorithme précédent (une fois chaque étoile liée à un point représentant une constellation):
  • Pour chaque constellation: déplacer le point qui lui correspond au centre de la constellation (on fait une moyenne, pondérée ou non, des coordonnées des étoiles de la constellation; la pondération peut être sympa si les étoiles ont des masses/tailles différentes)
  • Recommencer l'algorithme à l'étape 2 (vider le tableau des constellation, puis le repeupler), en utilisant la nouvelle position des points calculées précédemment

Effectivement je me base sur un contexte 2D (la représentation 3D alourdira le jeu inutilement)
Les constellations ne sont qu’une manière de regrouper des systèmes proche et donnerons des avantages aux alliances et factions qui les contrôles.

Mes cours de math sont très très très loin mais je vais regarder ce que tu m’as envoyé…
Merci Smile


RE: Générateur de constellation - Xenos - 04-07-2014

Ne cite pas les Jeans gens quand tu leur réponds: réponds directement (on sait faire le lien entre deux posts, surtout consécutifs), ou à défaut (si c'est pour répondre à quelqu'un dont le post est assez "loin"), utilise "@nom-de-la-personne".

Les citations complètes des posts alourdissent la lecture (et accessoirement, pourraient pénaliser un référencement pour cause de textes C/C).