귀하의 조언이 필요합니다.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 선
전화 사이트를 보지 않고도 도움이되지 않습니다. 재귀 오른쪽 분할이 잘못되었을 수 있습니다. 어딘가에 잘못된 오프셋이있을 수 있습니다. – Jerdak
호출 사이트입니까? 제발 좀 더 자세히 설명해주세요. 나는 절대적인 초보자이다. – user2296141
사과. 재귀 적 메서드를 사용하면 코드에서 Vertisplit을 재귀 적으로 호출하는 부분을 확인하는 것이 도움이됩니다. – Jerdak