/// <summary> /// Add a pixel to the quadtree. /// </summary> /// <param name="IPixel">A pixel of type T.</param> public void Add(IPixel <T> IPixel) { if (this.Contains(IPixel)) { #region Check subtrees... if (Subtree1 != null && Subtree1.Contains(IPixel)) { Subtree1.Add(IPixel); } else if (Subtree2 != null && Subtree2.Contains(IPixel)) { Subtree2.Add(IPixel); } else if (Subtree3 != null && Subtree3.Contains(IPixel)) { Subtree3.Add(IPixel); } else if (Subtree4 != null && Subtree4.Contains(IPixel)) { Subtree4.Add(IPixel); } #endregion #region ...or the embedded data. else if (EmbeddedPixels.Count < MaxNumberOfEmbeddedPixels) { EmbeddedPixels.Add(IPixel); } #endregion #region If necessary create subtrees... else { #region Create Subtrees if (Subtree1 == null) { Subtree1 = new Quadtree <T>(Left, Top, Math.Add(Left, Math.Div2(Width)), Math.Add(Top, Math.Div2(Height)), MaxNumberOfEmbeddedPixels); Subtree1.OnTreeSplit += OnTreeSplit; } if (Subtree2 == null) { Subtree2 = new Quadtree <T>(Math.Add(Left, Math.Div2(Width)), Top, Right, Math.Add(Top, Math.Div2(Height)), MaxNumberOfEmbeddedPixels); Subtree2.OnTreeSplit += OnTreeSplit; } if (Subtree3 == null) { Subtree3 = new Quadtree <T>(Left, Math.Add(Top, Math.Div2(Height)), Math.Add(Left, Math.Div2(Width)), Bottom, MaxNumberOfEmbeddedPixels); Subtree3.OnTreeSplit += OnTreeSplit; } if (Subtree4 == null) { Subtree4 = new Quadtree <T>(Math.Add(Left, Math.Div2(Width)), Math.Add(Top, Math.Div2(Height)), Right, Bottom, MaxNumberOfEmbeddedPixels); Subtree4.OnTreeSplit += OnTreeSplit; } #endregion #region Fire QuadtreeSplit event if (OnTreeSplit != null) { OnTreeSplit(this, IPixel); } #endregion #region Move all embedded data into the subtrees EmbeddedPixels.Add(IPixel); foreach (var _Pixel in EmbeddedPixels) { if (Subtree1.Contains(_Pixel)) { Subtree1.Add(_Pixel); } else if (Subtree2.Contains(_Pixel)) { Subtree2.Add(_Pixel); } else if (Subtree3.Contains(_Pixel)) { Subtree3.Add(_Pixel); } else if (Subtree4.Contains(_Pixel)) { Subtree4.Add(_Pixel); } else { throw new Exception("Mist!"); } } EmbeddedPixels.Clear(); #endregion } #endregion } else { throw new QT_OutOfBoundsException <T>(this, IPixel); } }
/// <summary> /// An exception thrown when the given pixel is /// located outside of the quadtree bounds! /// </summary> /// <param name="Quadtree">The quadtree causing this exception.</param> /// <param name="Pixel">The pixel causing this exception.</param> /// <param name="Message">The message that describes the error.</param> /// <param name="InnerException">The exception that is the cause of the current exception.</param> public QT_OutOfBoundsException(Quadtree <T> Quadtree, IPixel <T> Pixel, String Message = null, Exception InnerException = null) : base(Quadtree, Pixel, "The given pixel is located outside of the quadtree bounds!" + Message, InnerException) { }
/// <summary> /// A general quadtree exception occurred! /// </summary> /// <param name="Quadtree">The quadtree causing this exception.</param> /// <param name="Pixel">An optional pixel causing this exception.</param> /// <param name="Message">The message that describes the error.</param> /// <param name="InnerException">The exception that is the cause of the current exception.</param> public QuadtreeException(Quadtree <T> Quadtree, IPixel <T> Pixel = null, String Message = null, Exception InnerException = null) : base(Message, InnerException) { this.Quadtree = Quadtree; this.Pixel = Pixel; }
/// <summary> /// An exception thrown when at least one dimension /// of the quadtree is zero. /// </summary> /// <param name="Quadtree">The quadtree causing this exception.</param> /// <param name="Message">The message that describes the error.</param> /// <param name="InnerException">The exception that is the cause of the current exception.</param> public QT_ZeroDimensionException(Quadtree <T> Quadtree, String Message = null, Exception InnerException = null) : base(Quadtree, Message: "The given quadtree has at least one zero dimension!" + Message, InnerException: InnerException) { }