/// <summary> /// Uaktualnij EmptyFields /// </summary> /// <param name="insertedRectangle">Wstawiany prostok�t</param> private void UpdateEmptyFields(Rectangle insertedRectangle) { IEnumerator<Rectangle> enumerator = emptyFields.GetEnumerator(); //sprawdzamy czy sa jakies puste, ktore zostaly calkowicie pokryte przez ostatnio dodany prostokat List<Rectangle> toDelete = new List<Rectangle>(); while (enumerator.MoveNext()) { Rectangle empty = enumerator.Current; if (empty != null) if (insertedRectangle.Covers(empty)) //emptyFields.Remove(empty); toDelete.Add(empty); } foreach (Rectangle r in toDelete) emptyFields.Remove(r); toDelete.Clear(); enumerator = emptyFields.GetEnumerator(); List<Rectangle> toAdd = new List<Rectangle>(); //sprawdzamy czy sa jakies czesciowo pokryte puste while (enumerator.MoveNext()) { Rectangle empty = enumerator.Current; if (empty != null) { Rectangle intersection = insertedRectangle.IntersectionRect(empty); if (intersection != null) { //emptyFields.Remove(empty); toDelete.Add(empty); List<Rectangle> subtr = empty.Subtract(insertedRectangle); //emptyFields.AddRange(subtr); // poprawione - Pawe� //toAdd.AddRange(subtr); addToList(toAdd, subtr); } } } foreach (Rectangle r in toDelete) emptyFields.Remove(r); toDelete.Clear(); foreach (Rectangle r in toAdd) // poprawione - Pawe� //emptyFields.AddRange(toAdd); addToList(emptyFields, toAdd); toAdd.Clear(); //sprawdzamy czy trzeba dodac jakies nowe EmptyFields AddNewEmptyFields(insertedRectangle); }
/// <summary> /// Wstawia prostok�t do kontenera /// </summary> /// <param name="r">Prostok�t do wstawienia</param> /// <param name="rLeftTop">Lewy g�rny wierzcho�ek prostok�ta</param> /// <param name="o">Orientacja prostok�ta</param> public void InsertRectangle(Rectangle r, Point rLeftTop, Rectangle.Orientation o) { Console.WriteLine("insert rect[(" + r.LeftTop.X + ", " + r.LeftTop.Y + "), (" + r.RightDown.X + ", " + r.RightDown.Y + ")]" + " -> (" + rLeftTop.X + ", " + rLeftTop.Y + ")"); InsertRectangleCheckParameters(r, rLeftTop); if (o.Equals(Rectangle.Orientation.Horizontal) && r.SideA < r.SideB) r.Rotate(); else if (o.Equals(Rectangle.Orientation.Vertical) && r.SideA > r.SideB) r.Rotate(); if (rectangles.Count == 0) FirstRectanglePreparation(r); else r.Move(rLeftTop); rectangles.Add(r); //jesli to byl pierwszy prostakat wszystko jest dobrze - nie trzeba tego robic if (rectangles.Count > 1) { // spr. czy po dodaniu wciaz prawidlowy prostokat if (isCorrectRectangle) { // doklejamy od dolu prostokata if (r.LeftTop.X == maxCorrectRect.LeftTop.X && r.RightDown.X == maxCorrectRect.RightDown.X && r.LeftTop.Y <= maxCorrectRect.RightDown.Y) UpdateMaxRectangles(r); // doklejamy z prawej strony prostokata else if (r.LeftTop.Y == maxCorrectRect.LeftTop.Y && r.RightDown.Y == maxCorrectRect.RightDown.Y && r.LeftTop.X <= maxCorrectRect.RightDown.X) UpdateMaxRectangles(r); // naklejamy na prostokat else if (maxCorrectRect.Covers(r)) r.SetParentRectangle(maxCorrectRect); // zaklejamy ca�y prostok�t - to r�wnie g�upi przypadek jak poprzedni, ale skoro kto� tak chce... else if (r.Covers(maxCorrectRect)) UpdateMaxRectangles(r); // calosc przestaje byc poprawnym prostokatem else { isCorrectRectangle = false; AddNewEmptyFields(r); UpdateMaxPossibleRectangle(r); } }// gdy calosc nie jest prawidlowym prostokatem else { //sprawdzenie czy dodanie prostokata nie pokrylo calkowicie jakichs emptyFields //spr. czy przeciecia dodanego z empty sa niepuste (jesli tak - usuwamy odpow. empty z listy i wstawiamy zamiast niego empty-dodany) //spr. czy nie zmienil sie maxPossibleRect UpdateEmptyFields(r); if (emptyFields.Count == 0) UpdateMaxCorrectAfterFillingAllEmpties(); UpdateMaxPossibleRectangle(r); } } }