/// <summary>
            /// returns all edges with are within the specified range of the input edge (either with or without the center itself)
            /// </summary>
            /// ![green = input edge , blue = result](GetEdges_WithinDistance.png)
            public static List <Vector3Int> WithinDistanceOfEdge(Vector3Int centerEdge, int maxDistance, bool includeCenter)
            {
                //there might be smarter ways but this should work.
                HashSet <Vector3Int> edgesInRange = new HashSet <Vector3Int>();
                HashSet <Vector3Int> openEdges    = new HashSet <Vector3Int>();

                openEdges.Add(centerEdge);

                for (int i = 0; i <= maxDistance; i++)
                {
                    HashSet <Vector3Int> edgesWithDistanceI = new HashSet <Vector3Int>();
                    foreach (var openEdge in openEdges)
                    {
                        edgesInRange.Add(openEdge);
                        var adjacent = GetEdges.AdjacentToEdge(openEdge);
                        foreach (var adj in adjacent)
                        {
                            if (!edgesInRange.Contains(adj))
                            {
                                edgesWithDistanceI.Add(adj);
                            }
                        }
                    }
                    openEdges = edgesWithDistanceI;
                }

                if (!includeCenter)
                {
                    edgesInRange.Remove(centerEdge);
                }

                return(edgesInRange.ToList());
            }
            /// <summary>
            /// returns all edges with are within the specified range of the input corner
            /// </summary>
            /// ![green = input corner , blue = result](GetEdges_WithinDistanceOfCorner.png)
            public static List <Vector3Int> WithinDistanceOfCorner(Vector3Int centerCorner, int maxDistance)
            {
                if (maxDistance == 0)
                {
                    return(new List <Vector3Int>());
                }
                //there might be smarter ways but this should work.
                HashSet <Vector3Int> edgesInRange = new HashSet <Vector3Int>();
                HashSet <Vector3Int> openEdges    = new HashSet <Vector3Int>();

                var adjacentToCorner = GetEdges.AdjacentToCorner(centerCorner);

                adjacentToCorner.ForEach(x => openEdges.Add(x));

                for (int i = 1; i <= maxDistance; i++)
                {
                    HashSet <Vector3Int> edgesWithDistanceI = new HashSet <Vector3Int>();
                    foreach (var edge in openEdges)
                    {
                        edgesInRange.Add(edge);
                        var adjacent = GetEdges.AdjacentToEdge(edge);
                        foreach (var adj in adjacent)
                        {
                            if (!edgesInRange.Contains(adj))
                            {
                                edgesWithDistanceI.Add(adj);
                            }
                        }
                    }
                    openEdges = edgesWithDistanceI;
                }

                return(edgesInRange.ToList());
            }
示例#3
0
        public object Get(GetEdges query)
        {
            var edges = new List <SimpleEdge>();

            foreach (Connection edge in ExprTree.Tree.Edges.ToArray())
            {
                edges.Add(new SimpleEdge(edge));
            }
            //Response.AddHeader("Access-Control-Allow-Origin", "*");
            return(edges.ToArray());
        }
            /// <summary>
            /// returns all the border edges of a set of tiles.
            /// </summary>
            /// ![green = input tiles , blue = result](GetEdges_TileBorders.png)
            public static List <Vector3Int> TileBorders(IEnumerable <Vector3Int> tiles)
            {
                List <Vector3Int> edges = new List <Vector3Int>();

                foreach (var tile in tiles)
                {
                    List <Vector3Int> edgeCoordsOfCell = GetEdges.OfTile(tile);
                    foreach (var c in edgeCoordsOfCell)
                    {
                        if (edges.Contains(c))
                        {
                            edges.Remove(c);
                        }
                        else
                        {
                            edges.Add(c);
                        }
                    }
                }
                return(edges);
            }