Esempio n. 1
0
 public ISpatialIndexMember GetResource(SpatialObjectKey resourceName)
 {
     if (IsLeafNode && SpatialIndexMembers[resourceName] != null)
     {
         return(SpatialIndexMembers[resourceName].First());
     }
     throw new ItemNotFound("Item not found.");
 }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
 public void RemoveSpatialMemeber(SpatialObjectKey resourceName, ISpatialIndexMember member)
 {
     if (IsLeafNode && SpatialIndexMembers[resourceName] != null)
     {
         if (SpatialIndexMembers[resourceName].Contains(member))
         {
             SpatialIndexMembers[resourceName].Remove(member);
             ChangeResourceCount(resourceName, -1);
         }
     }
 }
Esempio n. 4
0
 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");
 }
Esempio n. 5
0
 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);
     }
 }
Esempio n. 6
0
 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);
     }
 }
Esempio n. 7
0
        public void RemoveFromSection(ISpatialIndexMember objectToRemove, SpatialObjectKey spatialObjectType)
        {
            SpatialTreeNode leafNodeToRemoveFrom = PositionToLeafNode(objectToRemove.SpatialIndexPosition);

            leafNodeToRemoveFrom.RemoveSpatialMemeber(spatialObjectType, objectToRemove);
        }
Esempio n. 8
0
        public void AddToSection(ISpatialIndexMember objectToAdd, SpatialObjectKey spatialObjectType)
        {
            SpatialTreeNode leafNodeToAdd = PositionToLeafNode(objectToAdd.SpatialIndexPosition);

            leafNodeToAdd.AddSpatialMemeber(spatialObjectType, objectToAdd);
        }
Esempio n. 9
0
        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);
            }
        }