/// <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; }); }
/// <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]; } }