public Vector2 GetPosition(ProjectedPosition pos) { pos.X -= _renderGrid.OffsetX; pos.Y -= _renderGrid.OffsetY; float x = (float)(pos.X + pos.LocalX) * UNITS_PER_TILE + _position.x; float y = -((float)(pos.Y + pos.LocalY) * UNITS_PER_TILE) + _position.y; return(new Vector2(x, y)); }
/// <summary> /// Inverse mapping equation to get geographical coordinates from Cartesian coordinates /// </summary> /// <param name="proj">Cartesian coordinates</param> /// <returns>Geographical Coordinates</returns> public static Vector2 ProjectionToGeographic(ProjectedPosition proj) { double tilesPerEdge = TilesPerEdge(proj.ZoomLevel); //Mercator Projection: double longitude = (proj.X * (360 / tilesPerEdge)) - 180; double latitude = Mathf.Rad2Deg * (Math.Atan(Math.Sinh((1 - proj.Y * (2 / tilesPerEdge)) * Math.PI))); return(new Vector2((float)longitude, (float)latitude)); }
private void Initialize() { var dim = 2 * MapRadius + 1; InitCells(dim, dim); Width = dim * UNITS_PER_TILE; Height = dim * UNITS_PER_TILE; _spriteDictionary = new LRUSpriteDictionary((dim + 1) * (dim + 1)); _renderGrid = new RenderGrid(_cells.ToArray(), dim, dim); _loadedPosition = new ProjectedPosition(MapRadius, MapRadius, ZoomLevel, 0, 0); _position = new Vector3(); }
private void LoadNewTiles() { if (Equals(CurrentPosition, default(ProjectedPosition))) { return; } _renderGrid.Shift(_loadedPosition.X - CurrentPosition.X, _loadedPosition.Y - CurrentPosition.Y); _loadedPosition = CurrentPosition; for (int i = _loadedPosition.Y - MapRadius; i <= _loadedPosition.Y + MapRadius; i++) { for (int j = _loadedPosition.X - MapRadius; j <= _loadedPosition.X + MapRadius; j++) { if (_renderGrid[j, i] == null) { _renderGrid[j, i] = SpawnTile(j, i); } } } }
public static ProjectedPosition Lerp(ProjectedPosition from, ProjectedPosition to, float t) { Vector2 lerped = Vector2.Lerp(from, to, t); return(new ProjectedPosition(lerped.x, lerped.y, from.ZoomLevel)); }