示例#1
0
        private void LineSheetAction(TNode node, SheetActionType actionType)
        {
            var blockViewLevel = NextTileLevel;

            var line = node.Rectangle;
            var rect = new ScreenRectangle(line, blockViewLevel).BlockView;

            var deltaX = (rect.Left <= rect.Right) ? 1 : -1;
            var deltaY = (rect.Top <= rect.Bottom) ? 1 : -1;

            //line search in daughter sheet
            for (var x = rect.Left; (deltaX == 1 && x <= rect.Right) || (deltaX == -1 && x >= rect.Right); x += deltaX)
            {
                for (var y = rect.Top; (deltaY == 1 && y <= rect.Bottom) || (deltaY == -1 && y >= rect.Bottom); y += deltaY)
                {
                    var block    = new TileBlock(x, y, blockViewLevel);
                    var TileRect = (ScreenRectangle)block;

                    if (TileRect.LineContains(line) != IntersectResult.None)
                    {
                        lock (this)
                        {
                            var sheet = Sheets[block];

                            sheet.SheetAction(node, actionType);

                            PostSheetAction(block, sheet, actionType);
                        }
                    }
                }
            }
        }
示例#2
0
        private void RectangleSheetAction(TNode node, SheetActionType actionType)
        {
            var blockViewLevel = NextTileLevel;

            var rect = new ScreenRectangle(node.Rectangle, blockViewLevel).BlockView;

            var deltaX = (rect.Left <= rect.Right) ? 1 : -1;
            var deltaY = (rect.Top <= rect.Bottom) ? 1 : -1;

            //rectangle search in daughter sheet
            for (var x = rect.Left; (deltaX == 1 && x <= rect.Right) || (deltaX == -1 && x >= rect.Right); x += deltaX)
            {
                for (var y = rect.Top; (deltaY == 1 && y <= rect.Bottom) || (deltaY == -1 && y >= rect.Bottom); y += deltaY)
                {
                    var block = new TileBlock(x, y, blockViewLevel);
                    lock (this)
                    {
                        var sheet = Sheets[block];

                        sheet.SheetAction(node, actionType);

                        PostSheetAction(block, sheet, actionType);
                    }
                }
            }
        }
示例#3
0
        private void PoligonSheetAction(TNode node, SheetActionType actionType)
        {
            var blockViewLevel = NextGoogleLevel;

            var poligon = node.Poligon;
            var rect    = new GoogleRectangle(poligon, blockViewLevel).BlockView;

            var deltaX = (rect.Left <= rect.Right) ? 1 : -1;
            var deltaY = (rect.Top <= rect.Bottom) ? 1 : -1;

            //poligon search in daughter sheet
            for (var x = rect.Left; (deltaX == 1 && x <= rect.Right) || (deltaX == -1 && x >= rect.Right); x += deltaX)
            {
                for (var y = rect.Top; (deltaY == 1 && y <= rect.Bottom) || (deltaY == -1 && y >= rect.Bottom); y += deltaY)
                {
                    var block      = new GoogleBlock(x, y, blockViewLevel);
                    var googleRect = (GoogleRectangle)block;

                    if (googleRect.PoligonContains(poligon) != InterseptResult.None)
                    {
                        lock (this)
                        {
                            var sheet = Sheets[block];

                            sheet.SheetAction(node, actionType);

                            PostSheetAction(block, sheet, actionType);
                        }
                    }
                }
            }
        }
示例#4
0
        private void PointSheetAction(TNode node, SheetActionType actionType)
        {
            var block = node.Coordinate.GetTileBlock(NextTileLevel);

            lock (this)
            {
                //point search in daughter sheet
                var sheet = Sheets[block];

                sheet.SheetAction(node, actionType);

                PostSheetAction(block, sheet, actionType);
            }
        }
示例#5
0
 private void PostSheetAction(TileBlock block, SpatialSheet <TNode> sheet, SheetActionType actionType)
 {
     switch (actionType)
     {
     case SheetActionType.Delete:
     {
         //delete sheet from index without elements
         if (sheet.IsEmpty)
         {
             Sheets.Remove(block);
         }
     } break;
     }
 }
示例#6
0
        internal void SheetAction(TNode node, SheetActionType actionType)
        {
            //Insert node to spatial index or remove node from spatial index
            if (!IsBottomSheet)
            {
                switch (node.NodeType)
                {
                case SpatialTreeNodeTypes.Point:
                    PointSheetAction(node, actionType);
                    break;

                case SpatialTreeNodeTypes.Line:
                    LineSheetAction(node, actionType);
                    break;

                case SpatialTreeNodeTypes.Rectangle:
                    RectangleSheetAction(node, actionType);
                    break;

                case SpatialTreeNodeTypes.Poligon:
                    PoligonSheetAction(node, actionType);
                    break;
                }
            }
            else
            {
                //Just do it on bottom level
                lock (this)
                {
                    switch (actionType)
                    {
                    case SheetActionType.Insert:
                        Content.Add(node);
                        break;

                    case SheetActionType.Delete:
                        Content.Remove(node);
                        break;
                    }
                }
            }
        }