コード例 #1
0
ファイル: LineaBC.cs プロジェクト: alonsobh/TransportPro
        public ObjectoDijkstra[] DameGrafos()
        {
            var list = LineaDA.GetInstance().lineas.SelectMany(l => LineaARutaDetalle.DameDetalle(l.Paraderos.First(), l.Paraderos.Last(), l)).ToList();

            list.AddRange(LineaDA.GetInstance().lineas.SelectMany(l => LineaARutaDetalle.DameDetalle(l.Paraderos.Last(), l.Paraderos.First(), l)).ToList());
            var lista2 = list
                         .GroupBy(l => l.ParaderoOrigen.Codigo + "/" + l.ParaderoDestino.Codigo)
                         .Select(k => k.First())
                         .ToArray();

            return(lista2
                   .GroupBy(l => l.ParaderoOrigen.Codigo)
                   .Select(k => new ObjectoDijkstra
            {
                Origen = k.First().ParaderoOrigen,
                Destinos =
                    k.Select(d => new Dijkstra {
                    Destino = d.ParaderoDestino, Distancia = d.Distancia
                }).ToArray()
            }).ToArray());
        }
コード例 #2
0
        private List <RutaDetalle> DameDetalle(Paradero origen, Paradero destino, Linea linea = null)
        {
            if (origen.Codigo == destino.Codigo)
            {
                return(new List <RutaDetalle>());
            }

            Linea[] lineas;

            if (linea != null)
            {
                lineas = new[] { linea }
            }
            ;
            else
            {
                lineas = LineaBC.DameLineas(origen);
            }
            var distance             = Distance.GetDistance(origen.Coordenada, destino.Coordenada);
            var paraderosMasCercanos =
                lineas
                .SelectMany(l => l.Paraderos.Select(p => new { Paradero = p, Linea = l, Distancia = Distance.GetDistance(p.Coordenada, destino.Coordenada) + Distance.GetDistance(p.Coordenada, origen.Coordenada) }))
                .Where(p => p.Paradero.Codigo != origen.Codigo &&
                       Distance.GetDistance(p.Paradero.Coordenada, destino.Coordenada) < distance)
                .OrderBy(p => p.Distancia)
                .ToArray();

            if (getMinimal)
            {
                var list = new List <List <RutaDetalle> >();


                foreach (var paraderoMasCercano in paraderosMasCercanos)
                {
                    var rutaDetalle = DameDetalle(paraderoMasCercano.Paradero, destino);
                    if (rutaDetalle == null)
                    {
                        continue;
                    }
                    var detalle = LineaARutaDetalle.DameDetalle(origen, paraderoMasCercano.Paradero, paraderoMasCercano.Linea);
                    detalle.AddRange(rutaDetalle);
                    list.Add(detalle);
                }
                return(list.OrderBy(p => p.Sum(d => d.Distancia)).First());
            }
            else
            {
                foreach (var paraderoMasCercano in paraderosMasCercanos)
                {
                    var rutaDetalle = DameDetalle(paraderoMasCercano.Paradero, destino);
                    if (rutaDetalle == null)
                    {
                        continue;
                    }
                    var detalle = LineaARutaDetalle.DameDetalle(origen, paraderoMasCercano.Paradero, paraderoMasCercano.Linea);
                    detalle.AddRange(rutaDetalle);
                    return(detalle);
                }
            }

            return(new List <RutaDetalle>());
        }