我有一个名为矩形的类,有两个参数(SX和SZ)。我需要做一个函数,它将在两个部分中分成第一个矩形,在较宽的维度上随机放置一条线,然后这两个新的矩形将被分为两个,然后是四个等。我使用一个简单的树结构和像这样的函数:
def devide(self):
if (self.SX>self.SZ): #check which dimension is bigger
temp=randint (int(self.SX/4), int(self.SX*3/4)) #generate random from x/4,3x/4
left=rectangle(temp, self.SZ) #create nodes
right=rectangle(self.SX-temp, self.SZ)
self.addChild(left)
self.addChild(right)
else:
temp=randint (int(self.SZ/4), int(self.SZ*3/4))
up=rectangle(self.SX, temp)
down=rectangle(self.SX, self.SZ-temp)
self.addChild(up)
self.addChild(down)
for c in self.getChilds():
while (c.level()<3): ####why doesn't it work?:(
c.devide()
函数level()
- 它应该(但它没有)返回根和实际节点之间有多少级别的值:
def level(self):
root=self
a=0
while root.isRoot()==False:
a+=1
root=root.getParent()
return a
对我来说重要的是:
如何限制这些分区(例如,只有1 + 2 + 4 + 8个节点)?我的意思是,Python中没有静态变量,我的函数level()
无法正常工作。
如何获取对最小孩子的访问权限(例如,将他们放入阵列中)
我是编程新手,尤其是Python。请问有人帮帮我吗?
答案 0 :(得分:2)
也许你正在寻找这样的东西:(它是双链接的(父母知道孩子和孩子知道父母)二叉树)
#! /usr/bin/python3.2
import random
class Rectangle:
def __init__ (self, width, height, parent = None):
self.width = width
self.height = height
self.parent = parent
self.children = []
@property
def level (self):
return 0 if not self.parent else 1 + self.parent.level
def split (self):
if self.children: raise Exception ('Already split')
ratio = random.random () * .5 + .25 #split between 1/4 and 3/4
if self.width > self.height:
width = int (ratio * self.width)
self.children = [Rectangle (width, self.height, self),
Rectangle (self.width - width, self.height, self) ]
else:
height = int (ratio * self.height)
self.children = [Rectangle (self.width, height, self),
Rectangle (self.width, self.height - height, self) ]
def splitUntilLevel (self, maxLevel):
if maxLevel <= self.level: return
self.split ()
for child in self.children: child.splitUntilLevel (maxLevel)
def __str__ (self):
s = '{}{} x {}\n'.format (' ' * (2 * self.level), self.width, self.height)
for child in self.children: s += str (child)
return s
r = Rectangle (100, 100)
r.splitUntilLevel (3)
print (r)
答案 1 :(得分:0)
应该是a += 1
,而不是a = +1
。
此外,在对象上调用divide()
不会增加自己的level
,因此您永远不会离开循环。您应该检查树的终端叶片上的水平。
答案 2 :(得分:0)
addChild(up)和addChild(down)是什么?您可以将每个矩形与包含自我级别的整数相关联,这样更容易,如果您想在生成新矩形时限制树的深度,只需计算结果:2 ^ h h-&gt;树的深度。