0

独自のバージョンの octree を作成しようとしていますが、異なるサイズのポイントを追加しようとすると問題が発生します。深度レベルを下げるとすべてが上書きされるため、大きなブロックの情報が削除されます。

これを修正する最善の方法は、最後のポイントを逆方向にチェックし、新しいポイントの深さまでリストを再構築することだと思いました。しかし、私が求めている出力を考えるのは本当に簡単であるという事実にもかかわらず、実際にリストを作成する方法を理解することはできません.

開始リストと終了リストの例を使用してリストを作成するために必要なデータは次のとおりです["Nodes",(coordinate),"Nodes",(coordinate)...]。各座標がstructureリスト内のすべての項目を最後に到達するまでカバーする形式でデータが必要です。

structure = [(-1, -1, -1), (-1, -1, 1), (-1, 1, -1), (-1, 1, 1), (1, -1, -1), (1, -1, 1), (1, 1, -1), (1, 1, 1)]

start = ['Nodes', (1, 1, 1), 'Nodes', (-1, -1, -1)]
end = ['Nodes', (1, 1, 1), 'Nodes', (-1, -1, -1), 'Nodes', (1, 1, 1), 'Nodes', (-1, -1, -1), 'Nodes', (1, -1, -1), 'Nodes', (-1, -1, -1)]
length = len( end )-len( start )

これは極端な例 (深度 4 から 0 への移行) であり、4096 の異なる値を生成しますが、99% の確率でこれほど大きな値にはならないため、パフォーマンスはそれほど重要ではありません。

開始値と終了値の例の場合、各長さの値は必要ありません。次のように、すべて最大長にする必要があります-

['Nodes', (1, 1, 1), 'Nodes', (-1, -1, -1), 'Nodes', (-1, -1, -1), 'Nodes', (-1, -1, -1), 'Nodes', (-1, -1, -1), 'Nodes', (-1, -1, -1)]
['Nodes', (1, 1, 1), 'Nodes', (-1, -1, -1), 'Nodes', (-1, -1, 1), 'Nodes', (-1, -1, -1), 'Nodes', (-1, -1, -1), 'Nodes', (-1, -1, -1)]
['Nodes', (1, 1, 1), 'Nodes', (-1, -1, -1), 'Nodes', (-1, 1, -1), 'Nodes', (-1, -1, -1), 'Nodes', (-1, -1, -1), 'Nodes', (-1, -1, -1)]
#4002 values later
['Nodes', (1, 1, 1), 'Nodes', (-1, -1, -1), 'Nodes', (1, 1, 1), 'Nodes', (1, 1, 1), 'Nodes', (1, 1, 1), 'Nodes', (1, 1, 1)]

私は試みましたが、実際には再帰的ではないことに気付きました。とにかくここにあります-

newThing = {}
for i in range( length/2 ):
    try:
        #Set it to previous level so you can append
        newThing[i] = newThing[i-1]
    except:
        #Start off the dictionary
        newThing[i] = {}
        for j in range( len( structure ) ):
            newThing[i][j] = start
    #Add structure value for each one
    for j in range( len( structure ) ):
        newThing[i][j].append( "Nodes" )
        newThing[i][j].append( structure[j] )

私が本当に必要とするのは実行時の各リストだけなので、ループ内からすべての組み合わせを出力できる段階に到達できれば、それらすべてを保存するためにメモリが無駄にならないので、それは素晴らしいことです:)

4

1 に答える 1

0

誰も答えなかったので、それを回避する最も簡単な方法は再帰関数であると考え、幸運に恵まれました。最大長に達するまでリストの作成を続け、一度にすべてを返します。

def recursiveList( currentInput, combinations, length ):
    newInputList = []
    for input in currentInput:
        if len( input ) < length:
            for combination in combinations:
                newInputList += recursiveList( [input + [input[0], combination]], combinations, length )
        else:
            newInputList.append( input )
    return newInputList

質問に投稿した値を使用すると、recursiveList( [start], structure, len(end) )4096 の正しい値が返されます

それは私が思っていたよりもはるかに速く進みます。時間の結果は次のとおりです -

64 個のリスト: 0.0000057 秒
512 個のリスト: 0.00048 秒
4096 個のリスト: 0.004 秒
32768 個のリスト: 0.032 秒

于 2015-03-17T02:05:32.787 に答える