/// <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(); }
/// <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); }