Táto trieda sa stará o aktualizovanie polohy agenta. Volá sa v triede „AgentModel“ pri každej novej správe zo serveru. Volá sa v metóde „processNewServerMessage“ a ako vstupný parameter dostáva „data“ typu „ParsedData“.
Metóda slúži na nastavenie agentovej pozície. Ak agent nevidí žiadne fixné objekty, tak sa metóda ukončí. Inak sa prechádzajú všetky „flagy“ a následne podľa toho sa určí pozícia. V tejto metóde sa dá použiť aj regresia, ktorá využíva aj minulé pozície agenta.
Exception - Size 0
Nakoľko bola identifikovaná exception v triede AgentPositionCalculator keď funkcia dostala veľkosť 0, bola implementovaná podmienka v metóde updatePosition tak, že ak je veľkosť polohy 0, tak sa neupdatne poloha, updatne sa až po ďalšej zmene.
Po implementácii bol Agent viackrát otestovaný. Po zavolaní danej metódy agent pokračoval v hre a metóda už nehodila exception. Na správanie agenta implementácia metóda nemá výrazný vplyv.
Testovací scenár:
Táto metóda slúži na vypočítanie regresie. Regresia sa ráta v dvoch krokoch samostatne pre x-ovú súradnicu a následne pre y-ovú súradnicu.
1. krok:
Inicializacia:
Počítanie:
2. krok:
To iste sa vyráta aj pre y-ovú súradnicu a následne sa agentovi nastaví pozícia s vyrátanými parametrami.
Princíp regresie: regresia slúži na predpovedanie ďalšej hodnoty, ktorá je úzko spätá s predchádzajúcimi hodnotami. To znamená, ak mám nejaký zoznam hodnôt, určí sa priemer týchto hodnôt a ďalšia hodnota sa vyráta z priemernej hodnoty. Rátanie je rozdelené do menších štvorcov a snažíme sa v konečnom dôsledku dostať „nejakú priamku“ – trajektóriu pohybu hráča.
Odkazy:
https://en.wikipedia.org/wiki/Coefficient_of_determination
http://www.ujfi.fei.stuba.sk/fyzika/navody/regresia-dodatok_20101022.pdf
Trieda je (aspoň by mala byť) určená na výpočet otočenia agenta na základe pevných bodov. Rotácia sa počíta na základe troch bodov.
Vytvorí objekt a nastaví hodnotu konštanty agent na predaný parameter.
Táto metóda aktualizuje rotáciu agenta v aktuálnom AgentModel na základe dát zo servera.Rotácia sa vykoná, ak z jednej strany (sameSideFlags) agent vidi minimálne 3 vlajky. Vytvoria sa a naplnia sa 2 zoznamy pozícií vlajok (globálnych a vnímaných agentom), a pošlú sa ako argument do následne zavolanej metóde calculateRotation.
Funkcia vracia vlajky zo strany, na ktorej je ich viac. Vlajky sú rozdelené do dvoch strán („our“ – ľavá strana ihriska/ záporná x-ová súradnica a their – pravá strana ihriska / kladná x-ová súradnica). Ak agent vidí menej ako FLAGS_TO_COMPUTE_ROTATION (3) bodov, vráti sa prázdna mapa, inak sa vráti mapa s hodnotami strany, kde je viac videných bodov. Kľúčom je opäť reálna pozícia vlajky.
Vypočíta rotáciu agenta na základe 3 vlajok, ktoré vidí agent. Usporiadajú sa hodnoty absolútnych pozícii vlajok pomocou metódy orderToFormAxes(absolute).
Hodnoty y1,y2 a z1 sa nastavia na základe zoradenia pomocou metódy orderToFormAxes
y1,y2 sa používajú na vytvorenie Y-ovej osí
z1, z2 sa používajú na vytvorenie Z-ovej osí
double rotationX - natočenie agenta v závislosti od osi X
double rotationY - natočenie agenta v závislosti od osi Y
double rotationZ - natočenie agenta v závislosti od osi Z
Uhol rotácie musí patriť intervalu (0, 2π), čo sa dosahuje pomocou metódy normalize.
Metóda vracia pole troch hodnôt. Určí, ktoré dva body sa použijú na vytvorenie y-ovej (nultá a prvá hodnota poľa) osi a ktorý bod bude použitý na vytvorenie z-tovej osy (kolmej na y-ovú).
* Podmienky sa vyhodnocujú v poradí, v akom sú uvedené (zhora na dol), vracia sa prvá zhoda.
Mapovanie hodnôt (objektov) FixedObject na kontrolne body ihriska
Metódy, ktoré vytvoria mapu kontrolných bodov so súradnicami v závislosti od verzie serveru (volanej funkcie)
Mapovanie správ zo servera (s-výrazov) na objekty typu FixedObject
Vráti objekt požadovaného kontrolného bodu.
Trieda je určená na uchovávanie informácii získaných zo správ zo servera.
Táto trieda poskytuje funkcie na prácu s uhlami. Reprezentuje interval medzi 2 uhlami. Tie sú pôvodne v radiánoch, no dajú sa previesť na stupne pomocou metódy setDegree(). Obsahuje 2 konštruktory, jeden prázdny a jeden s parametrami double from a double to, ktorý priradí lokálnym rovnomenným premenným hodnoty uhlov v stupňoch.
Analýza možných zlepšení
V tejto triede sa nevykonávajú žiadne výpočty okrem prevádzania uhlov v stupňoch na radiány, normalizujú sa uhly, prípadne sa počítajú rozdiely medzi uhlami. V rámci optimalizácie som nenašiel nič čo by mohlo vylepšiť časovú zložitosť.
Táto metóda priradí lokálnym rovnomenným premenným hodnoty uhlov v radiánoch.
Táto metóda priradí lokálnym rovnomenným premenným hodnoty uhlov v stupňoch.
Použitý matematický výpočet: uholvstupňoch=uholvradiánoch/ 180 * π
Táto metóda vráti hodnotu true, ak sa vstupný parameter nachádza v intervale (from, to). Ak nie, vráti hodnotu false.
Táto metóda vráti menšiu hodnotu z normalizovaných rozdielov (z intervalu <0; 2π>) vstupných parametrov v radiánoch.
Táto metóda vráti menšiu hodnotu z normalizovaných rozdielov vstupných parametrov v stupňoch.
Táto metóda vráti uhol v normalizovanej forme, t.j. v intervale <0; 2π>. Ak je vstupný uhol už v tomto intervale, tak sa vráti nezmenený. Ak nie, vypočíta sa takýmto spôsobom:
closest = angle - (2π * (angle / 2π))Ak je vypočítaná hodnota menšia ako nula, pripočíta sa k nej hodnota 2π a vráti sa. Ak nie je, tak sa rovno vráti.
Táto trieda reprezentuje kruh ako matematický 2D útvar. Obsahuje 2 konštruktory, jeden bez parametrov, ktorý vytvorí kruh so stredom so súradnicami [0;0] a polomerom 0. Druhý, s parametrami Point2D center, double radius vytvorí kruh ako objekt s danými parametrami.
Analýza možných zlepšení
V tejto triede neprebiehajú žiadne výpočty, iba sa nastavuje kruh pomocou stredu a polomeru, a tieto hodnoty sa pomocou get metód dajú naspať získať. Nie je tu nič na optimalizáciu.
Metóda vráti stred kruhu.
Metóda vráti polomer kruhu.
Metóda preťažuje klasickú metódu toString vo formáte “Circle [center=” center “, radius=” radius “]”, kde center je stred kruhu a radius je jeho polomer.
Táto trieda reprezentuje čiaru ako matematický 2D útvar. Obsahuje 2 konštruktory, kde na vytvorenie čiary použijeme buď 2 body (ich x a y súradnice), alebo 1 bod a smerový vektor. Sú tu použité základné matematické výpočty pre výpočet smerového vektoru a normálového vektoru a nakoniec aj samotných koeficientov a, b a c.
Analýza možných zlepšení
V tejto triede sa na základe dvoch bodov alebo jedného bodu a smerového vektoru dopočíta normálový vektor, smerový vektor alebo druhý bod a rovnica čiary ax+ by + c = 0. Čo sa týka výpočtov prebieha tu ešte počítanie prieniku čiary a inej čiary, a taktiež čiary a kružnice. Avšak ani tu som nenašiel priestor na optimalizáciu
Metóda vráti normálový vektor ako 2D bod.
Metóda vráti výsledok rovnice a*x b*yc.
Metóda vráti zoznam bodov danej priamky, ktoré pretínajú kruh zo vstupného parametru. Najprv sa vypočíta euklidovská vzdialenosť medzi 2 bodmi čiary ako odmocnina zo súčtu druhých mocnín ich rozdielov x a y súradníc. Matematicky je to vyjadrené takto:
Následne sa vypočíta smerový vektor D z bodu A do bodu B.
Potom sa počíta t, čo je najbližší bod čiary od stredu kruhu, vypočíta sa takto:
Takto sa môže vypočítať bod E, ktorý leží na čiare a je najbližšie ku kruhu.
Ďalej sa vypočíta euklidovská vzdialenosť LEC bodu E od kruhu (podobne ako pri LAB). Ak je táto vzdialenosť menšia ako polomer kruhu, tak sa vypočítajú 2 priesečníky čiary s kruhom. Najprv sa vypočíta dt, čo je (euklidovská) vzdialenosť t od prieniku čiary a kruhu. Potom sa počítajú spomínané priesečníky F a G.
Nakoniec sa tieto 2 body pridajú do zoznamu, ktorý sa vráti. Ak vzdialenosť nebola menšia ako polomer kruhu, ale rovná, tým pádom je čiara dotyčnica ku kruhu a vráti sa zoznam obsahujúci len bod E. V iných prípadoch sa vráti prázdny zoznam.
Metóda preťažuje klasickú metódu toString vo formáte “ Line2D [x1=” x1 “, y1=” y1 “, x2=” x2 “, y2=” y2 “, a=” a “, b=” b “, c=” c “, nx=” nx “, ny=” ny “, kx=” kx “, ky=” ky “]”, kde sa využívajú lokálne premenné popísané v časti 1.3.
V triede sa nachádzajú metódy pre prístup ku všetkým lokálnym premenným (x1, y1, x2, y2, a, b, c, nx, ny, kx, ky).
Táto trieda slúži na počítanie najmenšieho ohraničujúceho kruhu (angl. Minimal Enclosing Circle) z daných bodov.
Analýza možných zlepšení
V tejto triede sa počíta minimálna kružnica, ktorá obsahuje všetky body vstupného listu. Počíta sa pre 1, 2 alebo 3 body. Testovaním som zistil, že táto trieda sa zrejme vôbec nepoužíva.
Táto metóda vráti zo zoznamu bodov najmenší ohraničujúci kruh. Volanie tejto metódy podnecuje volanie pomocnej rekurzívnej metódy minCircle, ktorá je opísaná nižšie.
Táto metóda slúži na výpočet stredu a polomeru najmenšej kružnice, ktorá obsahuje body zo vstupného poľa bodov. Pri volaní z predchádzajúcej metódy minEnclosingCircle sa zavolá 4x, až sa v poslednom volaní zavolá metóda findCenterRadius s 3 bodmi tvoriacimi najmenší obklopujúci kruh.
Táto metóda na základe vstupných 3 bodov tvoriacich kruh vypočíta jeho stred a polomer. To sa počíta takto:
Stred kruhu má teda tieto súradnice x a y. Polomer kruhu sa vypočíta ako (euklidovská) vzdialenosť jedného bodu z kružnice od stredu, tu sa používa bod p1. Nakoniec sa vráti kruh so známym stredom aj polomerom.
Táto trieda reprezentuje bod s dvoma súradnicami. Obsahuje konštruktor, ktorý ma 2 parametre, konkrétne double x a double y. Trieda obsahuje základné funkcie get a set pre vyššie spomínané premenné.
Analýza možných zlepšení
V tejto triede je reprezentovaný 2D bod. Výpočty ktoré prebiehajú sú interpolácia medzi 2 bodmi,a zisťovanie vzdialeností dvoch bodov. Nenašiel som priestor na optimalizáciu.
Point2D from – začiatočný bod, Point2D to – koncový bod, double timelinePosition – premenná na posunutie
Táto metóda interpoluje dva body, teda zisťuje v podstate, kam sa posunie bod v určenom smere.
Táto metóda zisťuje vzdialenosť medzi prvým a druhým bodom, pričom prvý bod je definovaný globálne (aké ma súradnice??).
Metóda preťažuje klasickú metódu toString vo formáte “ Vector2 [x=” x “, y=” y “]”.
V tejto triede jediné výpočty ktoré prebiehajú sú jednoduché if-y (zisťovanie či je uhol v rozmedzí -58 až 58), počítanie vzdialeností medzi dvoma vektormi (čiarami). Nenašiel som priestor na optimalizáciu.
Táto trieda reprezentuje bod s troma súradnicami. Obsahuje konštruktor, ktorý ma 3 parametre, konkrétne double x, double y a double z. Trieda obsahuje základné funkcie get a set pre vyššie spomínané premenné.
Analýza možných zlepšení
V tejto triede nie sú žiadne výpočty, iba konštruktor na vytvorenie 3D bodu a metódy get na získanie jednotlivých súradníc.
Metóda preťažuje klasickú metódu toString vo formáte “ %1$.4f %2$.4f %3$.4f”, x, y, z“.
Táto trieda reprezentuje 2D vektor a definuje možné operácie s nimi. Obsahuje jeden prázdny konštruktor, jeden konštruktor s 2 vstupnými parametrami – double x, double y a jeden konštruktor s dvojicou súradníc. Trieda obsahuje základné funkcie get a set pre vyššie spomínané premenné.
Analýza možných zlepšení
V tejto triede je reprezentovaný dvojrozmerný vektor, prebiehajú tu výpočty veľkosti uhla medzi dvoma vektormi a zisťovanie či sú dva vektory totožné (je tu miera 0.01 v rozdiely hodnôt x aj y).
Metóda vráti uhol, ktorý zvierajú 2 vektory, prostredníctvom príslušnej matematickej operácie.
Metóda porovná vstupný objekt s vektorom, pričom vráti true ak je identický alebo zhodný len s malou odchýlkou (0,01). V iných prípadoch vráti false.
Táto trieda reprezentuje 3D vektor a definuje možné operácie s nimi. Obsahuje jeden prázdny konštruktor, pričom je povedané, že vytvárať 3D vektor je možné len cez jednu z metód a nie priamo cez konštruktor. Trieda obsahuje základné metódy get a set pre vyššie spomínané premenné.
Analýza možných zlepšení
V tejto triede sa nachádzajú 2 metódy, ktoré podľa yourkitu zaberajú významný čas počas behu programu.
caretsian(double,double,double) calculateSpherical()
V metóde cartesian(double,double,double) sú len jednoduché priradenia (vytvorenie nového vektoru a naplnenie hodnotami) a volanie metódy calculateSpherical(). V metóde calculateSpherical sa z karteziánskych súradníc x,y,z počítajú uhly theta a phi, ktoré sa následne normalizujú.
Takže ani v tejto triede som nenašiel priestor na optimalizáciu.
Táto metóda vytvorí 3D vektor zo vstupného 2D bodu a tretej súradnice z, reprezentujúcej tretiu súradnicu v priestore.
Táto metóda vytvorí 3D vektor zo vstupných súradníc v priestore, pomocou prepočtu karteziánskych súradníc na sférické.
Táto metóda vypočíta sférické súradnice z karteziánskych súradníc.
Táto metóda vypočíta karteziánske súradnice zo sférických súradníc.
Tieto metódy pripočítavajú dĺžku ku konkrétnym reprezentáciám (karteziánska/sférická) súradníc, resp. pripočítanie celého vektora.
Táto metóda odčíta vstupný vektor od globálne definovaného vektora a vráti výsledný vektor.
Táto metóda vynásobí súradnice vstupného vektoru a súradnice globálne definovaného vektora a vráti výsledný vektor.
Táto metóda vydelí súradnice vstupného vektoru a súradnice globálne definovaného vektora a vráti výsledný vektor.
Táto metóda otočí globálne definovaný vektor do opačného smeru a vráti výsledný vektor.
Táto metóda vráti vektor dĺžky 1.
Tieto metódy vracajú vektory, ktoré boli otočené okolo konkrétnej súradnicovej osi.
Táto metóda vracia vektorový súčin 2 vektorov vo výslednom vektore.
Táto metóda vracia skalárny súčin 2 vektorov vo výslednom vektore.
Táto metóda vráti definovaný vektor ako (počiatočný) bod s 3 súradnicami.
Táto metóda vráti vzdialenosť vstupného vektora od definovaného vektora.
Metóda preťažuje klasickú metódu toString vo formáte ” “x, y, z: [%.2f, %.2f, %.2f] r, phi, theta: [%.2f, %.2f, %.2f]”, x, y, z, r, phi, theta“.
Metóda porovná vstupný objekt s vektorom, pričom vráti true, ak je identický alebo zhodný len s malou odchýlkou (0,01). V iných prípadoch vráti false.
Metóda vráti normálový vektor.
Metóda vráti vektor, ktorý je otočený okolo vstupného vektora axis vo vstupnom uhle angleInRad.
Metóda vráti vektor, pričom vynuluje jeho z-ovú (priestorovú) súradnicu.
Kalmanov filter je algoritmus, ktorý z dát zaťaženými nepresnosťami a šumom, odhaduje neznáme hodnoty premenných. Využíva k tomu nielen naposledy namerané dáta a model systému, ale tiež vektor údajov o predchádzajúcom stave systému. Kalmanov filter je široko využívaný pre spracovanie signálov, navigáciu a iné úlohy.
Kalmanov filter hľadá optimálny faktor zmeny pre nasledujúci stav meranej veličiny. Vychádza sa z predpokladu, že nevieme presne veličinu zmerať ani odhadnúť so 100% istotou. Predpoklad je mať buď linearizovaný model správania, alebo v pokročilej verzii algoritmu sa meraný model linearizuje. Do úvahy sa berú tiež predchádzajúce stavy a ich odhady.
podrobnejšie info tu:
http://bilgin.esme.org/BitsAndBytes/KalmanFilterforDummies
https://www.cl.cam.ac.uk/~rmf25/papers/Understanding%20the%20Basis%20of%20the%20Kalman%20Filter.pdf
Kalman filter tracing a single observable variable
Metóda pre update pôvodnej hodnoty zo správy pomocou Kalmanovho algoritmu. Q a R sú konštanty pre filter sa berú z sk.fiit.jim.Settings a tie sa získavajú v praxi len experimentom.
Trieda pre 3D vektor miesto jedného bodu/hodnoty. Metóda update() spracováva 3 súradnice.
Metóda pre optimalizáciu 3D vektora pomocou Kalmanovho filtra. Aktualizujú sa hodnoty postupne pre x, y a z súradnice a vracia sa výsledný 3D vektor.
Trieda upravuje sledované koordináty lopty a zástaviek agentom pomocou Kalmanovho filtra
Snaha je znížiť zašumenie týmto spôsobom pred ďalšími výpočtami. V projekte je implementovaný ako observer KalmanAdjuster, ktorý je naviazaný na prijatú správu zo servera. Implementované je to spôsobom, že sa automaticky optimalizuje/odhaduje poloha lopty a pevné rohy ihriska – vlajky.
Public metóda pre spracovania dát z novej správy zo servera. Spúšťa sa optimalizácia zašumenia polohy lopty na ihrisku a poloha rohových bodov.
Aplikuje Kalmanov filter pre polohu lopty, ak jej posledná videná poloha je staršia než 250ms. Výsledná hodnota sa ukladá späť do správy zo servera.
Aplikuje Kalmanov filter pre pevný bod na mape. Vstupný parameter je hash mapa objektov typu ihrisková vlajka a vektor 3D súradníc ich polohy. Spracované hodnoty sa vracajú späť do spracovanej správy zo servera.
Konštanty pre filter sa berú z sk.fiit.jim.Settings a vracia objekt KalmanForVector().
Metóda vracajúca true, ak je spracovaná správa zo servera staršia než 250ms. Porovnáva sa čas when s aktuálnym časom simulácie.
Transformuje matematický výraz vo formáte reťazca do číselného výsledku
Príkald: new{@link MathExpressionEvaluator}(“7+5”).getInt() == 12
Vracia integer hodnotu reťazce expression. Vychádza z návratovej hodnoty getDouble(), ktorú pretypuje.
Vyhodnocuje reťazec expression ako double hodnotu.
Trieda reprezentujúca operácie na transformáciu trojrozmernej projekcie. Využíva sa to v TestFrameworku pri vykresľovaní viacerých komponentov na 2D plochu.
Preťažená metóda toString(), ktorá upravuje výstupný formát double čísel do [ ] a na pevný počet miest.
Porovnávanie dvoch matíc medzi sebou, vracia true, ak sú matice zhodné, inak vracia false.
Násobenie dvoch báz ( matíc ) a vracia novú vypočítanú maticu.
Výpočet posunu ako 3D vektor.
Výpočet rotácie ako 3D vektor.