Ejemplo n.º 1
0
        public List <P> queryRange(Rectangle range)
        {//поиск точек, входящих в некоторое поле "range"
            List <P> answer = new List <P>();

            if (!boundary.intersectsRectangle(range))
            {
                return(answer);
            }
            if (northWest == null)
            {
                foreach (P p in points)
                {
                    if (p != null && range.containsPoint(p))
                    {
                        answer.Add(p);
                    }
                }
                return(answer);
            }
            answer.AddRange(northWest.queryRange(range));
            answer.AddRange(northEast.queryRange(range));
            answer.AddRange(southEast.queryRange(range));
            answer.AddRange(southWest.queryRange(range));
            return(answer);
        }
Ejemplo n.º 2
0
 private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
 {     //поиск точек, принадлижащих прямоугольнику
     if (is_serching)
     { //искать
         Rectangle search = new Rectangle(Cursor.Position.X - 150, Cursor.Position.Y - 150, 300, 300);
         g.Clear(Color.White);
         if (serach_algo)
         {//Qtree algorythm
             List <P> a = q.queryRange(search);
             foreach (P p in a)
             {
                 g.FillEllipse(Brushes.Red, p.X - 5, p.Y - 5, 10, 10);
             }
         }
         else
         {//brute force algorythm
             for (int i = 0; i < n; i++)
             {
                 if (search.containsPoint(pOiNtS[i]))
                 {
                     g.FillEllipse(Brushes.Red, pOiNtS[i].X - 5, pOiNtS[i].Y - 5, 10, 10);
                 }
             }
         }
         g.DrawRectangle(Pens.Red, search.x, search.y, search.w, search.h);
         pictureBox1.Image = b;
     }
 }
Ejemplo n.º 3
0
        public bool insert(P pnt)
        {
            if (!boundary.containsPoint(pnt))
            {
                return(false);
            }

            if (points.Count < num_of_points)
            {
                gr.FillEllipse(Brushes.Red, pnt.X - 5, pnt.Y - 5, 10, 10);
                points.Add(pnt);
                return(true);
            }

            if (northWest == null)
            {
                subdivide();//передаем точки в дочерние квадранты
            }
            for (int i = 0; i < points.Count; i++)
            {
                if (points[i] != null)
                {
                    if (!northWest.insert(points[i]))
                    {
                        if (!northEast.insert(points[i]))
                        {
                            if (!southWest.insert(points[i]))
                            {
                                if (!southEast.insert(points[i]))
                                {
                                }
                                else
                                {
                                    points[i] = null;
                                }
                            }
                            else
                            {
                                points[i] = null;
                            }
                        }
                        else
                        {
                            points[i] = null;
                        }
                    }
                    else
                    {
                        points[i] = null;
                    }
                }
            }
            //вставляем новую точку
            if (northWest.insert(pnt))
            {
                return(true);
            }
            if (northEast.insert(pnt))
            {
                return(true);
            }
            if (southWest.insert(pnt))
            {
                return(true);
            }
            if (southEast.insert(pnt))
            {
                return(true);
            }

            return(false);
        }