Example #1
0
        /// <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);
            }
        }
Example #2
0
 /// <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)
 {
 }
Example #3
0
 /// <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;
 }
Example #4
0
 /// <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)
 {
 }