/// <summary> /// Calculates a path. /// </summary> /// <returns>The path.</returns> public Path Run(RouterDb routerDb, SnapPoint source, SnapPoint target, Func <RouterDbEdgeEnumerator, uint> getWeight, Func <VertexId, bool> settled = null, Func <VertexId, bool> queued = null) { var enumerator = routerDb.GetEdgeEnumerator(); _tree.Clear(); _visits.Clear(); _heap.Clear(); // add sources. // add forward. if (!enumerator.MoveToEdge(source.EdgeId, true)) { throw new Exception($"Edge in source {source} not found!"); } var sourceCostForward = getWeight(enumerator); if (sourceCostForward > 0) { // can traverse edge in the forward direction. var sourceOffsetCostForward = sourceCostForward * (1 - source.OffsetFactor()); var p = _tree.AddVisit(enumerator.To, source.EdgeId, uint.MaxValue); _heap.Push(p, sourceOffsetCostForward); } // add backward. if (!enumerator.MoveToEdge(source.EdgeId, false)) { throw new Exception($"Edge in source {source} not found!"); } var sourceCostBackward = getWeight(enumerator); if (sourceCostBackward > 0) { // can traverse edge in the backward direction. var sourceOffsetCostBackward = sourceCostBackward * source.OffsetFactor(); var p = _tree.AddVisit(enumerator.To, source.EdgeId, uint.MaxValue); _heap.Push(p, sourceOffsetCostBackward); } // add targets. (uint pointer, float cost, bool forward, SnapPoint target)bestTarget = (uint.MaxValue, float.MaxValue, false,