User Tools

Site Tools


vruffet:solution_homework2

This is an old revision of the document!


Critères & points attribués (/10)
Rappel du contexte 3
Résultats 10
Qualité du code (commentaires, structures utilisées, …) 7
Animation du dessin 0
Explication en dehors du code 4
Total (/50) 24

B.P. : Votre code fournit le résultat attendu (uniquement sur un arbre binaire complet) mais sans animation Vous n'avez fournit aucun commentaire en dehors ou dans votre code (mais il y a quand même un rappel du sujet). J'ai repris la partie qui permet de trouver le noeud racine du graphe. Je ne comprends pas la dernière phrase de votre commentaire. La partie de l'article fournie qui aborde les H-Tree est l'algorithme de dessin à utiliser !

Bonjour,

Vous trouverez, ci-dessous, le script Python 'icicle_plot' que j'ai réalisé. Il faut l'appliquer sur un arbre existant.

Ce script commence par calculer pour chaque noeud le nombre de ses fils (direct ou indirect) qui sont des feuilles pour avoir une proportionnalité lors de la mise en forme de l'arbre. Puis met en forme tous les noeuds un par un en fonction de la valeur calculée précédemment correspondante au noeud.

Je ne sais pour qu'elle raison, sous la version 3.8.0 de Tulip, il faut appliquer le script 2 fois pour obtenir le résultat voulu.

Devoir.py
from tulip import *
 
nbleaf = dict(); # Ce dictionnaire contient le nombre de noeuds fils (directs ou indirects) qui sont des feuilles.
 
def main(graph):
 
	# modification de la couleur de la bordure des arretes : blanc transparent
	graph.getColorProperty("viewBorderColor").setAllEdgeValue(tlp.Color(255, 255, 255, 0));
	# modification de la couleur des arretes : blanc transparent
	graph.getColorProperty("viewColor").setAllEdgeValue(tlp.Color(255, 255, 255, 0));
	# modification de la couleur de la bordure des noeuds : noir opaque
	graph.getColorProperty("viewBorderColor").setAllNodeValue(tlp.Color(0, 0, 0, 255));
	# modification de l'epaisseur de la bordure des noeuds : 1.0
	graph.getDoubleProperty("viewBorderWidth").setAllNodeValue(1.0);
	# modification de la forme des noeuds : carre
	graph.getIntegerProperty("viewShape").setNodeValue(node, 1);
 
	# remplissage du dictionnaire nbleaf
	setNbLeaf(graph.getOneNode());
 
	# formatage des noeuds
	createNode(graph.getOneNode(), 0, 0);
 
 
 
# Cette fonction remplie le dictionnaire nbleaf
# Fonction recursive
# Prend en parametre le noeud a traiter
def setNbLeaf(node):
	i = 0;
	# si le noeud node a au moins un noeud fils
	if graph.getOutNodes(node).hasNext() :
		# pour chaque noeud fils
		for next in graph.getOutNodes(node):
			# si le noeud fils a lui-meme au moins un fils
			if graph.getOutNodes(next).hasNext():
				# ajout du nombre de noeud feuille (direct ou indirect) du noeud fils
				i += setNbLeaf(next);
			else:
				# ajout de 1 noeud feuille
				i += 1;
 
	# on met le resultat dans le dictionnaire
	nbleaf[node.id] = i;
	return i;
 
 
 
# Cette fonction met en forme les noeuds pour creer un graphe sous forme 'icicle plot'
# Fonction recursive	
# Prend en parametre le noeud a traiter et les coordonnees ou placer le noeud
def createNode(node, x, y):
	# modification de la position du noeud
	graph.getLayoutProperty("viewLayout").setNodeValue(node, tlp.Coord(x + (graph.getSizeProperty("viewSize").getNodeValue(node).getW() / 2), (y * 2)));
	# si le noeud a des fils feuilles (direct ou indirect)
	if (getNbleaf(node.id) > 0):
		# modification des dimensions du noeud : hauteur : 2 et largeur : le nombre de fils feuilles (direct ou indirect) pour obtenir une proportionnalite
		graph.getSizeProperty("viewSize").setNodeValue(node, tlp.Size(float(getNbleaf(node.id)), 2.0, 1.0));
	else:
		# modification de la largeur du noeud : hauteur : 2 et largeur : 1
		graph.getSizeProperty("viewSize").setNodeValue(node, tlp.Size(1.0, 2.0, 1.0));
 
	# si le noeud a des fils
	if graph.getOutNodes(node).hasNext() :
		# imcrementation de l'ordonnee pour passer au niveau suivant pour le disposition des fils du noeud
		y += 1;
		# pour tous les noeuds fils
		for next in graph.getOutNodes(node):
			# mise en forme du noeud fils
			createNode(next, x, y);
			# incrementation de l'abscisse de la largeur du noeud positionne pour positionner le suivant comme il faut
			x += graph.getSizeProperty("viewSize").getNodeValue(next).getW();
 
 
 
 
# Cette fonction retourne le nombre de fils feuilles (direct ou indirect) du noeud n
# Prend en parametre le noeud a traiter
def getNbleaf(n):
	res = 0;
	for key, val in nbleaf.items():
		if key == n:
			res = val;
	return res;
/net/html/perso/melancon/Visual_Analytics_Course/data/attic/vruffet/solution_homework2.1350995933.txt.gz · Last modified: 2012/10/23 14:38 by bpinaud