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); } } } } }
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); } } } }
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); } } } } }
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); } }
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; } }
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; } } } }