2013-04-18 2 views
0

귀하의 조언이 필요합니다.C# BSP 분할 알고리즘 논리 또는 계산 오류

좋아요, 그래서이 알고리즘에 문제가 있습니다. 이 프로그램에 대한 이진 트리를 추가하고 유지 관리하는 재귀 적 방법을 사용하고 있지만 Split Once가 세 번 완료되면 코드가 손상됩니다.

예를 들어,은 알고리즘의 메서드가 항상 수직 분할과 수직 분할 만 수행하도록하고, 따라서 내가 가지고있는 VertiSplit 메서드 만 호출한다고 가정 해 보겠습니다. 방법은 다음과 같습니다. 나는이 일을 기억에서하고 있기 때문에 가능한 한 가장 단순한 방법으로 가고 있습니다.

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.. 

이 점 이하의 신고 방법, 닫는 브래킷 및 위의 거짓 조건에 대한 else 문이라고 가정하면 수평 분할 (HoriSplit) 메서드를 호출 문. 이것을 논리적으로 진행합니다. 계산은 이렇게되어야합니다. 던전 크기는 512 x 512 평방입니다. 스플릿 X가 여기에서 관심의 대상입니다.

첫번째 반복 : 노드 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 번이 고장 났는가? 나는이 시점에서 정말로 모른다. 그리고 나는 그것에 대해 나의 지혜 끝에있다. 누군가 나를 도울 수 있습니까?

또한 작동하지 않는 또 다른 문제가 있습니다. temp 문자열 값을 32 비트 정수로 변환하려고합니다. SplitCreateAll 메서드는 정수로 가정되는 numSplits 값을가집니다. temp 값은 텍스트 상자에 의해 제어됩니다. Unity의 GUI에서. 어떤 이유로 numSplits에 값을 할당 할 수 있도록 temp를 파싱하려고 시도 할 때마다 텍스트 상자에 0을 입력하여 값을 변경 한 후에 temp가 올바른 형식이 아님을 나타내는 Error가 발생합니다. 누군가 그곳에서 무엇이 잘못되었는지 말해 줄 수 있습니까?

편집 : 내 GrowBranches 방법은

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); 
    } 

있습니다. 이것은 재귀 체인에서 Split Methods가 호출되는 곳입니다. GrowBranches는 SplitCreateOnce 및 SplitCreateAll 메서드에서도 호출되지만 구문 분석 오류와 관련된 위의 이유로 인해 후자는 작동하지 않습니다.내가 말하고 싶지만 추측이 있다면 이들 2 선

+0

전화 사이트를 보지 않고도 도움이되지 않습니다. 재귀 오른쪽 분할이 잘못되었을 수 있습니다. 어딘가에 잘못된 오프셋이있을 수 있습니다. – Jerdak

+0

호출 사이트입니까? 제발 좀 더 자세히 설명해주세요. 나는 절대적인 초보자이다. – user2296141

+0

사과. 재귀 적 메서드를 사용하면 코드에서 Vertisplit을 재귀 적으로 호출하는 부분을 확인하는 것이 도움이됩니다. – Jerdak

답변

0

이었다

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

누구의 노드 xCoord = 256 살펴보면, 폭 = 256, splitX는 것 386 (xCoord + 2분의 256) 하지만 그것은 자식 노드의 너비가 아니며 너비는 256/2입니다. 위 코드를 사용하면 xCoord 386, 너비 386의 자식이 생깁니다.

텍스트 오류에 대한 질문 중 두 번째 부분은 Unity 텍스트 상자를 사용하는 경우 기존 값을 지울 때 입력을 시작하면 Convert.ToInt32에 빈 문자열이 전달됩니다. Try/Catch을 사용하고 오류를 무시하십시오.

+0

또 다른 것. 이 프로그램은 시각화를 목적으로합니다. 위의 그림에서와 같이 너비는 1이며, Split이있는 곳을 표시하는 선을 그리는 데 사용되는 DrawTexture 호출입니다. – user2296141

+0

사실, 저는 종이에 집에서 수작업으로 수작업을했습니다. 대답은 다음과 같이 나타납니다 : 노드 5 splitX = 448 노드 6 splitX = 576 이것은 코드가 불가능한 일을한다는 것을 의미합니다 ... – user2296141