private static TilePair EnclosingTile(PixelPair pixel) { int tilex, tiley; TileSystem.PixelXYToTileXY(pixel.X, pixel.Y, out tilex, out tiley); return new TilePair(tilex, tiley); }
private static void ScaleTile(TilePair nw, TilePair se, int lod, int targetlod, out PixelPair pixnw, out PixelPair pixse) { se.X++; se.Y++; var diff = targetlod - lod; var factor = Math.Pow(2.0, diff); var targetnw = new TilePair((int)(nw.X * factor), (int)(nw.Y * factor)); var targetse = new TilePair((int)(se.X * factor), (int)(se.Y * factor)); if (targetnw.X == targetse.X) targetse.X++; if (targetnw.Y == targetse.Y) targetse.Y++; if (diff < 0) { if (targetse.X * (1.0 / factor) < se.X) targetse.X++; if (targetse.Y * (1.0 / factor) < se.Y) targetse.Y++; } pixnw = Pixel(targetnw); pixse = Pixel(targetse); }
public Point? GetScreenPosition(PixelPair pixel) { if (!this.IsScreenPositionInferred()) return null; return new Point(pixel.X - this.PixelNW.X, pixel.Y - this.PixelNW.Y); }
public TilePair GetEnclosingTile(PixelPair pixel) { return EnclosingTile(pixel); }
public Point? GetClippedScreenPosition(PixelPair pixel) { if (!this.IsScreenPositionInferred()) return null; int x; if (this.PixelNW.X > pixel.X) x = 0; else if (pixel.X > this.PixelSE.X) x = this.PixelSE.X - this.PixelNW.X; else x = pixel.X - this.PixelNW.X; int y; if (this.PixelNW.Y > pixel.Y) y = 0; else if (pixel.Y > this.PixelSE.Y) y = this.PixelSE.Y - this.PixelNW.Y; else y = pixel.Y - this.PixelNW.Y; return new Point(x, y); }
public static IEnumerable<TilePair> IterateTiles(PixelPair nw, PixelPair se, int lod) { var mapwidth = TileSystem.MapSize(lod); var boundx = se.X; if (nw.X > boundx) boundx += (int)mapwidth; for (int x = nw.X; x < boundx; x += TILESIZE) { for (int y = nw.Y; y < se.Y; y += TILESIZE) { var actualx = x % (int)mapwidth; yield return EnclosingTile(new PixelPair(actualx, y)); } } }
public static int CountTiles(PixelPair nw, PixelPair se, int lod) { var mapwidth = TileSystem.MapSize(lod); var boundx = se.X; if (nw.X > boundx) boundx += (int)mapwidth; int countx = (boundx - nw.X + TILESIZE - 1) / TILESIZE; int county = (se.Y - nw.Y + TILESIZE - 1) / TILESIZE; return countx * county; }