public Cell(Macro.Cell macro, MicroMap map) { Macro = macro; _map = map; BlockPositions = Rasterization.ConvexToBlocks(macro.Contains, macro.Bounds); Bounds = (Bounds2i)macro.Bounds; var vertices = new List <Vector2i>(BlockPositions); foreach (var blockPosition in BlockPositions) { if (!vertices.Contains(blockPosition + Vector2i.Forward)) { vertices.Add(blockPosition + Vector2i.Forward); } if (!vertices.Contains(blockPosition + Vector2i.Right)) { vertices.Add(blockPosition + Vector2i.Right); } if (!vertices.Contains(blockPosition + Vector2i.One)) { vertices.Add(blockPosition + Vector2i.One); } } VertexPositions = vertices.ToArray(); }
public Cell GetCell([NotNull] Macro.Cell cell) { if (cell == null) { throw new ArgumentNullException(nameof(cell)); } if (cell.Map != _macromap) { throw new ArgumentException(); } return(Cells[_macromap.Cells.IndexOf(cell)]); }
public static IEnumerable <Vector2i> Polygon(Macro.Cell cell) { var edges = new List <Vector2i>(); foreach (var edge in cell.Edges) { edges.AddRange(DDA(edge.Vertex1.Position, edge.Vertex2.Position, false)); } var bounds = (Bounds2i)cell.Bounds; Debug.Log(bounds); edges = edges.Where(e => bounds.Contains(e)).Distinct().ToList(); edges.Sort(); for (int i = 0; i < edges.Count;) { if (i == edges.Count - 1) { yield return(edges.Last()); yield break; } var z1 = edges[i].Z; var j = i; while (j < edges.Count - 1 && edges[j + 1].Z == z1) { j++; } for (var x = edges[i].X; x <= edges[j].X; x++) { yield return(new Vector2i(x, z1)); } i = j + 1; } }