コード例 #1
0
        /// <summary>
        /// not thread-safe
        /// </summary>
        /// <param name="sourceList"></param>
        /// <param name="target"></param>
        public void Combine(IList <RectanglePart> sourceList, RectanglePart target)
        {
            //先按比例从大到小的顺序优化搜索。
            _sourceList = sourceList.OrderByDescending
                              (i =>
                              Math.Max((double)i.Width / target.Width, (double)(i.Height) / target.Height)
                              ).ToList();

            _handlderList = new List <RectanglePart>();

            _target    = target;
            _hasResult = false;
            CombineCore();
        }
コード例 #2
0
        /// <summary>
        /// 检查一个矩形是否可以放置在另一个举行下侧或者右侧,这是一个构建二叉树的过程
        /// </summary>
        /// <param name="dockArranged"></param>
        /// <returns></returns>
        private bool CheckAndCombine(RectanglePart dockArranged, RectanglePart arrange)
        {
            //处理重复出现的节点,只要调用方正确,不应该出现这种情况。
            if (dockArranged == arrange)
            {
                return(false);
            }

            //处理根节点
            if (dockArranged == null)
            {
                arrange.X        = 0;
                arrange.Y        = 0;
                arrange.IsHandle = true;

                _handlderList.Add(arrange);

                PrintHandlderList();
                return(true);
            }

            //添加下面的节点
            if (dockArranged.BottomNode == null &&
                dockArranged.X + arrange.Width <= _target.Width &&
                dockArranged.Y + dockArranged.Height + arrange.Height <= _target.Height

                )
            {
                dockArranged.BottomNode = arrange;

                arrange.X        = dockArranged.X;
                arrange.Y        = dockArranged.Height + dockArranged.Y;
                arrange.IsHandle = true;

                _handlderList.Add(arrange);

                PrintHandlderList();

                return(true);
            }


            //添加右边节点

            if (dockArranged.RightNode == null &&
                dockArranged.X + dockArranged.Width + arrange.Width <= _target.Width &&
                dockArranged.Y + arrange.Height <= _target.Height
                )
            {
                dockArranged.RightNode = arrange;

                arrange.X        = dockArranged.Width + dockArranged.X;
                arrange.Y        = dockArranged.Y;
                arrange.IsHandle = true;

                _handlderList.Add(arrange);

                PrintHandlderList();

                return(true);
            }
            PrintHandlderList();
            return(false);
        }