Пример #1
0
        /// <summary>
        /// Returns an isacceptable function using the cached data.
        /// </summary>
        public Func <GeometricEdge, bool> GetIsAcceptable(bool verifyCanStopOn, params Profile[] profiles)
        {
            if (!this.ContainsAll(profiles))
            {
                throw new ArgumentException("Not all given profiles are supported.");
            }

            var cachedFactors = new CachedAndSpeedFactor[profiles.Length][];

            for (var p = 0; p < profiles.Length; p++)
            {
                cachedFactors[p] = _edgeProfileFactors[profiles[p].Name];
            }

            return((edge) =>
            {
                float distance;
                ushort edgeProfileId;
                Data.Edges.EdgeDataSerializer.Deserialize(edge.Data[0],
                                                          out distance, out edgeProfileId);
                for (var i = 0; i < profiles.Length; i++)
                {
                    var cachedFactor = cachedFactors[i][edgeProfileId];
                    if ((verifyCanStopOn && cachedFactor.Type > 4) ||
                        cachedFactor.Value <= 0)
                    {
                        return false;
                    }
                }
                return true;
            });
        }
Пример #2
0
        /// <summary>
        /// Precalculates speed factors for all the given profiles.
        /// </summary>
        public void CalculateFor(params Profile[] profiles)
        {
            var edgeProfileFactors = new CachedAndSpeedFactor[profiles.Length][];

            for (var p = 0; p < profiles.Length; p++)
            {
                edgeProfileFactors[p] = new CachedAndSpeedFactor[(int)_db.EdgeProfiles.Count];
            }
            for (uint edgeProfile = 0; edgeProfile < _db.EdgeProfiles.Count; edgeProfile++)
            {
                var edgeProfileTags = _db.EdgeProfiles.Get(edgeProfile);
                for (var p = 0; p < profiles.Length; p++)
                {
                    var factor    = profiles[p].Factor(edgeProfileTags);
                    var speed     = profiles[p].Speed(edgeProfileTags);
                    var stoppable = profiles[p].CanStopOn(edgeProfileTags);
                    if (stoppable)
                    {
                        edgeProfileFactors[p][edgeProfile] = new CachedAndSpeedFactor()
                        {
                            Type        = factor.Direction,
                            SpeedFactor = 1 / speed.Value,
                            Value       = factor.Value
                        };
                    }
                    else
                    {
                        edgeProfileFactors[p][edgeProfile] = new CachedAndSpeedFactor()
                        {
                            Type        = (short)(factor.Direction + 4),
                            SpeedFactor = 1 / speed.Value,
                            Value       = factor.Value
                        };
                    }
                }
            }

            for (var p = 0; p < profiles.Length; p++)
            {
                _edgeProfileFactors[profiles[p].Name] = edgeProfileFactors[p];
            }
        }