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); }
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; } }
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); }