26-10-2008, 01:57 AM
Bonsoir,
J'ai terminer un truc un peu bancale et qui ne marche pas si un élément à plusieurs parents...
Sinon ils sont bien positionner (mais pas relier ici)
Je suis parti du principe que les enfants de l'arbre on une place disponible de plus en plus mince. Ce qui fait que les enfants sont toujours sous les parents et ne passe pas sous le voisin.
Par curiosité, quel étais ton idée de départ ?
J'ai prévenu, c'est bancale ^^
J'ai terminer un truc un peu bancale et qui ne marche pas si un élément à plusieurs parents...
Sinon ils sont bien positionner (mais pas relier ici)
Je suis parti du principe que les enfants de l'arbre on une place disponible de plus en plus mince. Ce qui fait que les enfants sont toujours sous les parents et ne passe pas sous le voisin.
Par curiosité, quel étais ton idée de départ ?
Code PHP :
<?php
error_reporting(E_ALL);
/*calcule le décalage à gauche de chaque case et le rentre dans la variable $parent
forme [elemnt]=>taille de la case, ...*/
function calcule_positionx_arbre(&$arbre, &$parent, $enfants, $taille=1)
{
$taille_return = $taille;
//on traverse chaque rangé
foreach($enfants as $element)
{
//on calcul le décalge des enfants par rapport au point d'origine (et à leur parents)
if(count($arbre[$element]) > 0)
{
//nombre d'enfant
$nb_enfant = count($arbre[$element]);
//taille d'un enfant
$taille /= $nb_enfant;
//position de l'element le plus à gauche
$decalage = $parent[$element] - $taille * ($nb_enfant -1) / 2 ;
//on enregistre les enfants avec leur décalage et leurs tailles
foreach($arbre[$element] as $enfant)
{
$parent[$enfant] = $decalage;
$decalage += $taille;
}
//repere la case avec le moins d'espace
$taille_e = calcule_positionx_arbre($arbre, $parent, $arbre[$element], $taille);
if($taille_e < $taille_return)
$taille_return = $taille_e;
}
}
//retourne la case avec le moins d'espace
return $taille_return;
}
/*calcule le décalage du haut de chaque case et le rentre dans la variable $positions
forme : [0] => tableau des elements de cette lignes, [1] => tableau des elments de cette ligne....*/
function calcule_positiony_arbre(&$arbre, &$positions, $idparent = 0, $indice=0)
{
foreach($arbre[$idparent] as $id)
{
$positions[$indice][] = $id;
calcule_positiony_arbre($arbre, $positions, $id, $indice+1);
}
}
function affiche_arbre(&$arbre, $largeur=50, $hauteur=30)
{
$positions = array();
calcule_positiony_arbre($arbre, $positions);
//chiffre qui correspont à la taille du parent avec comme indice le premier parent(0)
$parent = array(0=>1);
$taille_plus_petit = calcule_positionx_arbre($arbre, $parent, array(0)); //array(0) => 1er parent
//affiche l'arbre
$a = array(); //tableau comprtant le decalage en pixel
$i=0;
$min = current($parent)*$largeur/$taille_plus_petit; //coefficient multiplicateur pour séparer les cases
foreach($positions as $values)
{
foreach($values as $value)
{
$a[$i][$value] = $parent[$value]*$largeur/$taille_plus_petit;
}
//recherche l'element positionner le plus à gauche pour pouvoir décaller le graph
if($parent[$values[0]]*$largeur/$taille_plus_petit < $min)
{
$min = $parent[$values[0]]*$largeur/$taille_plus_petit;
}
$i++;
}
foreach($positions as $key=>$values)
{
foreach($values as $value)
{
echo '<div style="outline:1px green solid;position:absolute;width:'.$largeur.'px;height:'.($hauteur-10).'px;background-color:orange;margin-top:'.($hauteur*$key).'px;margin-left:'.($a[$key][$value]-$min)."px;\">$value <!--[{$a[$key][$value]}]--></div>\n";
}
}
}
$arbre = array(
0 => array(14),
14 => array(1, 2),
1 => array(3),
2 => array(4, 5),
3 => array(6, 7),
4 => array(),
5 => array(8),
6 => array(),
7 => array(12, 13),
8 => array(9,10,11),
9 => array(),
10 => array(),
11 => array(),
12 => array(),
13 => array(),
);
affiche_arbre($arbre);
?>