private List <T> Elements(bool recursive) { List <T> objList = new List <T>(); if (recursive) { using (List <QuadTreeNode <T> > .Enumerator enumerator = this.m_ChildrenNodes.GetEnumerator()) { while (enumerator.MoveNext()) { QuadTreeNode <T> current = enumerator.Current; objList.AddRange((IEnumerable <T>)current.Elements(recursive)); } } } objList.AddRange((IEnumerable <T>) this.m_Elements); return(objList); }
public List <T> ContainedBy(Rect queryArea) { List <T> objList = new List <T>(); using (List <T> .Enumerator enumerator = this.m_Elements.GetEnumerator()) { while (enumerator.MoveNext()) { T current = enumerator.Current; if (RectUtils.Contains(current.boundingRect, queryArea)) { objList.Add(current); } else if (queryArea.Overlaps(current.boundingRect)) { objList.Add(current); } } } using (List <QuadTreeNode <T> > .Enumerator enumerator = this.m_ChildrenNodes.GetEnumerator()) { while (enumerator.MoveNext()) { QuadTreeNode <T> current = enumerator.Current; if (!current.IsEmpty) { if (RectUtils.Contains(current.BoundingRect, queryArea)) { objList.AddRange((IEnumerable <T>)current.ContainedBy(queryArea)); break; } if (RectUtils.Contains(queryArea, current.BoundingRect)) { objList.AddRange((IEnumerable <T>)current.Elements(true)); } else if (current.BoundingRect.Overlaps(queryArea)) { objList.AddRange((IEnumerable <T>)current.ContainedBy(queryArea)); } } } } return(objList); }