/// <summary>
        /// Przekształca połączenia drogowe na wierzchołki
        /// </summary>
        private void ZamienDrogiNaWierzcholki()
        {
            List <KrawedzGrafu> tymczasowaLista = drogi.ToList();

            foreach (KrawedzGrafu droga in tymczasowaLista)
            {
                WierzcholekDrogi pierwszy = (WierzcholekDrogi)droga.WierzcholekA;
                for (int i = 0; i < droga.DlugoscKrawedzi(); ++i)
                {
                    Punkt <double> punkt;
                    if (droga.ZwrocRelacje() == Relacja.Pionowe)
                    {
                        punkt = new Punkt <double>(pierwszy.Pozycja.X, pierwszy.Pozycja.Y + 1);
                    }
                    else
                    {
                        punkt = new Punkt <double>(pierwszy.Pozycja.X + 1, pierwszy.Pozycja.Y);
                    }

                    WierzcholekDrogi kolejny = DodajLubZnajdzWierzcholek(punkt, TypWierzcholkaSamochodow.Droga);

                    drogi.Add(KrawedzGrafu.StworzDroge(pierwszy, kolejny));
                    pierwszy = kolejny;
                }
                drogi.Add(KrawedzGrafu.StworzDroge(pierwszy, (WierzcholekDrogi)droga.WierzcholekB));

                drogi.Remove(droga.UsunKrawedz());
            }
        }
        private bool CzyIstniejeWierzcholekPomiedzy(WierzcholekDrogi wierzcholekA, WierzcholekDrogi wierzcholekB)
        {
            Relacja relacja = Punkt <double> .ZwrocRelacje(wierzcholekA.Pozycja, wierzcholekB.Pozycja);

            Punkt <double> punktMniejszy = Punkt <double> .ZwrocPozycjeMniejszego(wierzcholekA.Pozycja, wierzcholekB.Pozycja);

            Punkt <double> punktWiekszy = Punkt <double> .ZwrocPozycjeWiekszego(wierzcholekA.Pozycja, wierzcholekB.Pozycja);

            foreach (WierzcholekDrogi wierzcholek in WierzcholkiDrog)
            {
                if (relacja == Relacja.Pionowe && wierzcholekA.Pozycja.X == wierzcholek.Pozycja.X)
                {
                    if (wierzcholek.Pozycja.Y > punktMniejszy.Y && wierzcholek.Pozycja.Y < punktWiekszy.Y)
                    {
                        return(true);
                    }
                }
                else if (relacja == Relacja.Poziome && wierzcholekA.Pozycja.Y == wierzcholek.Pozycja.Y)
                {
                    if (wierzcholek.Pozycja.X > punktMniejszy.X && wierzcholek.Pozycja.X < punktWiekszy.X)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
        /// <summary>
        /// Wyliczanie przejść dla pieszych
        /// </summary>
        private void GenerujPrzejsciaPieszych()
        {
            List <KrawedzGrafu> drogiTymczasowe = drogi.ToList();

            foreach (KrawedzGrafu droga in drogiTymczasowe)
            {
                if (droga.DlugoscKrawedzi() > 1)
                {
                    Punkt <double> punkt;
                    if (droga.ZwrocRelacje() == Relacja.Pionowe)
                    {
                        punkt = new Punkt <double>(droga.WierzcholekA.Pozycja.X, (int)(droga.DlugoscKrawedzi() / 2) + droga.WierzcholekA.Pozycja.Y);
                    }
                    else
                    {
                        punkt = new Punkt <double>((int)(droga.DlugoscKrawedzi() / 2) + droga.WierzcholekA.Pozycja.X, droga.WierzcholekA.Pozycja.Y);
                    }

                    WierzcholekDrogi wierzcholekA        = (WierzcholekDrogi)droga.WierzcholekA;
                    WierzcholekDrogi wierzcholekB        = (WierzcholekDrogi)droga.WierzcholekB;
                    WierzcholekDrogi dzielacyWierzcholek = new WierzcholekDrogi(punkt, TypWierzcholkaSamochodow.Pasy);
                    WierzcholkiDrog.Add(dzielacyWierzcholek);

                    drogi.Remove(droga.UsunKrawedz());
                    drogi.Add(KrawedzGrafu.StworzDroge(wierzcholekA, dzielacyWierzcholek));
                    drogi.Add(KrawedzGrafu.StworzDroge(dzielacyWierzcholek, wierzcholekB));
                }
            }
        }
        /// <summary>
        /// łączy skrzyżowania pewne
        /// </summary>
        private void LaczSkrzyzowania()
        {
            List <WierzcholekDrogi> skrzyzowania = WierzcholkiDrog.FindAll(o => o.TypWierzcholka == TypWierzcholkaSamochodow.Skrzyzowanie);

            foreach (WierzcholekDrogi wierzcholek in skrzyzowania)
            {
                WierzcholekDrogi wlasciwy = null;
                foreach (WierzcholekDrogi potencjalny in skrzyzowania)
                {
                    if (wierzcholek != potencjalny && wierzcholek.Krawedzie.Find(o => o.ZwrocPrzeciwnyWierzcholek(wierzcholek) == potencjalny) == null)
                    {
                        if ((wlasciwy == null || Punkt <double> .Odleglosc(wlasciwy.Pozycja, wierzcholek.Pozycja) > Punkt <double> .Odleglosc(potencjalny.Pozycja, wierzcholek.Pozycja)) &&
                            Punkt <double> .ZwrocRelacje(wierzcholek.Pozycja, potencjalny.Pozycja) != Relacja.Brak &&
                            !CzyIstniejeWierzcholekPomiedzy(wierzcholek, potencjalny))
                        {
                            wlasciwy = potencjalny;
                        }
                    }
                }
                if (wlasciwy != null)
                {
                    drogi.Add(KrawedzGrafu.StworzDroge(wlasciwy, wierzcholek));
                }
            }
        }
Ejemplo n.º 5
0
        public void PoruszanieSamochodem()
        {
            if (trasa.Count > 0)
            {
                if (!czyCzekamNaPozwolenie)
                {
                    Punkt <double> przesuniecie;

                    if (trasa[0].TypWierzcholka == TypWierzcholkaSamochodow.Skrzyzowanie)
                    {
                        przesuniecie = ((WejscieNaSkrzyzowanie)trasa[0].ObiektDrogi).Przesuniecie(ObecnaPozycja.Pozycja, trasa[1].Pozycja);
                    }
                    else
                    {
                        przesuniecie = trasa[0].ObiektDrogi.Przesuniecie(ObecnaPozycja.Pozycja);
                    }

                    Geometria geometriaPieszyCel = new Geometria(new Punkt <double>(trasa[0].Pozycja.X * 80 + przesuniecie.X, trasa[0].Pozycja.Y * 80 + przesuniecie.Y),
                                                                 new Punkt <double>(ZwrocPozycje().X + obrazek.Width / 2, ZwrocPozycje().Y + obrazek.Height / 2));

                    if (geometriaPieszyCel.ObliczOdlegloscPomiedzy() >= 2)
                    {
                        UstawPozycje(new Punkt <double>(ZwrocPozycje().X + geometriaPieszyCel.ObliczWektorPrzesuniecia(2).X,
                                                        ZwrocPozycje().Y + geometriaPieszyCel.ObliczWektorPrzesuniecia(2).Y));

                        obrazek.RenderTransform = new RotateTransform(geometriaPieszyCel.ObliczKatPomiedzy());
                    }
                    else
                    {
                        ObecnaPozycja = trasa[0];

                        trasa.RemoveAt(0);
                        czyCzekamNaPozwolenie = true;
                    }
                }

                if (czyCzekamNaPozwolenie && trasa.Count > 0)
                {
                    Cel = trasa.Count >= 2 ? trasa[1] : null;
                    if (trasa[0].CzyMogeWejsc(this))
                    {
                        ObecnaPozycja.Wyjdz(this);
                        czyCzekamNaPozwolenie = false;
                        trasa[0].Wejdz(this);
                    }
                    else if (ObecnaPozycja.TypWierzcholka == TypWierzcholkaSamochodow.Skrzyzowanie)
                    {
                        ((WejscieNaSkrzyzowanie)ObecnaPozycja.ObiektDrogi).ZmienPrzecinanieDrogi(this);
                    }
                }
            }
            else
            {
                ObecnaPozycja.Wyjdz(this);
                Dispose();
            }
        }
        private WierzcholekDrogi DodajLubZnajdzWierzcholek(Punkt <double> pozycja, TypWierzcholkaSamochodow typWierzcholka = TypWierzcholkaSamochodow.Skrzyzowanie)
        {
            WierzcholekDrogi wierzcholek = WierzcholkiDrog.Find(obiekt => obiekt.Pozycja.Equals(pozycja));

            if (wierzcholek == null)
            {
                WierzcholkiDrog.Add(wierzcholek = new WierzcholekDrogi(pozycja, typWierzcholka));
            }

            return(wierzcholek);
        }
        /// <summary>
        /// Wyznacza połączenia które są pewnikiem i są podstawą między innymi połączeniami
        /// </summary>
        private void GenerujPoloczeniaKonieczne()
        {
            Punkt <double> punktGorny = new Punkt <double>(0, rozmiarMapyY / 2);
            Punkt <double> punktDolny = new Punkt <double>(0, rozmiarMapyY / 2);
            Punkt <double> punktLewy  = new Punkt <double>(rozmiarMapyX / 2, 0);
            Punkt <double> punktPrawy = new Punkt <double>(rozmiarMapyX / 2, 0);

            foreach (WierzcholekDrogi wierzcholek in WierzcholkiDrog)
            {
                if (wierzcholek.Pozycja.Y < punktGorny.Y && wierzcholek.Pozycja.Y != GRANICA_GORNA)
                {
                    punktGorny = wierzcholek.Pozycja;
                }
                if (wierzcholek.Pozycja.Y > punktDolny.Y && wierzcholek.Pozycja.Y != GRANICA_DOLNA)
                {
                    punktDolny = wierzcholek.Pozycja;
                }
                if (wierzcholek.Pozycja.X > punktPrawy.X && wierzcholek.Pozycja.X != GRANICA_PRAWA)
                {
                    punktPrawy = wierzcholek.Pozycja;
                }
                if (wierzcholek.Pozycja.X < punktLewy.X && wierzcholek.Pozycja.X != GRANICA_LEWA)
                {
                    punktLewy = wierzcholek.Pozycja;
                }
            }

            List <WierzcholekDrogi> punktyWejscia = WierzcholkiDrog.ToList();

            foreach (WierzcholekDrogi wierzcholek in punktyWejscia)
            {
                Punkt <double> punktPrzeciecia = new Punkt <double>(0, 0);

                if (wierzcholek.Pozycja.Y == GRANICA_GORNA) // Góra
                {
                    punktPrzeciecia = new Punkt <double>(wierzcholek.Pozycja.X, punktGorny.Y);
                }
                else if (wierzcholek.Pozycja.X == GRANICA_PRAWA) // Prawa
                {
                    punktPrzeciecia = new Punkt <double>(punktPrawy.X, wierzcholek.Pozycja.Y);
                }
                else if (wierzcholek.Pozycja.Y == GRANICA_DOLNA) // Dół
                {
                    punktPrzeciecia = new Punkt <double>(wierzcholek.Pozycja.X, punktDolny.Y);
                }
                else if (wierzcholek.Pozycja.X == GRANICA_LEWA) // Lewa
                {
                    punktPrzeciecia = new Punkt <double>(punktLewy.X, wierzcholek.Pozycja.Y);
                }

                WierzcholekDrogi nowyWierzcholek = DodajLubZnajdzWierzcholek(punktPrzeciecia);
                drogi.Add(KrawedzGrafu.StworzDroge(nowyWierzcholek, wierzcholek));
            }
        }
 /// <summary>
 /// Usówa ślepe połączenia, usówa nadmiarowe skrzyżowania, tworzy zakręty
 /// </summary>
 private void RedukujPolaczenia()
 {
     for (int i = 0; i < WierzcholkiDrog.Count; ++i)
     {
         WierzcholekDrogi wierzcholek = WierzcholkiDrog[i];
         if (wierzcholek.TypWierzcholka == TypWierzcholkaSamochodow.Skrzyzowanie)
         {
             if (wierzcholek.Krawedzie.Count == 1)
             {
                 for (int j = wierzcholek.Krawedzie.Count - 1; j >= 0; --j)
                 {
                     drogi.Remove(wierzcholek.Krawedzie[j].UsunKrawedz());
                 }
                 WierzcholkiDrog.Remove(wierzcholek);
             }
             else if (wierzcholek.Krawedzie.Count == 2)
             {
                 if (Punkt <double> .ZwrocRelacje(wierzcholek.Krawedzie[0].ZwrocPrzeciwnyWierzcholek(wierzcholek).Pozycja, wierzcholek.Krawedzie[1].ZwrocPrzeciwnyWierzcholek(wierzcholek).Pozycja) == Relacja.Brak)
                 {
                     wierzcholek.TypWierzcholka = TypWierzcholkaSamochodow.Zakret;
                 }
                 else
                 {
                     drogi.Add(KrawedzGrafu.StworzDroge(wierzcholek.Krawedzie[1].ZwrocPrzeciwnyWierzcholek(wierzcholek), wierzcholek.Krawedzie[0].ZwrocPrzeciwnyWierzcholek(wierzcholek)));
                     for (int j = wierzcholek.Krawedzie.Count - 1; j >= 0; --j)
                     {
                         drogi.Remove(wierzcholek.Krawedzie[j].UsunKrawedz() as KrawedzGrafu);
                     }
                     WierzcholkiDrog.Remove(wierzcholek);
                 }
             }
         }
         else if (wierzcholek.TypWierzcholka == TypWierzcholkaSamochodow.PunktWejscia)
         {
             if (wierzcholek.Krawedzie.Count == 0)
             {
                 WierzcholkiDrog.Remove(wierzcholek);
             }
         }
     }
 }