// UNUSED ///// <summary> ///// Get children of v sorted from left to right ///// </summary> ///// <param name="v"></param> ///// <returns></returns> //protected List<View> GetSortedLeftRightChildren(View v) //{ // //get all children // List<View> children = GetChildren(v); // //calculate and map children position form left to right // Dictionary<float, ViewZoom> childrenDistance = new Dictionary<float, ViewZoom>(); // foreach (ViewZoom child in children) // { // //Very far left point from the parent // Vector3 leftPoint = v.Position - new Vector3(100f, v.Position.y, v.Position.z); // //Vector from left to parent center // Vector3 leftToParentVector = v.Position - leftPoint; // //Vector from left to vf // Vector3 leftToVfVector = child.Position - leftPoint; // //Project // Vector3 projection = Vector3.Project(leftToVfVector, leftToParentVector); // //add distance // childrenDistance.Add(projection.magnitude, child); // } // //then short the distance // float[] distances = childrenDistance.Keys.ToArray(); // distances = InsertionSort.Sort(distances.ToArray()); // //List of sorted children // List<View> sortedChildren = new List<View>(); // for (int i = 0; i < distances.Length; i++) // { // sortedChildren.Add(childrenDistance[distances[i]]); // } // return sortedChildren; //} /// <summary> /// Get list of sorted viewfinders on v from left to right /// </summary> /// <param name="v"></param> /// <returns></returns> protected List <ViewFinder> GetSortedLeftRightViewfinders(ViewZoom v) { //get all viewfinders List <ViewFinder> children = parentViewfinders[v]; //first, calculate and map viewfinders position from left to right Dictionary <float, ViewFinder> viewFinderDistance = new Dictionary <float, ViewFinder>(); foreach (ViewFinder vf in children) { //Very far left point from the parent Vector3 leftPoint = v.Position - new Vector3(100f, v.Position.y, v.Position.z); //Vector from left to parent center Vector3 leftToParentVector = v.Position - leftPoint; //Vector from left to vf Vector3 leftToVfVector = vf.Position - leftPoint; //Project Vector3 projection = Vector3.Project(leftToVfVector, leftToParentVector); //add distance viewFinderDistance.Add(projection.magnitude, vf); } //then short the distance float[] distances = viewFinderDistance.Keys.ToArray(); distances = InsertionSort.Sort(distances.ToArray()); //List of sorted viewfinders List <ViewFinder> sortedViewfinders = new List <ViewFinder>(); for (int i = 0; i < distances.Length; i++) { sortedViewfinders.Add(viewFinderDistance[distances[i]]); } return(sortedViewfinders); }
public void RemoveView(ViewZoom v) { MultiViewLayout.ViewFinder vf = v.ViewFinder; ViewZoom parent = (ViewZoom)v.Parent; base.Remove(v); //Remove viewfinder from parent if (vf != null) { if (parentViewfinders.ContainsKey(parent)) { parentViewfinders[parent].Remove(vf); } } }
public void RegisterView(ViewZoom v) { base.Register(v); if (v.ViewFinder != null) { ViewFinder vf = v.ViewFinder; if (parentViewfinders.ContainsKey(vf.Parent)) { parentViewfinders[vf.Parent].Add(vf); } else { parentViewfinders.Add(vf.Parent, new List <ViewFinder>() { vf }); } } }
/// <summary> /// Check whether or not there is overlap in children of v /// </summary> /// <param name="v"></param> /// <returns></returns> public bool IsChildrenOverlap(ViewZoom v) { //if there is no children, if (!parentViewfinders.ContainsKey(v)) { return(false); } List <ViewFinder> viewFinders = parentViewfinders[v]; //if there is one child if (viewFinders.Count == 1) { return(false); } bool ret = false; //sort viewfinders List <ViewFinder> sortedViewfinder = GetSortedLeftRightViewfinders(v); //get children List <View> children = GetChildren(v); ///Loop viewfinder /// Viewfinder: 0 1 2 3 /// Child : 1 0 2 3 /// There is overlap if the index of the viewfinder is not the same as index of child foreach (ViewFinder vf in sortedViewfinder) { int idx = sortedViewfinder.IndexOf(vf); int childIdx = children.IndexOf(vf.Child); if (idx != childIdx) { ret = true; break; } } return(ret); }
/// <summary> /// Solve all overlaps /// </summary> /// <param name="v"></param> public void SolveChildrenOverlap(ViewZoom v) { //sort viewfinders List <ViewFinder> sortedViewfinder = GetSortedLeftRightViewfinders(v); ///Loop viewfinder /// Viewfinder: 0 1 2 /// Child : 2 1 0 /// There is overlap if the index of the viewfinder is not the same as index of child /// Swap /// Viewfinder: 0 1 2 /// Child : 0 1 2 /// Overlap, swap /// Viewfinder: 0 1 2 3 /// Child : 0 1 2 3 foreach (ViewFinder vf in sortedViewfinder) { //get children List <View> children = GetChildren(v); int idx = sortedViewfinder.IndexOf(vf); int childIdx = children.IndexOf(vf.Child); if (idx != childIdx) { //get swap anchor View swapChild = children[idx]; //conflict child View child = vf.Child; //swap children SwapView(swapChild, child); Debug.Log("Overlap " + idx + " and " + childIdx); } } }
/// <summary> /// Get all viewfinders attached to v /// </summary> /// <param name="v"></param> /// <returns></returns> public List <ViewFinder> GetViewFinders(ViewZoom v) { return(parentViewfinders[v]); }
void CrossBranchOverlapTest() { v0 = new ViewZoom(0); v1 = new ViewZoom(1); v2 = new ViewZoom(1); v3 = new ViewZoom(2); v4 = new ViewZoom(2); //is overlap return false //vF1 = new ViewFinder(v0, v1, 0.15f, 0.15f, new Vector3(0.5f, 0.25f,0)); //vF2 = new ViewFinder(v0, v2, 0.15f, 0.15f, new Vector3(0.75f, 0.25f,0)); //vF3 = new ViewFinder(v0, v3, 0.15f, 0.15f, new Vector3(1f, 0.25f,0)); //is overlap return true vF1 = new ViewFinder(v0, v1, 0.15f, 0.15f, new Vector3(1f, 0.25f, 0)); vF2 = new ViewFinder(v0, v2, 0.15f, 0.15f, new Vector3(0.75f, 0.25f, 0)); vF3 = new ViewFinder(v1, v3, 0.15f, 0.15f, new Vector3(0.6666666f, 0.5f, 0)); vF4 = new ViewFinder(v2, v4, 0.15f, 0.15f, new Vector3(1.55f, 0.5f, 0)); v1.ViewFinder = vF1; v2.ViewFinder = vF2; v3.ViewFinder = vF3; v4.ViewFinder = vF4; poly.Register(v0); poly.Register(v1); poly.Register(v2); poly.Register(v3); poly.Register(v4); poly.UpdateLayout(); GameObject v0g = new GameObject(); v0g.name = "V" + v0.Level; v0g.transform.position = v0.Position; v0g.transform.localScale = new Vector3(v0.Width, v0.Height, 1); GameObject v1g = GameObject.CreatePrimitive(PrimitiveType.Cube); v1g.name = "V1" + v1.Level; v1g.transform.position = v1.Position; v1g.transform.localScale = new Vector3(v1.Width, v1.Height, 1); GameObject v2g = GameObject.CreatePrimitive(PrimitiveType.Sphere); v2g.name = "V2" + v2.Level; v2g.transform.position = v2.Position; v2g.transform.localScale = new Vector3(v2.Width, v2.Height, 1); GameObject v3g = GameObject.CreatePrimitive(PrimitiveType.Cube); v3g.name = "V3" + v3.Level; v3g.transform.position = v3.Position; v3g.transform.localScale = new Vector3(v3.Width, v3.Height, 1); GameObject v4g = GameObject.CreatePrimitive(PrimitiveType.Sphere); v4g.name = "V4" + v4.Level; v4g.transform.position = v4.Position; v4g.transform.localScale = new Vector3(v4.Width, v4.Height, 1); GameObject vf1g = GameObject.CreatePrimitive(PrimitiveType.Cube); vf1g.name = "VF" + vF1.Parent.Level; vf1g.transform.position = vF1.Position; vf1g.transform.localScale = new Vector3(vF1.Width, vF1.Height, 1); GameObject vf2g = GameObject.CreatePrimitive(PrimitiveType.Sphere); vf2g.name = "VF" + vF2.Parent.Level; vf2g.transform.position = vF2.Position; vf2g.transform.localScale = new Vector3(vF2.Width, vF2.Height, 1); GameObject vf3g = GameObject.CreatePrimitive(PrimitiveType.Cube); vf3g.name = "VF" + vF3.Parent.Level; vf3g.transform.position = vF3.Position; vf3g.transform.localScale = new Vector3(vF3.Width, vF3.Height, 1); GameObject vf4g = GameObject.CreatePrimitive(PrimitiveType.Sphere); vf4g.name = "VF" + vF4.Parent.Level; vf4g.transform.position = vF4.Position; vf4g.transform.localScale = new Vector3(vF4.Width, vF4.Height, 1); //There is overlap Debug.Log(poly.IsChildrenOverlap(v0)); bool isSolve = true; //Solve overlap if (poly.IsChildrenOverlap(v0) && isSolve) { poly.SolveChildrenOverlap(v0); } if (poly.IsChildrenOverlap(v1) && isSolve) { poly.SolveChildrenOverlap(v1); } poly.UpdateLayout(); v0g.transform.position = v0.Position; v0g.transform.localScale = new Vector3(v0.Width, v0.Height, 1); v1g.transform.position = v1.Position; v1g.transform.localScale = new Vector3(v1.Width, v1.Height, 1); v2g.transform.position = v2.Position; v2g.transform.localScale = new Vector3(v2.Width, v2.Height, 1); v3g.transform.position = v3.Position; v3g.transform.localScale = new Vector3(v3.Width, v3.Height, 1); vf4g.transform.position = vF4.Position; vf4g.transform.localScale = new Vector3(vF4.Width, vF4.Height, 1); }