public ISpatialIndexMember GetResource(SpatialObjectKey resourceName) { if (IsLeafNode && SpatialIndexMembers[resourceName] != null) { return(SpatialIndexMembers[resourceName].First()); } throw new ItemNotFound("Item not found."); }
private ISpatialIndexMember SearchTree(Point searcherPoint, SpatialObjectKey itemType) { List <SpatialTreeNode> startNodeList = new List <SpatialTreeNode> { _topNode }; int level = _topNode.Level; int maxLevel = _topNode.MaxLevel; while (level < maxLevel) { int currentMinDistance = Int32.MaxValue; int currentMaxDistance = Int32.MaxValue; List <SpatialTreeNode> searchList = new List <SpatialTreeNode>(); foreach (SpatialTreeNode startSpatialTreeNode in startNodeList) { foreach (SpatialTreeNode spatialTreeNode in startSpatialTreeNode.Children) { if (spatialTreeNode.ResourceCount.ContainsKey(itemType)) { if (spatialTreeNode.ResourceCount[itemType] > 0) { int minDistance; int maxDistance; FindMinMaxDistance(searcherPoint, spatialTreeNode, out minDistance, out maxDistance); if (minDistance <= currentMinDistance && maxDistance <= currentMaxDistance) { currentMinDistance = minDistance; currentMaxDistance = maxDistance; } searchList.Add(spatialTreeNode); } } } } if (searchList.Count == 0) { throw new ItemNotFound("Item does not exist."); } startNodeList.Clear(); foreach (SpatialTreeNode spatialTreeNode in searchList) { int minDistance; int maxDistance; FindMinMaxDistance(searcherPoint, spatialTreeNode, out minDistance, out maxDistance); if ((minDistance >= currentMinDistance && minDistance <= currentMaxDistance) || (maxDistance >= currentMinDistance && maxDistance <= currentMaxDistance) || (minDistance < currentMinDistance && maxDistance > currentMaxDistance)) { startNodeList.Add(spatialTreeNode); } } level++; } // Now we have startNodeList filled with all the relevant leaf nodes containing the required item, so pick one and grab the item from it. // Atm it just picks the first in the list, needs to be improved. return(startNodeList.First().GetResource(itemType)); }
public void RemoveSpatialMemeber(SpatialObjectKey resourceName, ISpatialIndexMember member) { if (IsLeafNode && SpatialIndexMembers[resourceName] != null) { if (SpatialIndexMembers[resourceName].Contains(member)) { SpatialIndexMembers[resourceName].Remove(member); ChangeResourceCount(resourceName, -1); } } }
public ISpatialIndexMember FindClosestObject(Point searcherPoint, SpatialObjectKey objectType) { if (_topNode.ResourceCount.ContainsKey(objectType)) { if (_topNode.ResourceCount[objectType] > 0) { return(SearchTree(searcherPoint, objectType)); } throw new ItemNotFound("No item available"); } throw new ItemNotFound("No item available"); }
public void AddSpatialMemeber(SpatialObjectKey resourceName, ISpatialIndexMember member) { if (IsLeafNode) { if (!SpatialIndexMembers.ContainsKey(resourceName)) { SpatialIndexMembers[resourceName] = new List <ISpatialIndexMember>(); } SpatialIndexMembers[resourceName].Add(member); ChangeResourceCount(resourceName, 1); } }
private void ChangeResourceCount(SpatialObjectKey resourceName, int difference) { if (!ResourceCount.ContainsKey(resourceName)) { ResourceCount.Add(resourceName, 0); } ResourceCount[resourceName] += difference; if (_parent != null) { _parent.ChangeResourceCount(resourceName, difference); } }
public void RemoveFromSection(ISpatialIndexMember objectToRemove, SpatialObjectKey spatialObjectType) { SpatialTreeNode leafNodeToRemoveFrom = PositionToLeafNode(objectToRemove.SpatialIndexPosition); leafNodeToRemoveFrom.RemoveSpatialMemeber(spatialObjectType, objectToRemove); }
public void AddToSection(ISpatialIndexMember objectToAdd, SpatialObjectKey spatialObjectType) { SpatialTreeNode leafNodeToAdd = PositionToLeafNode(objectToAdd.SpatialIndexPosition); leafNodeToAdd.AddSpatialMemeber(spatialObjectType, objectToAdd); }
public void CheckChangeSection(Point newPosition, ISpatialIndexMember objectToMove, SpatialObjectKey spatialObjectType) { SpatialTreeNode leafNodeToRemoveFrom = PositionToLeafNode(objectToMove.SpatialIndexPosition); SpatialTreeNode leafNodeToAdd = PositionToLeafNode(newPosition); if (leafNodeToRemoveFrom != leafNodeToAdd) { RemoveFromSection(objectToMove, spatialObjectType); leafNodeToAdd.AddSpatialMemeber(spatialObjectType, objectToMove); } }