public void Update(IQuadTreeMonitor <T> monitor, Bound previousRegion, Bound currentRegion) { // update the stored monitor for (int i = 0; i < _monitors.Length; ++i) { if (ReferenceEquals(_monitors[i].Monitor, monitor)) { _monitors[i].Region = currentRegion; break; } } // update the monitor for (int i = 0; i < _items.Length; ++i) { StoredItem item = _items[i]; bool containedPrevious = previousRegion.Contains(item.Position); bool containedCurrent = currentRegion.Contains(item.Position); // the monitor was previously interested but no longer is if (containedPrevious && containedCurrent == false) { monitor.OnExit(item.Item); } // the monitor was not previous interested but now is else if (containedPrevious == false && containedCurrent) { monitor.OnEnter(item.Item); } } }
public void Remove(IQuadTreeMonitor <T> monitor, Bound monitoredRegion) { // remove the stored monitor for (int i = 0; i < _monitors.Length; ++i) { if (ReferenceEquals(_monitors[i].Monitor, monitor)) { _monitors.Remove(i); break; } } // remove all stored items from the monitor for (int i = 0; i < _items.Length; ++i) { StoredItem item = _items[i]; if (monitoredRegion.Contains(item.Position)) { monitor.OnExit(item.Item); } } }