コード例 #1
0
        /// <summary>
        /// Searches for the shortest path to the point by propagating given waves.
        /// </summary>
        /// <typeparam name="TWave">Type of waves to use (e.g. <see cref="Wave"/>).</typeparam>
        /// <param name="tracer">Tracer to search with.</param>
        /// <param name="initial">Initial set of waves to propagate (e.g. <see cref="Initialize4x2D{TWave}"/>).</param>
        /// <param name="to">Location to reach.</param>
        /// <param name="map">Map to navigate (e.g. <see cref="GridMap"/>); if left null, <see cref="Tracer{TWave}.DefaultMap"/> will be used.</param>
        /// <returns>List of waypoints.</returns>
        /// <exception cref="ArgumentNullException">Thrown if both <paramref name="map"/> parameter and <see cref="Tracer{TWave}.DefaultMap"/> field are null.</exception>
        public static IReadOnlyList <Vector3> FindShortestPath <TWave>(
            this Tracer <TWave> tracer, IInitializationStrategy <TWave> initial, Vector3 to, IMap <TWave> map = null)
            where TWave : IWave, IWaveBehaviour <TWave>
        {
            if (map == null && tracer.DefaultMap == null)
            {
                throw new ArgumentNullException(nameof(map), "ECHO: Either [map] parameter or [Tracer.DefaultMap] field must not be null.");
            }

            map = map ?? tracer.DefaultMap;

            var queue = new PriorityQueue <TWave>(
                new PriorityByEstimatedPathLength <TWave>(to, map),
                new PriorityByAlignment <TWave>(to));
            var wave = tracer.Search(initial, map, queue).FirstOrDefault();

            return(wave?.FullPath);
        }
コード例 #2
0
        public IADOPersister CreateADOPersister(IInitializationStrategy initializationStrategy, Action<IPersistenceValidationContext> initializationAction)
        {
            var adoPersister = new global::NHibernateContext.ADOPersister.ADOPersister(NHibernateSessionManager);


            var actualInitializationStrategy = initializationStrategy ?? DefaultInitializationStrategy(adoPersister);
            var actualInitializationAction = initializationAction ?? DefaultInitializationAction();


            var persistenceValidationContext = new PersistenceValidationContext(actualInitializationStrategy);

            actualInitializationAction.Invoke(persistenceValidationContext);

            persistenceValidationContext.EnsureNotEmpty();


            adoPersister.Apply(persistenceValidationContext);

            return adoPersister;
        }
コード例 #3
0
        public IADOPersister CreateADOPersister(IInitializationStrategy initializationStrategy, Action <IPersistenceValidationContext> initializationAction)
        {
            var adoPersister = new global::NHibernateContext.ADOPersister.ADOPersister(NHibernateSessionManager);


            var actualInitializationStrategy = initializationStrategy ?? DefaultInitializationStrategy(adoPersister);
            var actualInitializationAction   = initializationAction ?? DefaultInitializationAction();


            var persistenceValidationContext = new PersistenceValidationContext(actualInitializationStrategy);

            actualInitializationAction.Invoke(persistenceValidationContext);

            persistenceValidationContext.EnsureNotEmpty();


            adoPersister.Apply(persistenceValidationContext);

            return(adoPersister);
        }
コード例 #4
0
 public IADOPersister CreateADOPersister(IInitializationStrategy initializationStrategy)
 {
     return CreateADOPersister(initializationStrategy, null);
 }
コード例 #5
0
        public PersistenceValidationContext(IInitializationStrategy initializationStrategy)
        {
            PersistenceValidatorsMap = new Dictionary <Type, Type>();

            InitializationStrategy = initializationStrategy;
        }
コード例 #6
0
        /// <summary>
        /// Initiates searching routine.
        /// </summary>
        /// <param name="initial">Initial set of waves to propagate (e.g. <see cref="Initialize4x2D{TWave}"/>).</param>
        /// <param name="map">Map to navigate (e.g. <see cref="GridMap"/>).</param>
        /// <param name="queue">Queue to store and order waves between iterations (e.g. <see cref="QueueAdapter{TWave}"/>).</param>
        /// <returns>Waves that satisfy their respective <see cref="IWaveBehaviour{TWave}.AcceptanceCondition"/>.</returns>
        /// <exception cref="ArgumentNullException">Thrown if both <paramref name="map"/> and <see cref="DefaultMap"/> are nulls, or <paramref name="initial"/> is null.</exception>
        public IEnumerable <TWave> Search(IInitializationStrategy <TWave> initial, IMap <TWave> map, IProcessingQueue <TWave> queue)
        {
            _iterations = 0;
            _waves      = 0;

            map   = map ?? DefaultMap;
            queue = queue ?? DefaultProcessingQueue;

            {
                var errors = new List <string>(2);
                if (map == null)
                {
                    errors.Add(nameof(map));
                }
                if (initial == null)
                {
                    errors.Add(nameof(initial));
                }
                if (errors.Count > 0)
                {
                    throw new ArgumentNullException(string.Join(", ", errors));
                }
            }

            if (queue == null)
            {
                queue = new QueueAdapter <TWave>();
                Debug.WriteLine("ECHO: Processing queue is not set. QueueAdapter<" + nameof(TWave) + "> (breadth-first search) will be used.");
            }
            else
            {
                queue.Clear();
            }

            {
                var waves = initial.Execute();
                if (waves == null || waves.Length == 0)
                {
                    yield break;
                }
                for (int i = 0; i < waves.Length; i++)
                {
                    queue.Enqueue(waves[i]);
                }
            }

            while (queue.Count > 0)
            {
                var wave = queue.Dequeue();

                _iterations++;
                _waves = queue.Count;
                Debug.WriteLine($"ECHO: iteration {_iterations}, waves {_waves}, processing {wave};");

                Vector3 location;
                if (!map.Navigate(wave, out location))
                {
                    continue;
                }

                wave.Relocate(location);
                wave.Update?.Execute(wave);

                if (wave.FadeCondition?.Check(wave) == true)
                {
                    continue;
                }

                if (wave.AcceptanceCondition?.Check(wave) == true)
                {
                    yield return(wave);

                    continue;
                }

                var waves = wave.Propagation?.Execute(wave);
                if (waves != null)
                {
                    for (var i = 0; i < waves.Length; i++)
                    {
                        if (waves[i] == null)
                        {
                            continue;
                        }
                        queue.Enqueue(waves[i]);
                    }
                }

                queue.Enqueue(wave);
            }
        }
コード例 #7
0
 public IADOPersister CreateADOPersister(IInitializationStrategy initializationStrategy)
 {
     return(CreateADOPersister(initializationStrategy, null));
 }