Exemplo n.º 1
0
        /// <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);
                }
            }
        }
Exemplo n.º 2
0
        /// <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);
        }