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); }
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--; }
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)); } }
public override HolderBase GetCorrectHolder(int index) { MergeSortHolder holder = (MergeSortHolder)sortMain.HolderManager.GetHolder(index); return((holder != null) ? holder : mergeSort.GetExtraHolder(index)); }