проблема с шириной первого поколения деревьев - PullRequest
1 голос
/ 31 января 2010

У меня проблема с первым алгоритмом ширины, мой скрипт генерирует кривые в Maya, размещает их, поворачивает и масштабирует, чтобы они дали мне форму дерева, у меня есть эти переменные

cs = текущее состояние,

р = родитель,

узлов = не посещенных узлов Список

lvl = текущая глубина

maxlvl = максимальная глубина

проблема в том, что я не могу определить текущую глубину и завершить там дерево, он существует без посещения всех узлов

вот мой сценарий

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

заранее спасибо

1 Ответ

4 голосов
/ 31 января 2010

Вам необходимо связать глубину с каждым узлом. Либо поместите его как член в класс узла, либо в записях очереди хранятся значения глубины и узла, например:

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

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

Некоторые несвязанные заметки:

  • Используйте collections.deque вместо list: это быстрее для очередей FIFO.

  • Инструкция j+=1 не требуется в цикле for.

...