예제 #1
0
        // 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);
        }
예제 #2
0
        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);
                }
            }
        }
예제 #3
0
        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
                    });
                }
            }
        }
예제 #4
0
        /// <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);
        }
예제 #5
0
        /// <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);
                }
            }
        }
예제 #6
0
 /// <summary>
 /// Get all viewfinders attached to v
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public List <ViewFinder> GetViewFinders(ViewZoom v)
 {
     return(parentViewfinders[v]);
 }
예제 #7
0
    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);
    }