1. Vyhodnocovanie polohy agenta
Výpočet polohy agenta prebieha v triede AgentPositionCalculator. Výpočet polohy pozostáva z nasledujúcich krokov:
-
-
-
-
-
Výpočet polohy agenta
Aktualizácia polohy
-
2. Vyhodnotenie polohy na základe jednej čiary
Z posledných 10-tich polôh sa vyhodnotí, v ktorej časti ihriska sa agent nachádza. Pri vyhodnotení sa ignoruje stredový kruh (t.j. uvažujú sa iba časti 1-4). Vyhodnotenie časti prebieha hlasovaním – každý záznam má vplyv na určenie podľa typu, akým bola daná poloha vyhodnotená. Celkové skóre pre danú časť ihriska je súčet typov vyhodnotení polohy agenta pre danú časť ihriska.
Identifikujú sa koncové body čiary – ktorý bod je naľavo (phi je väčšie) a ktorý bod je napravo (phi je menšie) od agenta.
Oba koncové body čiary sa otočia v závislosti od aktuálneho natočenia agenta.
Ak je rozdiel medzi y-ovými súradnicami bodov po natočení väčší ako rozdiel medzi x-ovými – agent vidí horizontálnu čiaru (pohľad zhora na ihrisko, pričom bránky sú na ľavej a pravej strane)
Inak vidí vertikálnu čiaru
Na základe predchádzajúcich pravidiel, súradníc bodov a časti ihriska, kde sa pravdepodobne nachádza, sa vytvorí čiara, kde by sa mohol agent nachádzať.
Od poslednej známej polohy (posledný záznam v histórii) sa vytvorí kružnica s polomerom rovným accDistance z poslednej položky v histórii.
Výpočet priesečníka kružnice s úsečkou.
Ak je jeden priesečník – nastaví sa daný bod ako miesto, kde sa nachádza agent
Inak sa vytvorí nová čiara z posledných dvoch záznamov v histórii. Vypočíta sa priesečník tejto čiary a čiary, kde by sa agent mohol nachádzať.
Ak neexistoval priesečník s kružnicou – priesečník dvoch čiar sa nastaví ako poloha, kde by sa mal agent nachádzať
Inak sa nastaví priesečník kružnice, ktorý je bližšie k priesečníku dvoch čiar
3. Mapovanie čiar
Cieľom mapovania čiar je vytvoriť dvojicu: Relatívna_pozícia_bodu, Absolútna_pozícia_bodu (MappedPoint). Alebo inak povedané, pre relatívne súradnice bodov čiar (prijaté zo servera), na základe vlastností čiar a histórie, určiť reálnu polohu týchto bodov na ihrisku.
3.1. Agent vidí aj kontrolny bod
Mapovanie čiar ak agent vidí jeden kontrolný bod prebieha vo funkcii oneFixedObjectSeen(ParsedData)
3.1.1. Vlajky
Ak agent vidí vlajku, pravdepodobne vidí aj ďalšie (minimálne) dve čiary.
Zistenie či čiara, ktorú agent vidí ma spoločný bod z vlajkou (vzor čiar „čiara a bod“) Informácia o tom že daná čiara má spoločný bod nepostačuje na určenie o ktorú čiaru sa jedná (môžu byť dve).
Ak agent vidí F1R – „horizontálnu čiaru“, vidí druhý bod čiary pod väčším uhlom theta (theta 1) ako „vertikálnu čiaru“ (theta 2).
Uhly theta1 a theta2 sú theta uhly ku koncovým bodom čiary.
- Ak agent vidí F1R a theta1 > theta2, potom bod, ktorý agent vidí pod uhlom theta1, je bodom z „horizontálnej čiary“ a theta2 je bodom z vertikálnej čiary.
- Ak agent vidí F2R a theta1 > theta2, potom bod, ktorý agent vidí pod uhlom theta1, je bodom z „vertikálnej čiary“ a theta2 je bodom z „horizontálnej čiary“.
- Ak agent vidí F1L a theta1 > theta2, potom bod, ktorý agent vidí pod uhlom theta1, je bodom z „vertikálnej čiary“ a theta2 je bodom z „horizontálnej čiary“.
- Ak agent vidí F2L a theta1 > theta2, potom bod, ktorý agent vidí pod uhlom theta1, je bodom z „horizontálnej čiary“ a theta2 je bodom z „vertikálnej čiary“.
Výpočet dĺžky videnej časti čiary.
Odpočítanie/pripočítanie dĺžky čiary k súradnici kontrolného bodu v závislosti od čiary a vlajky.
3.1.2. Bránky
Zistenie, či čiara, ktorú agent vidí, je koncová „vertikálna čiara“ ihriska.
Výpočet vzdialeností od priemetu bodu ku koncom čiary, ktoré vidí agent.
Výpočet absolútnych súradníc bodov – pripočítanie / odpočítanie vzdialenosti od y-ovej súradnice bránkového bodu v závislosti od uhla, pod akým agent vidí daný bod.
3.2. Agent vidí iba čiary - justLineSeen
Mapovanie čiar, ak agent vidí iba čiary prebieha vo funkcii justLinesSeen (ParsedData).
Cieľom je identifikovať priesečníky medzi nimi a pomocou funkcií určujúcich vzor čiar zistiť, o ktorý bod na ihrisku sa jedná a na základe toho mu priradiť kombináciu relatívnych a absolútnych súradníc. Podľa týchto bodov (namapovaných aj inými funkciami) potom hráč určuje svoju polohu.
Logika:
hľadanie dvojíc čiar, ktoré sa pretínajú
ak sa nájde zhoda, hľadanie končí a čiary sa uložia
získanie súradníc priesečníka
zistenie, v ktorej časti ihriska sa hráč nachádza
porovnávanie so vzormi čiar, na ktoré môže v rámci funkcie naraziť (ostatné prípady budú obslúžené ostatnými funkciami)
zavolanie funkcií na zisťovanie vzorov (napr. isT(), isPlus()…)
podľa toho, v ktorej časti ihriska sa nachádza hráč, zistenie, o ktorý bod ide
ak sa hráč nachádza v hornej/dolnej časti a relatívna súradnica Y je menšia ako Y vzdialenosť daného bodu od stredu ihriska, bod sa nachádza v rovnakej polovici
ak je relatívna súradnica Y väčšia ako Y vzdialenosť daného bodu od stredu ihriska, bod sa nachádza v opačnej polovici
logika keď sa hráč nachádza presne medzi dvoma bodmi (podľa osi Y) ešte nie je implementovaná
vytvorenie namapovaného objektu bodu s relatívnymi a absolútnymi súradnicami a pridanie do výsledného poľa
Na otestovanie metódy justLineSeen() bol vytvorený unit test AgentPositionCalculatorTest, pomocou ktorého bola implementácia prvotne otestovaná. Taktiež môže byť použitý pri ďalšom testovaní s použitím iných kombinácií čiar resp. vzorov.
sk.fiit.jim.agent.models.AgentPositionCalculator.MappedPoint
Typ: private static
Premenné:
Vector3D absolute
Vector3D relative
Trieda uchováva informácie o namapovaných bodoch - tj, relatívnu polohu bodu (ako ho agent vidí) a absolútnu polohu bodu (kde na ihrisku sa daný bod nachádza)
4. Zisťovanie polohy hráča na základe rozpoznávania tvarov čiar
Našim hlavným cieľom bolo vytvorenie taktiky, ktorá sa použije na účely testovania predošle implementovaných funkcií na zisťovanie polohy hráča na základe rozpoznávania tvarov čiar, konkrétne metódu AgentPositionCalculator.justLinesSeen(). Toto testovanie by malo prebiehať za normálneho behu hry, kde výsledky rozpoznávania tvarov budú vypísané do logov.
Hlavným ťažiskom je vytvorenie triedy PositionTestTactic, ktorá obsahuje otočenie hráča o 90° v smere v závislosti od toho, na ktorej polovici sa nachádza. Keď je hráč v hornej polovici ihriska, otočí sa doľava, aby videl iba požadovaný bod. Po otočení zostane stáť bez pohybu. Takisto aby bolo logovanie rozpoznávania prehľadnejšie, bol vytvorený nový level logovania POINTS, ktorý sa dá zapnúť cez GUI ako ostatné levely.
Použitie
Pre nastavenie taktiky je potrebné v súbore settings.properties nastaviť propertu DEBUG_TACTIC_NAME. Taktika sa dá použiť v spojení nastavovania štartovacej pozície hráča (možné iba na začiatku hry a v polčase) v triede MatchStarterTactic, kde sa dajú nastaviť v metóde runBeam() súradnice hráča (s id 1). To sa dá použiť na postavenie hráča na ľubovoľnú pozíciu v rámci polovice ihriska jeho tímu. Keď sa hráč postaví do tesnej blízkosti bodu a otočí sa, mal by vidieť iba tento bod a v tom prípade sa pustí výpočet pozície na základe rozpoznávania tvarov čiar.
Zhodnotenie
Pomocou implementovanej taktiky by malo byť jednoduchšie otestovať rozpoznávacie techniky vytvorené v predošlých šprintoch. Možno budú potrebné ešte ďalšie zmeny pre identifikovanie ostatných bodov, takže taktika sa počas testovania bude pravdepodobne meniť.