0

2つのパラメータ(SXとSZ)を持つ長方形と呼ばれるクラスがあります。最初の長方形を2つの部分に分割し、幅の広い次元のランダムな場所に線を配置する関数を実行する必要があります。次に、これら2つの新しい長方形を2つに分割し、次に4つに分割します。単純なツリー構造を使用します。このような関数:

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の初心者です。誰か助けてくれませんか?

4

3 に答える 3

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)
于 2012-12-29T18:34:33.937 に答える
0

a += 1ではなく、である必要がありa = +1ます。

divide()また、オブジェクトを呼び出してもそれ自体は増加しないlevelため、ループから抜け出すことはありません。木の末端の葉のレベルを確認する必要があります。

于 2012-12-29T18:04:35.973 に答える
0

addChild(up)とaddChild(down)とは何ですか?各長方形に自己レベルを含む整数を関連付けることができます。これははるかに簡単です。新しい長方形を生成するときにツリーの深さを制限する場合は、2 ^hh->ツリーの深さの結果を評価するだけです。

于 2012-12-29T18:12:33.370 に答える