User Tools

Site Tools


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

Attention, cet algorithme travaille sur des arbres uniquement (graphe simple est trop vague) ! Vous n'avez pas terminé le travail demandé.

Pour ce travail j'ai du implémenter un algorithme qui prend en entrée un graphe simple et qui donne en sortie un graphe de type onion-graphe. La particularité de cette mise en page de graphe est que des noeuds peuvent contenir d'autres noeuds. En l'occurrence un noeud contient un ou plusieurs autres noeud si et seulement si ces noeud ont un lien de parenté. Pour réaliser cet algorithm j'ai choisi de définir une fonction onionGraph récursive. Cette fonction prend en paramètre un graph et un noeud racine. Plus en détail, pour faire en sorte qu'un noeud en contiennent d'autres, l'astuce à été de redimensionner, déplacer, et changer la couleur du fond du noeud contenant pour qu'on puisse voir les autres à l'intérieur. Après le traitement effectué sur les noeuds, on supprime les arrêtes qui les liaient. Au départ je m'étais lancé sur les meta nodes (ce type de noeud permet de créer des “ensembles”, c'est à dire un gros noeud qui en contient d'autres), proposées par le logiciel Tulip, mais c'est un sujet que l'on abordera plus tard, et ce sont des types de données un peu complexe à utiliser. C'est pour cela que l'on m'a conseillé de travailler sur l'aspect des noeuds plutôt que d'utiliser les meta ondes. L'algorithme que j'ai implémenté marche pour le premier noeud, mais ne fonctionne pas pour le reste. J'aurai voulu récupérer le sous-graph qui à pour racine le ou les fils du noeud racine, pour pouvoir y appliquer l'algorithme. Et ainsi de suite jusqu'aux feuilles du graphe de départ.

Devoir.py
from tulip import *
 
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")
 
	onionGraph(graph,graph.getSource())
 
def onionGraph(graph,root):
#changer le noeud de couleur
	white = tlp.Color(255,255,255)
	viewColor = graph.getColorProperty("viewColor")
	viewColor[root] = white
#changer les coordonees
	viewLayout = graph.getLayoutProperty("viewLayout")
	viewsize = graph.getSizeProperty("viewSize")
	firstNeighbour = graph.getOutNode(root,1)
	FirstNodeCoord = viewLayout.getNodeValue(firstNeighbour)
	Ycoord = FirstNodeCoord.getY()
	coordXAllNodes = []
	coordYAllNodes = []
	rootNeighbours = graph.getOutNodes(root)
	for node in rootNeighbours:
		print node
		nodeCoord = viewLayout.getNodeValue(node)
		nodeCoord.setY(Ycoord)
		viewLayout.setNodeValue(node,nodeCoord)
	rootCoord = viewLayout.getNodeValue(root)	
	nodeSize = viewsize.getNodeValue(root)
	for n in graph.getNodes():
		nCoord = viewLayout.getNodeValue(n)
		coordXAllNodes.append(nCoord.getX())
		coordYAllNodes.append(nCoord.getY())
	minX = min(coordXAllNodes)
 	maxX = max(coordXAllNodes)
 	minY = min(coordYAllNodes)
 	maxY = max(coordYAllNodes)
	W = (maxX-minX)+4
	H = (maxY-minY)+4
	X = (minX+(maxX-minX)/2)
	Y = (minY+(maxY-minY)/2)
	nodeSize.setW(W)
	nodeSize.setH(H)
	rootCoord.setX(X)
	rootCoord.setY(Y)
	viewLayout.setNodeValue(root,rootCoord)
	viewsize.setNodeValue(root,nodeSize)
	rootNeighbours = graph.getOutNodes(root)
	for neighbours in rootNeighbours:
		print "plop"
		subGraphs = graph.getSubGraphs()
		for g in subGraphs:
			if g.getSource() == neighbours:
				if g.getOutNodes(neighbours) != []:
					onionGraph(g,neighbours)
	#supprimer les arcs adjacents
	outEdges = graph.getOutEdges(root)
	graph.delEdges(outEdges)
/net/html/perso/melancon/Visual_Analytics_Course/data/pages/egachet/solution_homework2.txt · Last modified: 2012/10/22 15:04 by bpinaud