public IEnumerable<Tuple<Point2l, Point2l>> Trace(Point2l start, Point2l end) { var x0 = start.X / GridSize.Width; var y0 = start.Y / GridSize.Height; var x1 = end.X / GridSize.Width; var y1 = end.Y / GridSize.Height; var dir = new Vector2l(end.X - start.X, end.Y - start.Y); var dx = Math.Sign(dir.X); var dy = Math.Sign(dir.Y); var deltax = (double)GridSize.Width / Math.Abs(dir.X); var deltay = (double)GridSize.Height / Math.Abs(dir.Y); var minx = x0 * GridSize.Width; var maxx = minx + GridSize.Width; var miny = y0 * GridSize.Height; var maxy = miny + GridSize.Height; var distx = ((dx >= 0) ? (maxx - start.X) : (start.X - minx)) / (double)GridSize.Width; var disty = ((dy >= 0) ? (maxy - start.Y) : (start.Y - miny)) / (double)GridSize.Height; var tx = distx * deltax; var ty = disty * deltay; var prev = new Point2l(x0, y0); var hit = start; while (true) { var grid = new Point2l(x0, y0); yield return Tuple.Create(grid, hit); prev = grid; if (tx <= ty) { if (x0 == x1) break; hit = new Point2l( start.X + (long)(dir.X * tx), start.Y + (long)(dir.Y * tx)); tx += deltax; x0 += dx; } else { if (y0 == y1) break; hit = new Point2l( start.X + (long)(dir.X * ty), start.Y + (long)(dir.Y * ty)); ty += deltay; y0 += dy; } } }
public IEnumerable <Tuple <Point2l, Point2l> > Trace(Point2l start, Point2l end) { var x0 = start.X / GridSize.Width; var y0 = start.Y / GridSize.Height; var x1 = end.X / GridSize.Width; var y1 = end.Y / GridSize.Height; var dir = new Vector2l(end.X - start.X, end.Y - start.Y); var dx = Math.Sign(dir.X); var dy = Math.Sign(dir.Y); var deltax = (double)GridSize.Width / Math.Abs(dir.X); var deltay = (double)GridSize.Height / Math.Abs(dir.Y); var minx = x0 * GridSize.Width; var maxx = minx + GridSize.Width; var miny = y0 * GridSize.Height; var maxy = miny + GridSize.Height; var distx = ((dx >= 0) ? (maxx - start.X) : (start.X - minx)) / (double)GridSize.Width; var disty = ((dy >= 0) ? (maxy - start.Y) : (start.Y - miny)) / (double)GridSize.Height; var tx = distx * deltax; var ty = disty * deltay; var prev = new Point2l(x0, y0); var hit = start; while (true) { var grid = new Point2l(x0, y0); yield return(Tuple.Create(grid, hit)); prev = grid; if (tx <= ty) { if (x0 == x1) { break; } hit = new Point2l( start.X + (long)(dir.X * tx), start.Y + (long)(dir.Y * tx)); tx += deltax; x0 += dx; } else { if (y0 == y1) { break; } hit = new Point2l( start.X + (long)(dir.X * ty), start.Y + (long)(dir.Y * ty)); ty += deltay; y0 += dy; } } }