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