私はあなたのアドバイスを必要とします。
さて、このアルゴリズムに問題があります。このプログラムのバイナリ ツリーに追加して維持する再帰的な方法を使用していますが、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 によっても呼び出されますが、後者は、解析エラーを含む上記の理由により機能しません。