본문 바로가기

카테고리 없음

3D 전개도 앱 개발기 - 3(Node Tree)

코드가 점점 많아지고 기억력은 떨어지고 주석은 잘 남기지 않다보니 일일 코딩관련 활동의 50% 정도를 내가 이전에 짰던 코드를 분석하는데 쓰고 있다. 주석 잘 적어놔야지 다짐하고 다짐해도 막상 적으려다보면 귀찮고 귀찮고... 적어서 정리하자. 그래야 기억하는데 도움이 되긴 할거다. 물론 나중에 또 기억 안나겠지만...ㅡㅡ;;;

 


지난 글에서 잠깐 다뤘지만, Test Case를 최대한 줄이는 방법은 Node Tree를 이용하는 거라고 생각했다.

Node에 대해서 정확하게 알지는 못한다. 이진트리가 있고 뭐 다른 트리가 있고... 

Node 자료구조는 처음 다뤄보는 것이기 때문에, 구글링을 해보았는데 내가 원하는 구조는 이진트리는 아니었다.

 

밑면을 제외한 각기둥 형태의 정n각형의 각 면에서 생성될 수 있는 모서리의 수(가능성의 수)는 다음과 같은 배열로 나타낼 수 있다.

 

n, 4, 4, 4, .... (4의 수는 n-2개이며, 이 배열의 수는 n-1개이다.)

 

그리고 전개도를 접는 행위는 이 n-1개의 각 면에서 모든 모서리의 수를 택하는 것이라 할 수 있으며, 이를 그림으로 나타내면 다음과 같다.

 

 

위의 Node Tree를 점화식으로 나타낼 수 있는데, 

Root Node의 레벨을 0이라 했을 때,

선택될 면의 번호는 x, y, z ...와 같은 미지수로 표현해보자.

그리고 각 항의 계수를 L(x)로 나타내면, 각 항의 계수는 위의 하단에 나온 식으로 정리할 수 있다.

 

이를 코드로 나타내보자.

 

일단, 계수 구하는 코드

public void generateRecurrenceRelation(){ 
        int numberOfterms = levelList.Count; 
        
        for(int i=0; i<numberOfterms; i++){ 
            int num = 1;
            for(int n=1; n<numberOfterms -i; n++){
                num = num * levelList[n];
            } 
            coefficientList.Add( num );
        } 
        Debug.Log("coefficientList: "+ string.Join(" ", coefficientList.ToArray()));
    }

 

다음으로 구한 계수를 바탕으로, node에서 값을 변경하고자 하는 node의 terminal node 번호를 점화식을 통해 구하는 코드

public int calculateTheNumberOfLeavesAboveTargetLevelNode(int targetLevel, Node baseNode){  
        int startingPoint = 0;
        List<int> unknownNumberList = new List<int>();    
        unknownNumberList.Add(baseNode.value);
        Node node = baseNode.parent;
        while(true){
            if(node.isRoot()){
                break;
            }else
            {
                unknownNumberList.Add(node.value);
                node = node.parent;
            }
        }
        unknownNumberList.Reverse(); 

        Debug.Log("unknownList: "+string.Join(" ", unknownNumberList.ToArray()));

        for(int i=0; i<targetLevel; i++){    
            startingPoint = startingPoint + coefficientList[i]* unknownNumberList[i]; 
        }
 
        return startingPoint;
    }

 

이를 통해 결론적으로 다음의 코드를 통해 원하는 Level의 해당 value값을 가진 node가 가진 모든 자식 node들의 값을 다음과 같이 변경할 수 있다.

//지우고자 하는 targetLevel 윗단계에서의 leaves count를 구한 뒤, 지우고자 하는 targetLevel과 과 value값을 통해 starting point를 구한다 
            startingPoint = calculateTheNumberOfLeavesAboveTargetLevelNode(targetLevel - 1, baseNode);
            startingPoint = startingPoint + (range * value);

            for(int i=0; i<range; i++){
                try{
                    Node node = leavesList.ElementAt(startingPoint + i);  
                    node.value = -1;
                    leavesList[startingPoint + i] = node;
                }catch(Exception e){
                    Debug.Log("removeChildren startingPoint: "+startingPoint + " range: "+range +" targetLevel: "+targetLevel +" value: "+value+ " uid: "+baseNode.uid);
                    // Debug.Log(e);
                } 
            }

 

 

그런데 솔까 이렇게 안해도 된다.

왜냐하면, 애초에 node를 생성할 때, 저 점화식으로 계산되는 고유 번호인 uid를 그냥 다 입력해놓았기 때문이다ㅡㅡ;

근데 이상하게 계속 저 try catch 코드에 에러가 나와서, 즉, startingPoint값이 잘못 계산되서 하루 종일 머리 아팠는데, 일단은 잘 해결된 듯 하다. 

 

근데  팔각기둥에서는 마지막 node쪽 값 변경할 때에는 왜 에러가 나는건지 모르겠다ㅠ