User Tools

Site Tools


maxime_eychenie:solution_homework1

Tree drawing algorithm implementation

Réalisé en binôme avec Etienne Grandier-Vazeille

Pour cet exercice en binôme, nous avons choisi de réaliser l'algorithme icicle Plot.

L'animation est réalisé par une pause et une réactualisation de l'affichage dans le code python. Cependant cette astuce ne fonctionne pas sur la version windows de Tulip, car la visualisation n'est pas calculée en temps réel.

En guise de test, nous avons généré des Arbres complets et incomplet via l'outil d'importation de Tulip.

Rendu final pour un arbre aléatoire de 302 noeuds Rendu final pour un arbre aléatoire de 302 noeuds

Rendu final pour un arbre complet de profondeur 5 et de degré 2 Rendu final pour un arbre complet de profondeur 5 et de degré 2

Voici le code que nous avons effectué pour obtenir l'algorithme :

icicle.py
# -*- coding: utf-8 -*-
# Auteur :
# Etienne Grandier-Vazeille
# Maxime Eychenié
 
 
from tulip import *
import time
 
 
# parametres d'affichage :
WIDTH_BASE = 1000 # largeur de la racine
HEIGHT_BASE = 100 # hauteur d'un niveau
COLOR_BASE = 0 # la couleur de la racine
 
def main(graph): 
    root = getRoot(graph)
    baseSize = tlp.Size(WIDTH_BASE,HEIGHT_BASE,0)
    pos = tlp.Coord(0,0,0)
 
    makeIcicle(graph, root, baseSize, pos, COLOR_BASE)
 
    updateVisualization() # pour center la vue
 
# Récupere la racine de l'arbre en regardant quel noeud ne dispose pas de père
# Dans le cas d'une forêt la fonction prend seulement le premier arbre trouvé
# arg : graph = un graphe
# return : la racine d'un des arbres du graphe
def getRoot(graph):
    root = None
    for n in graph.getNodes():
        if len(list(graph.getInNodes(n))) == 0:
            root = n
    return root
 
# Modifie les paramétres d'un noeud
# Cette fonction permet de séparer l'algorithme de la visualisation
# arg :
#   node = le noeud a modifier
#   pos = la position future du noeud
#   size = la taille future du noeud
#   color = le numéro de couleur future du noeud
# return : rien
def setNode(node, pos, size, color):
    viewSize =  graph.getSizeProperty("viewSize")
    viewLayout =  graph.getLayoutProperty("viewLayout")
    viewShape =  graph.getIntegerProperty("viewShape")
    viewColor = graph.getColorProperty("viewColor")
 
    viewShape[node] = tlp.NodeShape.Square
    viewSize[node] = size
    viewLayout[node] = pos
    viewColor[node] = tlp.Color(255-color, 130-color, 150-color)
 
 
# Fabrique le graphe icicle récursivement
# arg :
#   graph = le graphe à transformer
#   node = la racine de ce graphe
#   size = la taille de la future racine
#   pos = la  position de la future racine
#   color = le numéro de couleur de la future racine
# return : rien
def makeIcicle(graph, node, size, pos, color):
    setNode(node, pos, size, color)
    color -= 20
 
    childs = list(graph.getOutNodes(node))
    nbChild = len(list(childs))
 
    if nbChild == 0:
        return
    sizeChild = tlp.Size(size.getW()/nbChild,HEIGHT_BASE,0)
 
    cpt = 0
    for n in childs:
        dec = size.getW()/2-sizeChild.getW()/2
        coord = tlp.Coord(pos.getX()+(sizeChild.getW()*cpt)-dec, pos.getY(), 0)
        coord2 = tlp.Coord(coord.getX(), coord.getY()-HEIGHT_BASE, 0)
        cpt+=1
        time.sleep( 0.1 ) # Permet l'animation
        updateVisualization()
        makeIcicle(graph, n, sizeChild, coord2, color)
/net/html/perso/melancon/Visual_Analytics_Course/data/pages/maxime_eychenie/solution_homework1.txt · Last modified: 2014/10/20 00:00 by eychenie