2010-01-31 24 views
1

j'ai un problème avec la largeur premier algorithme, mon script génère des courbes MAYA, les positionner, faire pivoter et de les étendre afin qu'ils me donnent la forme d'arbre, j'ai ces variablesavec largeur première génération d'arbres

cs = état actuel,

p = parent,

noeuds = noeud non visités Liste

lvl = profondeur actuelle

maxlvl = profondeur max

le problème est que je ne peux pas contrôler la profondeur actuelle, et mettre fin à l'arbre là-bas, il existe sans tous les nœuds visités

ici est mon script

import random 
import math 
import maya.cmds as mc 
#----define set----- 
#--- curve, #children,angle,l-------- 
#----define rule---- 
# l=80% ch<=3 angle<=45 
l=0.8 
ch=6 
ang=50 
#---list to track---- 
nodes=[] 
#--- begin----- 
#---start curve----- 
nodes.append(mc.curve(n="a",d=3,p=((0,0,0),(0,1,0),(0,3,0),(0,5,0),(0,6,0)),k=(0,0,0,1,2,2,2))) 
cs="" #---current state---- 
p="a" #---paretn of the current state---- 
maxlvl=6 #--max depth for the tree 
lvl=1 #-- cuurent level---- 
while (len(nodes)!=0 and lvl<5): 
#---generate children number---- 
chN=random.randint(0,ch) 
for j in range(chN): 
    #----generate node---- 
    mc.select(p,r=1) 
    cs=mc.duplicate(rr=1)[0] 
    #---append to node lst---- 
    nodes.append(cs) 
    #---adjust pos--- 
    pos=mc.pointPosition(p+".cv[4]") 
    mc.xform(cs,t=(pos[0],pos[1],pos[2]),ws=1) 
    #---adjust rotation--- 
    mc.rotate(0,0,(random.random()*45+5)*math.pow(-1,j%2),cs,r=1) 
    #---adjust scale--- 
    mc.scale(0,math.pow(0.8,lvl),0,cs) 
    j+=1 
#--- go to next parent--- 
nodes.pop(0) 
if nodes: 
    p=nodes[0] 
lvl+=1 

merci à l'avance

Répondre

4

Vous devez associer la profondeur à chaque noeud. Soit mettre en tant que membre de la classe de noeud, ou avez vos entrées de file d'attente stocker à la fois la profondeur et le noeud comme celui-ci:

nodes.append((1, firstNode)) 
while nodes and lvl<5: 
    lvl, p = nodes.pop(0) 

    For each child: 
     #...create child 
     nodes.append((lvl+1, cs)) 

Quelques notes sans rapport avec:

  • Utilisation collections.deque au lieu de list: Il est plus rapide pour les files d'attente FIFO.

  • L'instruction j+=1 est inutile dans la boucle for.

+0

merci .. qui a été utile: D +1 –