public Punkt <double> Przesuniecie(Punkt <double> punkt)
 {
     if (Punkt <double> .ZwrocRelacje(punkt, pozycja) == Relacja.Pionowe)
     {
         if (punkt.Y > pozycja.Y)
         {
             return(new Punkt <double>(60, 40));
         }
         else
         {
             return(new Punkt <double>(20, 40));
         }
     }
     else
     {
         if (punkt.X > pozycja.X)
         {
             return(new Punkt <double>(40, 20));
         }
         else
         {
             return(new Punkt <double>(40, 60));
         }
     }
 }
        public void Wejdz(Samochod samochod)
        {
            PrzejscieDlaPieszych.Wjedz(samochod);

            if (Punkt <double> .ZwrocRelacje(samochod.ObecnaPozycja.Pozycja, pozycja) == Relacja.Pionowe)
            {
                if (samochod.ObecnaPozycja.Pozycja.Y > pozycja.Y)
                {
                    lewyPojazd = samochod;
                }
                else
                {
                    prawyPojazd = samochod;
                }
            }
            else if (Punkt <double> .ZwrocRelacje(samochod.ObecnaPozycja.Pozycja, pozycja) == Relacja.Poziome)
            {
                if (samochod.ObecnaPozycja.Pozycja.X > pozycja.X)
                {
                    prawyPojazd = samochod;
                }
                else
                {
                    lewyPojazd = samochod;
                }
            }
            else
            {
                throw new Exception("Niepoprawny obiekt na wejściu");
            }
        }
        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>
        /// łą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));
                }
            }
        }
 public void Wejdz(Samochod samochod)
 {
     if (Punkt <double> .ZwrocRelacje(samochod.ObecnaPozycja.Pozycja, pozycja) == Relacja.Pionowe)
     {
         if (samochod.ObecnaPozycja.Pozycja.Y > pozycja.Y)
         {
             lewyPojazd = samochod;
         }
         else
         {
             prawyPojazd = samochod;
         }
     }
     else if (Punkt <double> .ZwrocRelacje(samochod.ObecnaPozycja.Pozycja, pozycja) == Relacja.Poziome)
     {
         if (samochod.ObecnaPozycja.Pozycja.X > pozycja.X)
         {
             prawyPojazd = samochod;
         }
         else if (samochod == prawyPojazd)
         {
             lewyPojazd = samochod;
         }
     }
     else
     {
         throw new Exception("Nieprawidłowy obiekt na wejściu");
     }
 }
 public bool CzyMogeWejsc(Samochod samochod)
 {
     if (Punkt <double> .ZwrocRelacje(samochod.ObecnaPozycja.Pozycja, pozycja) == Relacja.Pionowe)
     {
         if (samochod.ObecnaPozycja.Pozycja.Y > pozycja.Y)
         {
             return(lewyPojazd == null);
         }
         else
         {
             return(prawyPojazd == null);
         }
     }
     else if (Punkt <double> .ZwrocRelacje(samochod.ObecnaPozycja.Pozycja, pozycja) == Relacja.Poziome)
     {
         if (samochod.ObecnaPozycja.Pozycja.X > pozycja.X)
         {
             return(prawyPojazd == null);
         }
         else
         {
             return(lewyPojazd == null);
         }
     }
     else
     {
         throw new Exception("Nieprawidłowy obiekt na wejściu");
     }
 }
 /// <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);
             }
         }
     }
 }