przez arek_wroc » Cz, 26 sty 2012 17:55
Czesc koledzy.
Posiedziałem trochę na ta moją pracą na tym algorytmem i jednak znów proszę was o pomoc, mam problemy z posklejaniem tego za pomocą pseudokodu, jak możecie pomócie mi, chociaż częsciowo, będę wdzieczny.
Pokaże Wam poniżej to co mam, prosze o pomoc.
To moja czesc pracy:
W taki sposób tworze algorytm:
- usuwamy drogi i rzeki najniższej kategorii,
if warunek then
ciąg instrukcji:
for rodzaj drogi na mapie
{
for odpowiedni dla konkretnej drogi odpowiedni punkt drogi na mapie
{
if usuwamy drogi najniższej kategorii
jeżeli droga ma kategorię mniejszą niż minimalna kategoria dla skali to usuń drogę
then zostają nam drogi, które będziemy rozpatrywać
else wynik nas zadawala
W taki sam sposób robimy takie czynności:
- usuwamy ronda i łączymy drogi prowadzące do ronda,
- usuwamy rampy,
- usuwamy krótkie odcinki dróg i łączymy węzły tych odcinków,
Teraz używamy algorytmu grupowania gdyż:
- grupujemy drogi o podobnych typach i nadajemy im jeden wspólny typ
if
jeżeli droga ma typ drogi ekspresowej to ustawiamy taki typ drogi
Następnie po uzyskaniu grupowania robimy kolejny krok:
- łączymy odcinki ze wspólnym węzłem i identycznym typem drogi.
A więc na wejściu mamy tak:
po znalezieniu dwóch odcinków ze wspólnym węzłem (końcowym) i identycznym typem sprawdzamy:
- czy wspólny punkt jest w pierwszym odcinku ostatni, a w drugim odcinku czy jest pierwszy
- jeśli nie, zamieniamy je miejscami (nazwami) i wracamy do sprawdzania - albo zamieniamy tylko ich określenie /pierwszy/drugi
- jeśli nadal nie, odwracamy kolejność punktów w tym, który tymczasem uznamy za „pierwszy”.
Możemy to sprawdzanie zrobić jeszcze tak:
- sprawdzamy, które punkty "pierwszy-ostatni" się pokrywają, i zależnie od tego nazywamy je sobie "pierwszy-drugi" i robimy odwracanie kolejności punktów nazwanego jako pierwszy
- kasujemy (pomijamy) w jednym z nich jedno z powtarzających się wystąpień tej współrzędnej wspólnej
- łączymy ciągi współrzędnych "jeden+drugi".
Powstaje nam wyjście - jeden odcinek połączony.
Tak robimy dla kolejnych odcinków dróg, aż uzyskamy zamierzony cel.
Poniżej widzimy zalecaną „gradacje” typów, poziomów i symboli dla dróg:
TYPE 0x01
12345 4 ~[0x2b]a4 # autostrada
TYPE 0x02
23456 4 ~[0x2c]s7 # droga szybkiego ruchu/krajowe >=2 pasy w 1 stronę
TYPE 0x03
34567 3 ~[0x2c]12 # krajowe 1- i 2-cyfrowe
45678 3 ~[0x2d]345 # niektóre ważniejsze 3-cyfrowe
TYPE 0x04
56789 2 ~[0x2d]345 # większość 3-cyfrowych
TYPE 0x05
67890 2 # lokalne, bez numerów
TYPE 0x06
78999 1 # osiedlowe w miastach, zupełnie boczne we wsiach itp.
Rozwiązanie dla każdej linii typu rzeka:
- bierzemy współrzędne pierwszego punktu,
- przeglądamy wszystkie punkty innych rzek czy są takie same (porównując xx.yy,zz.ww),
- jeśli znajdziemy jako pierwszy lub ostatni punkt, ale raz, to są to kolejne odcinki tej samej rzeki (można współrzędne ustawić w odpowiedniej kolejności zależnie które punkty się pokrywają),
- jeżeli znajdziemy dwa punkty, to jest to rozwidlenie rzek lub rzeki spływają się (wtedy pozostawiamy to bez zmian).
Można to opisać tak:
dla każdego pierwszego i ostatniego punktu rzeki (linii typu rzeka jest kilka) szukamy punktu położonego w tych samych współrzędnych, w promieniu (może być kwadratowo) 0.001 stopnia = około 100 metrów. Jeśli znajdziemy, i on będzie końcowym dla innego odcinka, to są to kolejne odcinki tej samej rzeki. Można sklejać w odpowiedniej kolejności (ale musimy pamiętać czasem kolejność punktów rzeki jest "pod prąd"). Jeżeli będzie jakimś "środkowym", to mamy ostatni odcinek dopływu tej drugiej rzeki. Do tego możemy dołożyć kilka przypadków szczególnych, np. rzeka rozpływa się na dwa koryta, a potem spływa, albo dwie rzeki łączą się w trzecią (unikalne, ale teoretycznie możliwe), albo rzeka do której wpada nie ma narysowanego w tym miejscu punktu. Rzeki są rysowane liniami łamanymi.
Z góry dziekuje wam jeszcze raz.