User Tools

Site Tools


sjolliet:solution_homework2
Critères & points attribués (/10)
Rappel du contexte 6
Résultats 5
Qualité du code (commentaires, structures utilisées, …) 5
Animation du dessin 7
Explication en dehors du code 3
Total (/50) 26

B.P. : Travail insuffisant. Au lieu de perdre du temps à utiliser le module tulipgui, les commentaires de chaque script python présente la commande UpdateVisualization() qui est nettement plus simple à utiliser.

Homework 2
  • Le but du deuxième devoir était dans mon cas d'implémenter les Onion Trees de Sindre sur un graphe aléatoire. Le but d'un Onion Tree est d'inclure à l'intérieur d'un noeud les noeuds qui dépendent de lui. L'exemple donné dans le papier de recherche montre que le noeud moteur peut être déposé à l'intérieur du noeud voiture. Dans mon cas, j'ai considéré que la notion de dépendance était couverte par la filiation. Ainsi, les noeuds fils descendant d'un noeud ancêtre sont dépendant de lui, et peuvent donc être inclus dans ce dernier. Mon algorithme consiste donc, pour chaque noeud du graphe, à trouver ses descendants et à les transporter dans ce noeud. L'algorithme utilise un déplacement pas à pas qui permet de suivre le mouvement. La grande difficulté dans l'implémentation des Onion Trees a été le côté graphique. Il m'a en effet été très difficile d'organiser correctement l'intérieur d'un noeud ancêtre, qui doit prendre en compte le nombre d’éléments inclus et qui doit être redessiné entièrement à chaque fois qu'on inclut un nouveau noeud. Je n'ai à ce jour toujours pas su implémenter correctement cette partie. Dans ma version des Onion Trees, tout les noeuds d'un même niveau se superposent, et on ne distingue que des hiérarchies (des noeuds inclus dans d'autres). J'ai aussi rencontré des problèmes d'affichage qui semblent inhérents à Tulip.
  • Simon_Jolliet_Onion_Trees.py
    # Powered by Python 2.7
     
    # To cancel the modifications performed by the script
    # on the current graph, click on the undo button.
     
    # Some useful keyboards shortcuts : 
    #   * Ctrl + D : comment selected lines.
    #   * Ctrl + Shift + D  : uncomment selected lines.
    #   * Ctrl + I : indent selected lines.
    #   * Ctrl + Shift + I  : unindent selected lines.
    #   * Ctrl + Return  : run script.
    #   * Ctrl + F  : find selected text.
    #   * Ctrl + R  : replace selected text.
    #   * Ctrl + Space  : show auto-completion dialog.
     
    from tulip import *
    from tulipgui import *
     
    # the updateVisualization(centerViews = True) function can be called
    # during script execution to update the opened views
     
    # the pauseScript() function can be called to pause the script execution.
    # To resume the script execution, you will have to click on the "Run script " button.
     
    # the runGraphScript(scriptFile, graph) function can be called to launch another edited script on a tlp.Graph object.
    # The scriptFile parameter defines the script name to call (in the form [a-zA-Z0-9_]+.py)
     
    # the main(graph) function must be defined 
    # to run the script on the current graph
     
    def main(graph): 
    	viewBorderColor =  graph.getColorProperty("viewBorderColor")
    	viewBorderWidth =  graph.getDoubleProperty("viewBorderWidth")
    	viewColor =  graph.getColorProperty("viewColor")
    	viewFont =  graph.getStringProperty("viewFont")
    	viewFontSize =  graph.getIntegerProperty("viewFontSize")
    	viewLabel =  graph.getStringProperty("viewLabel")
    	viewLabelColor =  graph.getColorProperty("viewLabelColor")
    	viewLabelPosition =  graph.getIntegerProperty("viewLabelPosition")
    	viewLayout =  graph.getLayoutProperty("viewLayout")
    	viewMetaGraph =  graph.getGraphProperty("viewMetaGraph")
    	viewRotation =  graph.getDoubleProperty("viewRotation")
    	viewSelection =  graph.getBooleanProperty("viewSelection")
    	viewShape =  graph.getIntegerProperty("viewShape")
    	viewSize =  graph.getSizeProperty("viewSize")
    	viewSrcAnchorShape =  graph.getIntegerProperty("viewSrcAnchorShape")
    	viewSrcAnchorSize =  graph.getSizeProperty("viewSrcAnchorSize")
    	viewTexture =  graph.getStringProperty("viewTexture")
    	viewTgtAnchorShape =  graph.getIntegerProperty("viewTgtAnchorShape")
    	viewTgtAnchorSize =  graph.getSizeProperty("viewTgtAnchorSize")
     
    #	Taille par defaut d'un noeud
    	hugeSize = tlp.Size(10,10,10)
     
    #	Decoupage du mouvement. Plus la valeur est elevee, plus le deplacement des noeuds sera lent
    	step = 10
     
    #  Modification de l'affichage des noeuds, on rajoute l'id du noeud au dessus d'un carre evide
    #  Et on modifie la taille du noeud pour plus de lisibilite
    	for n in graph.getNodes():
    		viewLabelPosition[n] = tlp.LabelPosition.Top
    		viewLabel[n] = "Node " + str(n.id)
    		viewShape[n] = tlp.NodeShape.CubeOutlinedTransparent
    		viewSize[n] = hugeSize
     
    #	Pour chaque noeud du graphe, on recupere ses fils, puis chaque fils est deplace dans le pere
    #	a une vitesse inversement proportionnelle a la variable step
    #	Le graphe est ensuite redessine pour suivre le mouvemeent du noeud
    #	Enfin, on modifie la forme du noeud fils afin qu'il soit visuellement inclut dans son ancetre
    	for n in graph.getNodes():
    		destination = viewLayout.getNodeValue(n)
    		listNodes = []
    		listeSize = 0
    		for outNode in graph.getOutNodes(n):
    			listNodes.append(outNode)
    			listeSize += 1
    		viewSize[n] = tlp.Size(10*listeSize,viewSize[n].getH(),10)
    		for outNode in listNodes:
    			positionActuelle = viewLayout.getNodeValue(outNode)
    			vector = (destination - positionActuelle)/step
    			iterator = 0
    			while(iterator < step):
    				positionActuelle += vector
    				iterator = iterator + 1					
    				viewLayout.setNodeValue(outNode, positionActuelle)
    				tlp.getOpenedViews()[0].draw()
    			viewSize.setNodeValue(outNode, tlp.Size(10,viewSize[n].getH()/2,10))
/net/html/perso/melancon/Visual_Analytics_Course/data/pages/sjolliet/solution_homework2.txt · Last modified: 2012/10/22 15:28 by bpinaud