/// <summary> /// Help method for checking if placed object overlaps. /// </summary> public bool DoesPlacedObjectsOverlap() { foreach (var container in containers) { foreach (var object1 in container.PlacedObjects) { foreach (var object2 in container.PlacedObjects) { if (object1 != object2) { PlacedObject2D placedObject1 = object1 as PlacedObject2D; PlacedObject2D placedObject2 = object2 as PlacedObject2D; if (placedObject1.Position.X < placedObject2.Position.X + placedObject2.Width && placedObject1.Position.X + placedObject1.Width > placedObject2.Position.X && placedObject1.Position.Y > placedObject2.Position.Y + placedObject2.Height && placedObject1.Position.Y + placedObject1.Height < placedObject2.Position.Y) { return(true); } } } } } return(false); }
public IPlacedObject PlaceObject(Object2D objectToPlace, Position2D position) { PlacedObject2D newObject = new PlacedObject2D(position, objectToPlace.Width, objectToPlace.Height); PlacedObjects.Add(newObject); return(newObject); }
public void MakeSkylineUnavailable(PlacedObject2D theObject) { foreach (var availableSkyline in AvailableSkylines.ToList()) { if (availableSkyline.Y <= theObject.Y) { // Object partially cover skyline below - resize it (left) if (availableSkyline.X < theObject.X && availableSkyline.X2 <= theObject.X2 && availableSkyline.X2 > theObject.X) { availableSkyline.Resize(theObject.X2 - availableSkyline.X2); continue; } // Object completely cover skyline below - remove it if (availableSkyline.X >= theObject.X && availableSkyline.X2 <= theObject.X2) { AvailableSkylines.Remove(availableSkyline); continue; } // Object partially cover skyline below - resize it (right), and move beginning to right if (availableSkyline.X >= theObject.X && availableSkyline.X < theObject.X2 && availableSkyline.X2 > theObject.X2) { availableSkyline.Resize(availableSkyline.X2 - theObject.X2); availableSkyline.Move(theObject.X2); continue; } // Object partially cover skyline below from both size -> resize left, resize and move right if (availableSkyline.X < theObject.X && availableSkyline.X2 > theObject.X2) { var leftSkyline = new Line(availableSkyline.X, theObject.X - availableSkyline.X, availableSkyline.Y); AvailableSkylines.Add(leftSkyline); var rightSkyline = availableSkyline; rightSkyline.Resize(rightSkyline.X2 - theObject.X2); rightSkyline.Move(theObject.X2); } } } }
public override void SplitSubcontainer(GuillotineCutSubcontainer2D subcontainer, PlacedObject2D placedObject) { if (subcontainer.Height > subcontainer.Width) { SplitSubcontainerVertically(subcontainer, placedObject); } else { SplitSubcontainerHorizontally(subcontainer, placedObject); } }
public virtual void PlaceObject(Object2D theObject, Position2D position) { var placedObject = new PlacedObject2D(position, theObject); PlacedObjects.Add(placedObject); }
private void CreateSkylineAtopObject(PlacedObject2D lastPlacedObject) { var newSkyline = new Line(lastPlacedObject.X, lastPlacedObject.Width, lastPlacedObject.Y2); AvailableSkylines.Add(newSkyline); }
protected void SplitSubcontainerHorizontally(GuillotineCutSubcontainer2D subcontainer, PlacedObject2D placedObject) { var topSubcontainerPosition = new Position2D(subcontainer.X, placedObject.Y2); var topSubcontainerSize = new Rectangle(subcontainer.Width, subcontainer.Height - placedObject.Height); var topSubcontainer = new GuillotineCutSubcontainer2D(topSubcontainerPosition, topSubcontainerSize.Width, topSubcontainerSize.Height); var rightSubcontainerPosition = new Position2D(placedObject.X2, subcontainer.Y); var rightSubcontainerSize = new Rectangle(subcontainer.Width - placedObject.Width, placedObject.Height); var rightSubcontainer = new GuillotineCutSubcontainer2D(rightSubcontainerPosition, rightSubcontainerSize.Width, rightSubcontainerSize.Height); // No need to add one dimensional container if (topSubcontainer.Width != 0 && topSubcontainer.Height != 0) { Subcontainers.Add(topSubcontainer); } if (rightSubcontainer.Width != 0 && rightSubcontainer.Height != 0) { Subcontainers.Add(rightSubcontainer); } Subcontainers.Remove(subcontainer); }
public abstract void SplitSubcontainer(GuillotineCutSubcontainer2D subcontainer, PlacedObject2D placedObject);
public override void SplitSubcontainer(GuillotineCutSubcontainer2D subcontainer, PlacedObject2D placedObject) { var leftoverHeight = subcontainer.Height - placedObject.Height; var leftoverWidth = subcontainer.Width - placedObject.Width; if (leftoverHeight > leftoverWidth) { SplitSubcontainerVertically(subcontainer, placedObject); } else { SplitSubcontainerHorizontally(subcontainer, placedObject); } }
public override void SplitSubcontainer(GuillotineCutSubcontainer2D subcontainer, PlacedObject2D placedObject) { var availableAreaAboveObject = (subcontainer.Height - placedObject.Height) * placedObject.Width; var availableAreaOnTheRightOfObject = placedObject.Height * (subcontainer.Width - placedObject.Width); if (availableAreaAboveObject > availableAreaOnTheRightOfObject) { SplitSubcontainerVertically(subcontainer, placedObject); } else { SplitSubcontainerHorizontally(subcontainer, placedObject); } }