示例#1
0
        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;
                }
            }
        }
示例#2
0
        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;
                }
            }
        }