Example #1
0
    private MergeSortHolder CreateSplitHolder(int aboveHolder)
    {
        // Instantiate
        Vector3 pos = sortMain.HolderManager.GetHolder(aboveHolder).transform.position + splitHolderPos;

        GameObject splitHolder = Instantiate(holderPrefab, pos, Quaternion.identity);

        splitHolder.AddComponent <MergeSortHolder>();

        MergeSortHolder mergeSortHolder = splitHolder.GetComponent <MergeSortHolder>();

        //pivotHolder = pivotHolderClone.GetComponent<InsertionSortHolder>();

        // Mark as split holder
        mergeSortHolder.IsSplitHolder = true;

        // Set gameobject parent
        mergeSortHolder.SuperElement = GetComponentInParent <SortMain>();

        // Make the pivot holder position visible
        //PivotHolderVisible(true);
        return(mergeSortHolder);
    }
Example #2
0
    public override IEnumerator ExecuteDemoInstruction(InstructionBase instruction, bool increment)
    {
        // Gather information from instruction
        MergeSortInstruction       mergeSortInstruction       = null;
        MergeSortHolderInstruction mergeSortHolderInstruction = null;
        MergeSortElement           sortingElement             = null;
        MergeSortHolder            holder = null;

        if (instruction is MergeSortInstruction)
        {
            mergeSortInstruction = (MergeSortInstruction)instruction;
            sortingElement       = sortMain.ElementManager.GetSortingElement(mergeSortInstruction.SortingElementID).GetComponent <MergeSortElement>();
            holder = sortMain.HolderManager.GetHolder(mergeSortInstruction.HolderID).GetComponent <MergeSortHolder>();
        }
        else if (instruction is MergeSortHolderInstruction)
        {
            mergeSortHolderInstruction = (MergeSortHolderInstruction)instruction;
        }
        else if (instruction is InstructionLoop)
        {
            i = ((InstructionLoop)instruction).I;
            j = ((InstructionLoop)instruction).J;
            //k = ((InstructionLoop)instruction).K;
        }

        // Remove highlight from previous instruction
        pseudoCodeViewer.ChangeColorOfText(prevHighlightedLineOfCode, Util.BLACKBOARD_TEXT_COLOR);

        // Gather part of code to highlight
        int lineOfCode = 0;

        switch (instruction.Instruction)
        {
        case Util.FIRST_INSTRUCTION:
            lineOfCode = 0;

            if (increment)
            {
                lengthOfList = sortMain.SortSettings.NumberOfElements.ToString();
            }
            else
            {
                lengthOfList = "N";
            }
            break;

        case CREATE_HOLDER:
            lineOfCode = 0;

            if (increment)
            {
                CreateSplitHolder(mergeSortHolderInstruction.MergeHolderID);
            }
            else
            {
                Destroy(splitHolders[splitHolders.Count - 1].gameObject);
            }
            break;

        case MOVE_ELEMENT_TO_MERGE_HOLDER:
            lineOfCode = 0;
            if (increment)
            {
                sortingElement.transform.position = mergeSortManager.GetCorrectHolder(mergeSortInstruction.NextHolderID).transform.position + UtilSort.ABOVE_HOLDER_VR;
            }
            else
            {
                sortingElement.transform.position = sortMain.HolderManager.GetHolder(mergeSortInstruction.HolderID).transform.position + UtilSort.ABOVE_HOLDER_VR;
            }
            break;

        case MERGE_START:
            lineOfCode = 0;
            if (increment)
            {
            }
            else
            {
            }
            break;

        case UtilSort.COMPARE_START_INST:
            lineOfCode = 0;

            if (increment)
            {
                sortingElement.IsCompare = mergeSortInstruction.IsCompare;
                sortingElement.IsSorted  = mergeSortInstruction.IsSorted;
            }
            else
            {
                sortingElement.IsCompare = !mergeSortInstruction.IsCompare;
                if (mergeSortInstruction.HolderID == sortingElement.SortingElementID)     // works for worst case, none might be buggy
                {
                    sortingElement.IsSorted = mergeSortInstruction.IsSorted;
                }
                else
                {
                    sortingElement.IsSorted = !mergeSortInstruction.IsSorted;
                }
            }

            //PreparePseudocodeValue(sortingElement.Value, 2);
            UtilSort.IndicateElement(sortingElement.gameObject);
            break;

        case MERGE_ELEMENT:
            lineOfCode = 0;

            if (increment)
            {
                sortingElement.transform.position = sortMain.HolderManager.GetHolder(mergeSortInstruction.NextHolderID).transform.position + UtilSort.ABOVE_HOLDER_VR;
            }
            else
            {
                sortingElement.transform.position = sortMain.HolderManager.GetHolder(mergeSortInstruction.HolderID).transform.position + UtilSort.ABOVE_HOLDER_VR;
            }
            break;

        case MERGE_REMAINING_ELEMENT:
            lineOfCode = 0;

            if (increment)
            {
                sortingElement.transform.position = sortMain.HolderManager.GetHolder(mergeSortInstruction.NextHolderID).transform.position + UtilSort.ABOVE_HOLDER_VR;
            }
            else
            {
                sortingElement.transform.position = sortMain.HolderManager.GetHolder(mergeSortInstruction.HolderID).transform.position + UtilSort.ABOVE_HOLDER_VR;
            }
            break;

        case UtilSort.FINAL_INSTRUCTION:
            lineOfCode = 0;
            break;
        }
        prevHighlightedLineOfCode = lineOfCode;

        // Highlight part of code in pseudocode
        pseudoCodeViewer.SetCodeLine(CollectLine(lineOfCode), Util.HIGHLIGHT_STANDARD_COLOR);
        yield return(demoStepDuration);

        sortMain.WaitForSupportToComplete--;
    }
Example #3
0
    public override IEnumerator Demo(GameObject[] list)
    {
        Debug.Log("Demo: " + DebugList(list));
        yield return(demoStepDuration);


        // Check if list only has 1 element
        if (list.Length <= 1)
        {
            Debug.Log("Only 1 element left, return!");
            yield return(list);

            yield break;
            Debug.Log("Nani");
        }

        split++;

        if (splitHolders.Count < numbElements)
        {
            switch (split)
            {
            case 0:
                for (int i = 0; i < 2; i++)
                {
                    splitHolders.Add(CreateSplitHolder(holderIndex[numbElements][splitHolders.Count]));
                }
                //leftIndex = splitHolders.Count - 2;
                //rightIndex = splitHolders.Count - 1;
                break;

            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
            case 7:
                int hIndex = holderIndex[numbElements][splitHolders.Count];
                splitHolders.Add(CreateSplitHolder(hIndex));

                //if (split == 3)
                //    leftIndex = 2; // holderIndex[numberOfElements][2]; // 2
                //else if (split == 4 || split == 5)
                //    leftIndex = 1; // holderIndex[numberOfElements][1]; // 4
                //else
                //    leftIndex = 5; //holderIndex[numberOfElements][5]; // 6

                //rightIndex = hIndex;

                break;

            default: Debug.Log("No split set"); break;
            }
            leftIndex  = splitHolders.Count - 2;
            rightIndex = splitHolders.Count - 1;
        }

        // Otherwise split list into two lists
        int leftLength  = list.Length / 2;
        int rightLength = list.Length - leftLength;

        GameObject[] left  = new GameObject[leftLength];
        GameObject[] right = new GameObject[rightLength];

        for (int x = 0; x < list.Length; x++)
        {
            MergeSortElement element     = list[x].GetComponent <MergeSortElement>();
            MergeSortHolder  leftHolder  = splitHolders[leftIndex];
            MergeSortHolder  rightHolder = splitHolders[rightIndex];

            if (x < leftLength)
            {
                left[x] = list[x];

                // Move element left list
                element.transform.position = leftHolder.transform.position + UtilSort.ABOVE_HOLDER_VR + leftHolder.NextElementPos();
                leftHolder.HoldingNumberOfElements++;
            }
            else if (leftLength != 0 && rightLength != 0) // added
            {
                right[x - rightLength] = list[x];

                // Move element to right list
                element.transform.position = rightHolder.transform.position + UtilSort.ABOVE_HOLDER_VR + rightHolder.NextElementPos();
                rightHolder.HoldingNumberOfElements++;
            }

            yield return(demoStepDuration);
        }


        // Recursively do it until only 1 element remain in each list
        Debug.Log("Left: " + DebugList(left));
        //leftList = left;
        yield return(Demo(left));

        Debug.Log("Right: " + DebugList(right));
        //rightList = right;
        yield return(Demo(right));

        // Then merge the two lists
        Debug.Log("Start merge: " + DebugList(left) + " + " + DebugList(right));
        if (left.Length == 1 && right.Length == 1)
        {
            yield return(DemoMerge(left, right));
        }
        else
        {
            Debug.Log("Split: " + split + ", atMerge: " + atMerge + " of " + mergesAdded);
            foreach (KeyValuePair <int, GameObject[]> entry in allMerges)
            {
                Debug.Log("Entry: " + entry.Key + ": " + DebugList(entry.Value));
            }


            GameObject[] l = allMerges[atMerge];
            GameObject[] r = allMerges[atMerge + 1];
            atMerge += 2;
            yield return(DemoMerge(l, r));
        }
    }
Example #4
0
    public override HolderBase GetCorrectHolder(int index)
    {
        MergeSortHolder holder = (MergeSortHolder)sortMain.HolderManager.GetHolder(index);

        return((holder != null) ? holder : mergeSort.GetExtraHolder(index));
    }