private void ScanExitDirection(SceneExitDirections dir) { var n = GetNavigableConnection(dir); if (n != Vector3.Zero) { ExitPositions.Add(dir, n); ExitDirections |= dir; } }
public Vector3 GetNavigableConnection(SceneExitDirections direction) { var nodes = Nodes.Where(n => n.IsEdgeNode && IsOnEdge(n, direction) && n.IsConnectionNode).ToList(); if (!nodes.Any()) { return(Vector3.Zero); } var centerIndex = Math.Max(0, (int)Math.Round((double)nodes.Count / 2, 0) - 1); var center = nodes.ElementAt(centerIndex); return(center.NavigableCenter); }
public Vector3 GetNavigableConnection(SceneExitDirections direction) { var nodes = Nodes.Where(n => n.IsEdgeNode && IsOnEdge(n, direction) && n.IsConnectionNode).ToList(); if (!nodes.Any()) { return(Vector3.Zero); } //if (nodes.Count == 2 && nodes.First().IsNextTo(nodes.Last())) //{ // var start = nodes.First().NavigableCenter; // var end = nodes.Last().NavigableCenter; // return MathEx.CalculatePointFrom(start, end, start.Distance2D(end) / 2); //} var centerIndex = Math.Max(0, (int)Math.Round((double)nodes.Count / 2, 0) - 1); var center = nodes.ElementAt(centerIndex); return(center.NavigableCenter); //foreach (var n in Nodes.Where(n => n.HasEnoughNavigableCells && n.IsConnectionNode)) //{ // switch (direction) // { // case SceneExitDirections.North: // if (n.TopLeft.X == NorthWest.X) // return n.NavigableCenter; // break; // case SceneExitDirections.East: // if (n.BottomLeft.Y == NorthEast.Y) // return n.NavigableCenter; // break; // case SceneExitDirections.South: // if (n.BottomRight.X == SouthEast.X) // return n.NavigableCenter; // break; // case SceneExitDirections.West: // if (n.TopRight.Y == SouthWest.Y) // return n.NavigableCenter; // break; // } //} //return Vector3.Zero; }
public bool IsOnEdge(ExplorationNode n, SceneExitDirections direction) { switch (direction) { case SceneExitDirections.North: return(n.TopLeft.X == NorthWest.X); case SceneExitDirections.East: return(n.BottomLeft.Y == NorthEast.Y); case SceneExitDirections.South: return(n.BottomRight.X == SouthEast.X); case SceneExitDirections.West: return(n.TopRight.Y == SouthWest.Y); } return(false); }
public bool IsOnEdge(ExplorationNode n, SceneExitDirections direction) { switch (direction) { case SceneExitDirections.North: return(Math.Abs(n.TopLeft.X - NorthWest.X) < float.Epsilon); case SceneExitDirections.East: return(Math.Abs(n.BottomLeft.Y - NorthEast.Y) < float.Epsilon); case SceneExitDirections.South: return(Math.Abs(n.BottomRight.X - SouthEast.X) < float.Epsilon); case SceneExitDirections.West: return(Math.Abs(n.TopRight.Y - SouthWest.Y) < float.Epsilon); } return(false); }