private void renderMap() { //calculating viewport PointF centerTile = TileCoordinatesConverter.GetTileIndex(Zoom, CenterCoord); SizeF viewportSizeInTiles = new SizeF((float)Size.Width / (float)tileManager.TileSize.Width, (float)Size.Height / (float)tileManager.TileSize.Height); topLeftTile = new PointF(centerTile.X - viewportSizeInTiles.Width / 2.0f, centerTile.Y - viewportSizeInTiles.Height / 2.0f); bottomRightTile = new PointF(centerTile.X + viewportSizeInTiles.Width / 2.0f, centerTile.Y + viewportSizeInTiles.Height / 2.0f); //generate bitmap with tiles bitmap = new Bitmap(Size.Width, Size.Height); Graphics g = Graphics.FromImage(bitmap); for (int x = roundDownCoordinates(topLeftTile).X; x <= roundDownCoordinates(bottomRightTile).X; x++) { for (int y = roundDownCoordinates(topLeftTile).Y; y <= roundDownCoordinates(bottomRightTile).Y; y++) { Tile tile = tileManager.GetTile(zoom, x, y); if (tile != null) { g.DrawImageUnscaled(tile.Picture, getLocationForTileIndex(tile.X, tile.Y)); } } } //render overlay items foreach (OverlayItem item in overlayItems) { if (item.Icon != null) { ImageAttributes attr = new ImageAttributes(); attr.SetColorKey(item.Transparent, item.Transparent); Point loc = getLocationForCoordinates(item.Coord); loc.X -= item.Offset.X; loc.Y -= item.Offset.Y; Rectangle destRect = new Rectangle(loc, item.Icon.Size); g.DrawImage(item.Icon, destRect, 0, 0, item.Icon.Size.Width, item.Icon.Size.Height, GraphicsUnit.Pixel, attr); } } //render polygons foreach (PointF[] pointArray in polygonItems) { List <Point> locArray = new List <Point>(); foreach (PointF p in pointArray) { locArray.Add(getLocationForCoordinates(p)); } g.DrawPolygon(polygonPen, locArray.ToArray()); } g.Dispose(); this.Invalidate(); displayedAreaChanged(TopLeftDisplay, BottomRightDisplay, Zoom); }
private Point getLocationForCoordinates(PointF coord) { PointF tileIndex = TileCoordinatesConverter.GetTileIndex(Zoom, coord); return(getLocationForTileIndex(tileIndex.X, tileIndex.Y)); }