コード例 #1
0
ファイル: WorldScene.cs プロジェクト: ysj1995/Trinity
        private void ScanExitDirection(SceneExitDirections dir)
        {
            var n = GetNavigableConnection(dir);

            if (n != Vector3.Zero)
            {
                ExitPositions.Add(dir, n);
                ExitDirections |= dir;
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: WorldScene.cs プロジェクト: ysj1995/Trinity
        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;
        }
コード例 #4
0
ファイル: WorldScene.cs プロジェクト: ysj1995/Trinity
        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);
        }
コード例 #5
0
ファイル: WorldScene.cs プロジェクト: honorbuddy/Trinity
        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);
        }