User Tools

Site Tools


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

Le rappel du contexte est trop succinct ainsi que vos explications sur le travail et les commentaires dans le code. Néanmoins, on obtient le résultat attendu. Il manque un paramètre pour gérer la vitesse de l'animation des changements

python oniontreefloat.py
#author Faux Thomas master Bioinformatique 2012
 
from tulip import *
 
 
def deplaceNoeud(x,y,noeud):
	noeudX = graph.getProperty('viewLayout').getNodeStringValue(noeud).replace('(',''.replace(')','')).split(',')[0]
	noeudY = graph.getProperty('viewLayout').getNodeStringValue(noeud).replace('(',''.replace(')','')).split(',')[1]
	#calcul de la distance a parcourir pour placer le noeud aux coordonees voulues
	while float(noeudX)>x+1 or float(noeudX)<x-1:	
		updateVisualization(centerViews = True)
		graph.getProperty('viewLayout').setNodeStringValue(noeud,"("+noeudX+","+noeudY+",0)")
		if float(noeudX)-x<0:		
			noeudX=str(float(noeudX)+1)
		else:
			noeudX=str(float(noeudX)-1)
 
	while float(noeudY)>y+1 or float(noeudY)<y-1:
		updateVisualization(centerViews = True)	
		graph.getProperty('viewLayout').setNodeStringValue(noeud,"("+noeudX+","+noeudY+",0)")
		if float(noeudY)-y<0:		
			noeudY=str(float(noeudY)+1)
		else:
			noeudY=str(float(noeudY)-1)
 
	graph.getProperty("viewLayout").setNodeStringValue(noeud,"("+str(x)+","+str(y)+",0)")
 
def grandirNoeud(noeud,x,y):
	graph.getSizeProperty("viewSize").setNodeStringValue(noeud, "("+str(x)+","+str(y)+",0)")
 
def couleurNoeud(noeud):
	pere = graph.getInNode(noeud,1)
	couleurPere = graph.getColorProperty("viewColor").getNodeValue(pere)
	couleurFils = graph.getColorProperty("viewColor").getNodeValue(noeud)
	couleurFils.setR(couleurPere.getR()+25)
	couleurFils.setG(couleurPere.getG()+16)
	couleurFils.setB(couleurPere.getB()+5)
	graph.getColorProperty("viewColor").setNodeValue(noeud, couleurFils)
 
 
def traitementNoeud(noeud):
	#1 on recupere le pere
	pere = graph.getInNode(noeud,1)
	#2 et on gere sa couleur
 
	couleurNoeud(noeud)
	#3 on recupere le nombre de freres et et la place du noeud dans sa fraterie
	nbfreres	= 0
	for fils in graph.getOutNodes(pere):
			nbfreres = nbfreres+1
			if fils == noeud:
				place = nbfreres
 
	#4 placement du fils en fonction du pere
	taillePereX= float(graph.getProperty('viewSize').getNodeStringValue(pere).replace('(','').replace(')','').split(',')[0])
	taillePereY= float(graph.getProperty('viewSize').getNodeStringValue(pere).replace('(','').replace(')','').split(',')[1])
	posPereX= float(graph.getProperty('viewLayout').getNodeStringValue(pere).replace('(','').replace(')','').split(',')[0])
	posPereY= float(graph.getProperty('viewLayout').getNodeStringValue(pere).replace('(','').replace(')','').split(',')[1])
 
       	#si le pere a une largeur 2 fois plus grande que sa hauteur on fixe le x
	if (taillePereX < 2*taillePereY):
		posNoeudX=posPereX
		tailleNoeudX=taillePereX-(taillePereX/25)
			#on determine la coordonnee x du noeud
		posNoeudY=((posPereY-taillePereY/2)+taillePereY/(nbfreres*2))+(place-1)*(taillePereY/nbfreres)
		tailleNoeudY=(taillePereY/nbfreres)-(taillePereY/25)
 
 
		#sinon par defaut on fait un rectangle en fixant le y
	else:
		posNoeudY=posPereY
		tailleNoeudY=taillePereY-(taillePereY/25)
			#on determine la coordonnee x du noeud
		posNoeudX=((posPereX-taillePereX/2)+taillePereX/(nbfreres*2))+(place-1)*(taillePereX/nbfreres)
		tailleNoeudX=(taillePereX/nbfreres)-(taillePereX/25)
	deplaceNoeud(posNoeudX,posNoeudY,noeud)
	grandirNoeud(noeud,tailleNoeudX,tailleNoeudY)
 
	#5 on continue notre parcours du graphe
 
 
 
	for fils in graph.getOutNodes(noeud):
		traitementNoeud(fils)
 
 
 
def main(graph): 
	viewBorderColor =  graph.getColorProperty("viewBorderColor")
	viewBorderWidth =  graph.getDoubleProperty("viewBorderWidth")
	viewColor =  graph.getColorProperty("viewColor")
	viewLayout =  graph.getLayoutProperty("viewLayout")
	viewSelection =  graph.getBooleanProperty("viewSelection")
	viewShape =  graph.getIntegerProperty("viewShape")
	viewSize =  graph.getSizeProperty("viewSize")
 
 
	for n in graph.getNodes():
		viewBorderWidth.setNodeStringValue(n, "1")
 
	viewShape.setAllNodeStringValue("4")
	for noeud in graph.getNodes():
		if not graph.getInEdges(noeud).hasNext():
			racine = noeud
			viewColor.setNodeValue(racine, tlp.Color(4,47,104))
			grandirNoeud(racine,1000,1000)
			deplaceNoeud(500,500,racine)
 
 
#parcours du graph
	for noeud in graph.getOutNodes(racine):
		traitementNoeud(noeud)

Ce script python accomplis selon la consigne la transformation graphique d'un arbre sous la forme d'un Onion tree. Le script est composé du'un main et 4 fonctions:

 la fonction bougerNoeud
 la fonction grandirNoeud
 la fonction couleurNoeud
 la fonction traitementNoeud

Le main commence par imposer la forme des noeuds en rectangles, sous tulip 4.0 la forme des noeuds est par defaut des cercles. Il y a ensuite une recherche du noeud racine,auquel on donne un couleur,il sera agrandis via la fonction grandir noeud, puis déplacé au milieu de la fenetre. On parcours ensuite les fils de la racine et on appelle la fonction traitementNoeud pour chacun d'eux.

La fonction traitementNoeud est une fonction récursive, on récupère le père du noeud concerné, on actualise sa couleur, on récupère le nombre de frères et leurs places réspectives dans l'arbre. Ensuite on va placer le fils en fonction du père, on récupère la taille et la position du père, on détermine si le rectangle représentant le noeud sera plus haut que large ou le contraire, puis on détermine les coordonées finales du noeud. On parcours ensuite les fils du noeud en apelant la fonction traitement noeud, ce qui nous permet de parcourir de façon récursive l'arbre.

La fonction couleurNoeud, récupère le père, cherche sa couleur, puis augmente ses valeurs d'un incrément et attribue la nouvelle couleur au fils.

La fonction grandirNoeud donne au noeud la taille désirée

Lafontion deplaceNoeud récupère les coordonées du noeud qu'on veux déplacer, pour que les cadres de chaque noeuds soient bien placés j'ai été obligé de recourir à des floats car avec des int les fils qui étaient bas dans l'arbre finissaient par chevaucher le cadre de leurs pères. Grâce à la fonction updateVizualisation j'ai pu faire en sorte que le déplacement des noeuds soit animé, le noeud se déplace par incrément de 1 sur les x puis sur les y.

Je n'ai pas réussi à régler le problème des arètes sur tulip 3.8.0, mais il est réglé dans le tulip 4.0

/net/html/perso/melancon/Visual_Analytics_Course/data/pages/tfaux/homework_2.txt · Last modified: 2012/10/22 12:45 by bpinaud