Využij akce až 30 % zdarma při nákupu e-learningu. Více informací. Zároveň je tento týden sleva až 80 % na e-learning týkající se C# .NET
Hledáme nového kolegu do redakce - 100% home office, 100% flexibilní pracovní doba. Více informací.
Avatar
Miroslav Jiránek:19.3.2020 23:49

Zdravím všechny. Snažím se naprogramovat simulaci křižovatky a protože je podobná úloha na mě jako začátečníka zatím dost težká, rád bych si nechal poradit od zkušenějších. Program bude psán v matlabu, ale myslím že nepotřebuji konkrétně poradit s programem, spíš navést na správnou cestu, způsob programování.

Chci docílit: Cílem úlohy by měla být křižovatka o dvou silnicích, dohromady 4 směry(viz. obrázek níže ještě není kompletní, chybí zde semafory a pro ilustraci je zde zatím jenom jedno auto). Na každé silnici bude možné max. 4 auta, dohromady tedy 16 aut, které pojedou pouze rovně(nebudou zatáčet), budou reagovat na semafor. A pro těchto 16 aut se já snažím vymyslet algoritmus, aby se automaticky vygenerovaly, a po sjetí ze silnice znovu objevily na začátku. Jak jsem už psal, program chci napsat v MATLABu a simulaci provést v GUI. Nechci pro to používat nějaký speciální toolbox, rád bych celý program napsal např objektově. Chtěl bych se tedy zeptat, jakým způsobem byste programovali auta. auto musí poznat, že svití zelená/ červená a taky musí umět stát před semaforem ve frontě aut. další otázka, jak byste auto rozpohybovali? v GUI mám modely aut uloženy jenom jako PNG. image a nevím, jestli je programově možné aby např. pro každé auto běžel v reálném čas jeden for cyklus.

 
Odpovědět
19.3.2020 23:49
Avatar
Jenkings
Redaktor
Avatar
Odpovídá na Miroslav Jiránek
Jenkings:20.3.2020 5:56

S auty můžeš hýbat tak, že budeš jen posouvat X nebo Y souřadnici (podle toho jestli auto jede svisle nebo vodorovně) toho obrázku daného auta.

Aby se ti po odjetí z obrazovky automaticky zase posunuly na začátek použiješ to, že si vezmeš šířku mapy, a zjišťuješ, jestli se už auto nenachází celým objemem mimo mapu. Postup je v podstatě stejný jak pro osu X tak Y. Jen se rozhodneš podle toho jakým směrem se auto pohybuje. v jednom směru budeš zjišťovat, jestli se ta dynamická souřadnice toho auta rovná záporné hodnotě délky auta, a ve druhém směru budeš zjišťovat, zda souřadnice je větší nebo rovna rozměru mapy plus délce auta. V případě že už je mimo mapu, nastavíš mu souřadnice zase na začčátek.

Je zbytečné běžet pro každé auto for cyklus, Stačí ti jeden časovač, který při každém ticku procykluje přes všechny auta, a na každém z nich provede update pozice. u každého auta pak můžeš mít v jeho instanci uloženou rychlost, o kolik se v každém ticku posune

Stání ve frontě můžeš pak řešit u každého auta například v nějaké té metodě které bude updatovat jeho pozici. Nejspíš budeš řešit nějaké kolize těch obélníků aut plus nějaká rezerva aby do sebe nenarazily. V případě že zjistíš, že by v příštím kroku došlo ke kolizi, tak auto v daném ticku pohyb neprovede.

Stání na semaforu by se dalo řešit tak, že víš na jaké souřadnici je semafor. Když danou souřadnicí bude dané auto přojíždět, při jeho updatu pozice se podíváš, v jakém stavu je semafor, a podle toho se zase rozhodneš, jestli jet dál, nebo zastavit.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět
20.3.2020 5:56
Největší časovou náročnost má výpočet časové náročnosti..
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.3.2020 9:39
auta_list = array()
auta_list[0] = new auto(x,y,rychlost, uhel, silnice)
detekceKolize(objekt1, objekt2)
objekt1 je napr auta_list[3]
objekt2 je kazdy objekt v auta_list, krome auta_list[3]

A nebude snadne takove kolize resit, pokud nepujde o natoceni 90 stupnu.

semafory_list = array()
semafory_list[0] = new semafor (x,y, typ, stav, time)
typ = chodci / auta
funkce pro prepinani:
time 0 az 10: stav = zelena
time 11 az 13: stav = oranzova
time 15 az 30: stav = cervena
time 30 az 33: stav = oranzova
Cili, mozna by bylo uzitecne, pri vytvareni semaforu rovnou zadat mezni hodnoty se stavy a funkce pak budou resit posun stavu cyklem. mozna pro jednoduchos si to zapsat jako mapu:

[0, 0, 0, 0 ... (10x zelena), 1, 1, 1 (oranzova), 2 (15x cervena), 1,1,1] druhy semafor
[0, 0, 0, 0 ... (10x zelena), 1, 1, 1 (oranzova), 2 (15x cervena), 1,1,1] treti semafor
[2, 2, 2, 2 ... (15x zelena), 1, 1, 1 (oranzova), 0 (15x zelena), 1,1,1] ...

a zapsat pak jen aktualni stav. Nebo poctem opakovani

[ [0, 10], [1, 3], ... ] // ale ta mapa predtim je prehlednejsi pro editaci.

No a dal, cely program bezi treba pod casovacem, ktery vykonava 10 kroku a pak prepne semafor do dalsiho stavu a zas 10 kroku, kdy se hybou auta.
Auto, podle toho, na jake je silnici, bere stav semaforu nebo jej ignoruje a projizdi dal krizovatkou.
Cili, krome kolize s jinym autem sledujes i kolizi se silnici, usekem silnice. Bud je ve smeru do semaforu nebo za semaforem.

 
Nahoru Odpovědět
20.3.2020 9:39
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.