/// <summary> /// Pans the Grid Tiles the given amount (only supports one square for now) /// </summary> /// <param name="panAmountX"></param> /// <param name="panAmountY"></param> private void PanGrid(int panAmountX, int panAmountY) { PerfStopwatch ps = PerfStopwatch.StartNew("Pan Grid"); if (panAmountX == 0 && panAmountY == 0) { return; } //If positive move tiles from left edge to right edge int xTileIndexToFind = GetXTileEdge(panAmountX); int yTileIndexToFind = GetYTileEdge(panAmountY); List <MapTileVisual> tilesToMove = new List <MapTileVisual>(); if (panAmountX != 0) { tilesToMove.AddRange(Tiles.Where(t => t.TileX == xTileIndexToFind)); } if (panAmountY != 0) { tilesToMove.AddRange(Tiles.Where(t => t.TileY == yTileIndexToFind)); } OSMWorldScale scale = new OSMWorldScale(); double mapCenterNormalizedX = scale.NormalizeX(TileService.xTileOffset); double mapCenterNormalizedY = scale.NormalizeY(TileService.yTileOffset); double tileTranslateX = scale.GetTileXTranslateFix(mapCenterNormalizedX, mapZoom, TileSize); //TileSize * fracX; double tileTranslateY = scale.GetTileYTranslateFix(mapCenterNormalizedY, mapZoom, TileSize); //TileSize * fracY; foreach (MapTileVisual tile in tilesToMove) { if (tile.TileX == xTileIndexToFind) { tile.TileX += GridSize * panAmountX; } if (tile.TileY == yTileIndexToFind) { tile.TileY += GridSize * panAmountY; } TranslateTransform3D transform = tile.Transform as TranslateTransform3D; //Apply this as a transformation as well if (transform != null) { transform.OffsetX = ((tile.TileX * TileSize * -1) - TileSize / 2) - tileTranslateX; transform.OffsetY = ((tile.TileY * TileSize) - TileSize / 2) - tileTranslateY; } tile.UpdateDebugLabels(); //Send of a request to update the tile TileGenerator.LoadTileImageAsync(tile, tile.TileX, tile.TileY, MapZoomLevel); } currentTileX += panAmountX; currentTileY += panAmountY; ps.Stop(); }
public void InitGrid() { int midNum = (int)Math.Ceiling(GridSize / 2d); MapCenter = new Point3D(0d, 0d, 0d); Random ran = new Random(); currentTileX = 0; currentTileY = 0; OSMWorldScale scale = new OSMWorldScale(); double mapCenterNormalizedX = scale.NormalizeX(TileService.xTileOffset); double mapCenterNormalizedY = scale.NormalizeY(TileService.yTileOffset); double maxTiles = Math.Pow(2, mapZoom); double tileNumX = mapCenterNormalizedX * maxTiles; double tileNumY = mapCenterNormalizedY * maxTiles; //X and y are flipped double fracX = tileNumX - Math.Floor(tileNumX); double fracY = tileNumY - Math.Floor(tileNumY); double posFracX = fracX; double posFracY = fracY; if (posFracX <= 0.5) { posFracX += 1; } if (posFracY >= 0.5) { posFracY -= 1; } if (mapZoom == 15 || mapZoom == 12) { posFracY -= 1; } double tileTranslateX = scale.GetTileXTranslateFix(mapCenterNormalizedX, mapZoom, TileSize); //TileSize * fracX; double tileTranslateY = scale.GetTileYTranslateFix(mapCenterNormalizedY, mapZoom, TileSize); //TileSize * fracY; Debug.WriteLine($"TranslateFixes: {tileTranslateX} / {tileTranslateY} TileSize {TileSize}"); Debug.WriteLine($"TranslateFixesWOLessTHanFixes: {TileSize * fracX} / {TileSize * fracY}"); Debug.WriteLine($"TranslateFixesPositive: {posFracX} / {posFracY}"); //double fooTest2 = //double fooTest2 = scale.GetTileXTranslateFix(mapCenterNormalizedX, mapZoom, TileSize); BoundingBoxWireFrameVisual3D box = new BoundingBoxWireFrameVisual3D(); box.Color = Colors.Yellow; double bSize = 1 * TileSize / 32; box.Thickness = 1; box.BoundingBox = new Rect3D((tileTranslateX) - bSize / 2, tileTranslateY - bSize / 2, 0, bSize, bSize, bSize); this.Children.Add(box); BoundingBoxWireFrameVisual3D box2 = new BoundingBoxWireFrameVisual3D(); box2.Color = Colors.LimeGreen; double b2Size = 1 * TileSize / 32; box2.Thickness = 1; box2.BoundingBox = new Rect3D((posFracX * TileSize * -1) - b2Size / 2, (posFracY * TileSize) - b2Size / 2, 0, b2Size, b2Size, b2Size); this.Children.Add(box2); for (int x = 0; x < GridSize; x++) { for (int y = 0; y < GridSize; y++) { int gridPosX = ((x + 1) - midNum); int gridPosY = ((y + 1) - midNum); MapTileVisual tile = new MapTileVisual(); tile.Fill = new SolidColorBrush(Color.FromArgb(255, (byte)ran.Next(30, 255), (byte)ran.Next(32, 255), (byte)ran.Next(28, 255))); TranslateTransform3D position = new TranslateTransform3D(); position.OffsetX = (gridPosX * TileSize) - TileSize / 2; position.OffsetY = (gridPosY * TileSize) - TileSize / 2; if (TranslateOnZoom) { position.OffsetX -= tileTranslateX; position.OffsetY -= tileTranslateY; } tile.Transform = position; tile.Width = TileSize; tile.Length = TileSize; tile.TileX = gridPosX * -1; tile.TileY = gridPosY; tile.TileZoom = MapZoomLevel; this.Children.Add(tile); Tiles.Add(tile); if (TileGenerator != null) { //log.DebugFormat("Requesting Image for x/y/zoom {0} / {1} / {2}", tile.TileX, tile.TileY, mapZoom); TileGenerator.LoadTileImageAsync(tile, tile.TileX, tile.TileY, MapZoomLevel); } else { Aegir.Util.DebugUtil.LogWithLocation("Could not load image, TileGeneratorWas Null"); } tile.UpdateDebugLabels(); } } }