0

私はあなたのアドバイスを必要とします。

さて、このアルゴリズムに問題があります。このプログラムのバイナリ ツリーに追加して維持する再帰的な方法を使用していますが、Split Once を 3 回実行すると、コードが壊れます。

例として、アルゴリズムのメソッドが常に垂直分割を実行し、垂直分割のみを実行するように強制するとします。したがって、私が持っている VertiSplit メソッドのみを呼び出します。方法は以下の通りです。私は記憶からこれを行っているので、1 つまたは 2 つの間違いがある可能性があります。

public void VertiSplit(Node curNode) //The node that called the method is passed in.
{
 int vRatio = curNode.height / curNode.width;
 //if( vRatio <=2) // Commented out so it never does a Horizontal Split.
 //{
     //Calculate the Split Point Data for the Parent node that called the method.
     curNode.splitX = curNode.xCoor + (curNode.width / 2);
     curNode.splitY = curNode.yCoor;
     curNode.splitW = 1; // Is 1 because it is passed into the draw call for the line.
     curNode.splitH = curNode.height;
     // Calculate Data for Children...
     curNode.child1.xCoor = curNode.xCoor;
     curNode.child2.xCoor = curNode.splitX;
     curNode.child1.yCoor = curNode.yCoor;
     curNode.child2.yCoor = curNode.yCoor;
     curNode.child1.width = curNode.splitX;
     curNode.child2.width = curNode.splitX;
     curNode.child1.height = curNode.height;
     curNode.child2.height = curNode.height; //At this point, calculations and assignment of the children's variables is completed. So I'll stop writing the code here..

このポイントの下に Report メソッド、閉じ括弧、および水平分割 (HoriSplit) メソッドを呼び出す上記の if ステートメントの false 条件に対する else ステートメントがあるとします。これを論理的に進めます。計算はこのようになるはずです。ダンジョンのサイズは512×512平方。スプリット X は、ここで関心のあるオブジェクトです。

1 回目の繰り返し: ノード ID: 0 分割 X: 256

2 回目の反復: ノード ID: 1 分割 X: 128 ノード ID: 2 分割 X: 384

3 回目の繰り返し: ノード ID: 3 分割 X: 64 ノード ID: 4 分割 X: 192 ノード ID: 5 分割 X: 320 ノード ID: 6 分割 X: 448

ただし、反復 #3 では、代わりに次のようになります。

3 回目の反復: ノード ID: 3 分割 X: 64 ノード ID: 4 分割 X: 192 ノード ID: 5 分割 X: 448 ノード ID: 6 分割 X: 448

コードが書かれている方法では、これを行うべきではありません。しかし、ノード #5 が壊れたのに、他のノードは問題ないのはなぜですか? 現時点では本当にわからないので、頭がいっぱいです。誰かが私を助けることができますか?

また、機能していないことがもう 1 つあります。テキストボックスによって制御されるtempの値が割り当てられているnumSplits(整数であるはず)の値を取るSplitCreateAllというメソッドで使用するために、一時文字列変数を32ビット整数に変換しようとしていますUnity の GUI で。何らかの理由で、numSplits に値を割り当てることができるように一時を解析しようとするたびに、テキスト ボックスに入力して 0 から変更した後、一時が正しい形式ではないというエラーが発生します。誰かがそこで何がうまくいかなかったのか教えてもらえますか?

編集:

public void GrowBranches(Node curNode)
{
  int randomval = randNum.Next();

  if(curNode.child1 != null)
     {
       findLeaves(curNode.child1);
       findLeaves(curNode.child2);
     }
  if(curNode.child1 == null)
    {
      curNode.child1 = new Node();
      curNode.child2 = new Node();
      curNode.child1.parent = curNode;
      curNode.child2.parent = curNode;
      curNode.child1.sister = curNode.child2;
      curNode.child2.sister = curNode.child1;
    }
    if(randomval % 2 == 0)
    {
     VertiSplit(curNode);
    }
    else
    {
      HoriSplit(curNode);
    }

私の GrowBranches メソッドがあります。これは、再帰チェーンで分割メソッドが呼び出される場所です。GrowBranches は、メソッド SplitCreateOnce および SplitCreateAll によっても呼び出されますが、後者は、解析エラーを含む上記の理由により機能しません。

4

1 に答える 1

0

推測する必要がある場合、次の2行だと思います。

 curNode.child1.width = curNode.splitX;
 curNode.child2.width = curNode.splitX;

xCoord=256、width=256、splitX が 386 (xCoord + 256/2) のノードを見ると、それは子ノードの幅ではなく、幅は 256/2 です。上記のコードでは、xCoord 386、幅 386 の子が作成されます。

テキスト エラーに関する質問の 2 番目の部分については、Unity テキスト ボックスを使用している場合、既存の値をクリアして入力を開始すると、空の文字列が Convert.ToInt32 に渡される可能性があります。a を使用してTry/Catch、エラーを無視してください。

于 2013-04-19T03:14:15.517 に答える