Dokumentace Světelná křižovatka v.0.9

download

Zadání:

Cílem zápočtového programu bylo naprogramovat model světelné dopravní křižovatky. Sám jsem zadání doplnil o specifikaci křižovatky a výsledné provedení. Křižovatka nabízí dva režimy, režim spuštěných a vypnutých semaforů.

Specifikace programu:

Při vytváření programu jsem se snažil o co nejrealističtější interpretaci křižovatky reálné. Auta se snaží jezdit po křivkách a natáčet se podle vektorů rychlostí. Auta mají též implementovánu různou rychlost pohybu, i když tato vlastnost aut vnáší do programu více problémů než zisků. Řízení provozu křižovatky (semafory), jsou závislé na množství aut na křižovatku přijíždějících. Semafor by tedy měl reagovat na počty aut v jednotlivých směrech a podle toho volit své nastavení.

Konstanty

V programu je využito několika konstant, které souvisí hlavně s grafickým výstupem. Jedná se hlavně o pole x[0..10] a y[0..10], a potom o konstanty maxx, minx a maxy, miny, které vymezují grafickou plochu. S konstantami je počítáno i v procedurách určujících pozice aut, jejich trajektorie apod.

Implementace a datové struktury:

Při implementaci křižovatky jsem využil několik spojových seznamů (s hlavou i patou), pro auta v jednotlivých pruzích. Z tohoto návrhu pak vyplynuly dvě datové struktury. První z nich je objekt TAuto, který je ale ve své podstatě pouze strukturou. Objekt TAuto má totiž pouze jednu metodu - konstruktor. Druhou datovou strukturou je prvek spojového seznamu - TJam:

obě tyto struktury jsou v unitě typy.pas
type PAuto=^TAuto;
     TAuto=object

     odkud,kam:integer;{
                        odkud kam jede auto - odkud cislovano jako hodiny
                        tedy 1,2,3,4
                        kam cislovano - 0 rovne, 1 vpravo, -1 vlevo
                        }
     color: word;      {barva auta}
     x,y: integer; {pozice auta}
     deg: real; {otceni - po smeru hodin, nula u 3}
     rychlost: integer; {pixelu za snimek}
     wait: integer; {po tom co auto muze vjet do krizovatky ceka
                    jeste na odjezd auta, kteremu davalo prednost}
     on: boolean; {zda blika ci jiz ne}

     constructor Vytvor;
end;

type PJam=^TJam;
     TJam=record
     act:  PAuto;{ukzatel na auto ve frontě}
     next: PJam;{ukzatel na dalsi auto fronty}
end;

Vlastni program tedy náhodně (v čase) generuje auta. Auta jsou ukládána na konce front. Před každým snímkem (zobrazením na obrazovce) jsou vyhodnoceny rychlosti jednotlivých aut a podle nich propočteny nové pozice aut. Po určité době (několik snímků) se změní stav na semaforech a je spočten čas další změny. K těmto několika úkolům v programu využívám mnoha procedur.

Grafický výstup:

Samostatnou kapitolou v procedurách programu je grafická interpretace. V průběhu programování bylo upuštěno od bezvadného vzhledu autíček a křižovatka se změnila v jednoduchý náčrtek. Co ale z programu nezmizelo je natočení aut a jejich trajektorie po křivkách složených z přímek a kružnice. Grafická část programu má za úkol spočtená data interpretovat procedura auto(...);. Mimo jiné se stará o obarvování semaforů set_sem(který,na_co) a samozřejmě o zobrazení křižovatky power_off;. Samotné vykreslování je řešeno s co nejmenším možným "problikáváním" a tak se na obrazovce překreslují pouze autíčka a semafory.

Propočítávání pozic aut:

Největší kapitolou v celém programu se stalo propočítávání pozic autíček. Procedurky řeší úkoly jako přednosti, zpomalování a zrychlování ve frontách, zatáčení a vypočítávaní úhlů natočení a v neposlední řadě časování. Časování hodnotím jako nejslabší část programu vhodnou k předělání.

Nejdůležitější procedurou u určování pozic jsou samotné souřadnice x a y auta. Ta jsou spočtena procedurou jed(PAuto); v závislosti na rychlosti auta. Procedura kombinuje trajektorie po přímce a po kružnici, které jsou určeny směrem auta a jeho minulou pozicí. K nové pozici navíc dopočítává úhel natočení.

Pro určení nových pozic je důležitou informací rychlost auta. Rychlost auta je závislá na rychlosti auta ve frontě před ním a pokud jede první (je první ve frontě), pak je snižována přednostmi, nebo se drží na původní nastavené hodnotě. Za křižovatkou autíčka zrychlují.
Rychlost auta prvního ve frontě má na starosti procedura vyhodnoť_rychlosti, která vyhodnocuje přednosti (při zapnutých i vypnutých semaforech). Při vyhodnocování však není brán zřetel na specielní situace (auta na hlavní mají absolutní přednost, ať už autům z vedlejší kříží směr či nikoli), tuto funkci by bylo možné do procedury přidat.
Rychlosti aut následujících ve frontách má na starosti procedura posuň_vše, která mimo jiné volá proceduru jeď pro všechna auta ve všech frontách. Rychlost následujících aut závisí na rychlosti auta jedoucího před nimi (od určité vzdálenosti se zvyšuje a při určité snižuje) a vzdálenosti od něj. Přednostmi se zabývá teprve když jeho předchůdce opustí pruh.

Časováním bylo nahrazeno několik procedur testujících zda se auta nesráží. Časováním jsem zamýšlel vyřešit průjezd samotnou křižovatkou, ale doladění není úplně optimální a dochází cca ke 4 srážkám do 4 minut běhu (hlavní příčinou je nestejná délka drah skrz křižovatku pro jednotlivá auta a jejich různá rychlost). Princip průjezdu spočívá ve vyhodnocení přednosti a při zamítnutí průjezdu je určen autu čas po jakém se může zeptat na průjezd znovu (je možné, že musí dát přednost i následujícímu autu), většina kolizí pak nastává z nepřesného určení čekací doby a přejíždění z pruhu do pruhu.

Změny semaforu

Změny na semaforech jsou realizovány grafickou funkcí set_sem a dvěma procedurami kontrolujícími čas změny a nastavující čas změny. Změna probíhá na dvě fáze: zapnutí oranžového světla, kdy ti co mohli jet dojíždí svou dráhu, pokud už najeli do křižovatky a ostatní zastavují a přepnutí do druhého režimu. Pokud součet délek front je menší než K, pak se semafory vypnou.

Nedodělky a chyby v programu

Další chyby nebyly zaznamenány.

Uživatelská část

Program je doplněn o několik uživatelských prvků, jako je přidávání aut do křižovatky, pozastavení běhu, či přepínání semaforů. Celý uživatelský manuál se zobrazí při běhu programu.

 1-4:    klávesy pro přidávání autíček do front
   p:    pozastavení běhu
   q:    ukončení běhu
   +:    přepnutí semaforu
   v:    vypnutí semaforu (trvale - nevrací se do módu zapnutí)