Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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)]);
        }
Esempio n. 3
0
        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;
            }
        }