public static IEnumerable<Pair<Point, Point>> WallsUnderRay(Point a, Point b, Model m) { var tiles = TilesUnderRay(a, b); var prev = a.ToSquare(); foreach (var t in tiles) { var i = MakeDirMask(Math.Sign(t.X - prev.X), Math.Sign(t.Y - prev.Y)); var mask = m.Cache.Value.GetWallMask(prev.X, prev.Y); if (i != 0 && mask != null) if ((mask.Value & i) != ((mask.Value >> 2) & i)) yield return new Pair<Point, Point>(t, prev); prev = t; } }
public static IEnumerable<Point> TilesUnderRay(Point a, Point b) { if (a == b) { yield return a; yield break; } var dist = Math.Sqrt(a.DistanceSqTo(b)); var frac = 1.0f / (float)dist; var p = a.ToSquare(); yield return p; for (var f = 0.0f; f <= 1.0f; f += frac) { var q = Lerp(f, a, b).ToSquare(); if (p != q) yield return p = q; } }