/// <summary> /// Moves this enumerator to the target vertex of the given directed edge-id. /// </summary> public static void MoveToTargetVertex(this Graph.EdgeEnumerator enumerator, long directedEdgeId) { enumerator.MoveToEdge(directedEdgeId); if (directedEdgeId > 0) { if (!enumerator.DataInverted) { enumerator.MoveTo(enumerator.To); } else { enumerator.MoveTo(enumerator.From); } } else { if (enumerator.DataInverted) { enumerator.MoveTo(enumerator.To); } else { enumerator.MoveTo(enumerator.From); } } }
/// <summary> /// Finds the best edge between the two given vertices. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="graph"></param> /// <param name="weightHandler"></param> /// <param name="vertex1"></param> /// <param name="vertex2"></param> /// <returns></returns> public static long FindBestEdge <T>(this Graph.EdgeEnumerator edgeEnumerator, WeightHandler <T> weightHandler, uint vertex1, uint vertex2, out T bestWeight) where T : struct { edgeEnumerator.MoveTo(vertex1); bestWeight = weightHandler.Infinite; long bestEdge = Constants.NO_EDGE; Factor factor; while (edgeEnumerator.MoveNext()) { if (edgeEnumerator.To == vertex2) { float distance; ushort edgeProfile; EdgeDataSerializer.Deserialize(edgeEnumerator.Data0, out distance, out edgeProfile); var weight = weightHandler.Calculate(edgeProfile, distance, out factor); if (factor.Value > 0 && (factor.Direction == 0 || ((factor.Direction == 1) && !edgeEnumerator.DataInverted) || ((factor.Direction == 2) && edgeEnumerator.DataInverted))) { // it's ok; the edge can be traversed by the given vehicle. if (weightHandler.IsSmallerThan(weight, bestWeight)) { bestWeight = weight; bestEdge = edgeEnumerator.IdDirected(); } } } } return(bestEdge); }