Table of Contents

1. Vzory Čiar na Ihrisku

sk.fiit.jim.agent.models.LinePatternRecognition

Obrázok1: Vzory čiar na ihrisku


LinePatternRecognition

Typ triedy: public abstract

Trieda zoskupuje funkcie na rozpoznávanie vzorov na ihrisku.

isIntersection

Typ: public static

Návratová hodnota: boolean

Parametre:
ParsedLineWithFlags line1
ParsedLineWithFlags line2

Funkcia zistí, či čiary predané ako parametre majú spoločný priesečník (T alebo +).

Boli implementované 2 metódy v triede LinePatternRecognition, metóda isIntersection() a getSegmentIntersect().

public static boolean isIntersection(ParsedLineWithFlags, ParsedLineWithFlags)
V tejto metóde sa najskôr zistí, či dané úsečky, ktoré prídu ako parameter (v tvare x1, y1, x2, y2) majú priesečník a to pomocou vstavanej metódy intersectsLine() triedy Line2D (java.awt trieda). Ak úsečky majú priesečník, pomocou metódy getSegmentIntersect() sa vypočítajú jeho súradnice a následne sa zisťuje, či nejde o úsečky tvoriace roh. To sa vyhodnocuje na základe porovnania súradníc priesečníka a jednotlivých bodov obidvoch úsečiek. Metóda má návratovú hodnotu typu boolean, ktorá nadobúda hodnoty podľa toho, či majú úsečky priesečník a či sa jedná o roh.


public static Point2D getSegmentIntersect(java.awt.geom.Line2D, java.awt.geom.Line2D)
Pomocou tejto metódy sa vypočítajú súradnice priesečníka dvoch úsečiek metódou na základe vektorového súčinu. Metóda vracia priesečník reprezentovaný triedou Point2D, v ktorej sú jeho súradnice x a y. Ak dané úsečky priesečník nemajú, metóda vráti null.

Testovanie

Základné testovanie vypracovaných metód sa nachádza v triede LinePatternRecognitionTest, kde sa už nachádzajú testy ostatných existujúcich metód modifikovanej triedy. Pre účely testovania nových metód sú v teste vytvorené nové objekty čiar, ktoré sa buď nepretínajú, alebo tvoria priesečník v tvare +, T alebo roh. Správnosť výsledku metódy je potom skontrolovaná porovnaním s očakávanou hodnotou. Príklad volania:

assertEquals(false, isIntersection(lines.get(6), lines.get(7)));

Pre potreby testovania bola takisto pozmenená trieda Vector3D, v ktorej sa nenachádzali settery pre súradnice, napr. setX().

Záver
Pomocou implementovanej metódy isIntersection() je možné zistiť, či dve úsečky majú priesečník tvaru, ktorý je pre vyhodnotenie polohy hráča relevantný a teda je možné ju použiť na zlepšenie orientácie hráča na ihrisku. Pomocná metóda getSegmentIntersect(), ktorá bola implementovaná pre potreby úlohy sa dá použiť aj v iných implementáciách pre získanie priesečníka dvoch úsečiek (metóda na získanie priesečníka dvoch priamok sa už v kóde nachádza).

getSegmentIntersection

Typ: public static

Návratová hodnota: Point2D

Parametre:
Line2D lineSegment1
Line2D lineSegment2

Pomocou tejto metódy sa vypočítajú súradnice priesečníka dvoch úsečiek metódou na základe vektorového súčinu. Metóda vracia priesečník reprezentovaný triedou Point2D, v ktorej sú jeho súradnice x a y. Ak dané úsečky priesečník nemajú, metóda vráti null.

squareDistance

Typ: private static

Návratová hodnota: double

Parametre:
Vector3D a
Vector3D b

Vypočíta druhú mocninu vzdialenosti medzi bodmi.

isSamePoint

Typ: public static

Návratová hodnota: boolean

Parametre:
Vector3D a
Vector3D b

Zistí, či by body predané ako parameter mohli reprezentovať jeden bod. Najskôr sa vypočíta maximálna možná vzdialenosť od jedného bodu, do akej by sa mal nachádzať druhý bod, aby bolo možné povedať, že sa jedná o jeden a ten istý bod. Maximálna vzdialenosť je vzdialenosť medzi bodom a tým istým bodom otočeným o 4 stupne v oboch smeroch (horizontálne aj vertikálne), t.j. medzi bodom a = (r, phi, theta) a‘ = (r, phi + 4°, theta + 4°). 4° je maximálny možný rozdiel medzi bodmi (šum je z intervalu ).

haveSamePoint

Typ: public static

Návratová hodnota: byte

Parametre:
Vector3D point
ParsedLineWithFlags line

Vzor: „Vlajka a čiara“

Zistí, ktorý z bodov čiary môže byť totožný z bodom predaným ako argument.

Vráti:

V prípade, ak oba body sa nachádzajú v tolerovanej vzdialenosti šumu, za totožný bod sa považuje bod čiary, ktorý je bližšie k danému bodu.
Bod čiary musí byť koncovým bodom danej čiary.

haveSamePoint

Typ: public static

Návratová hodnota: byte

Parametre:
ParsedLineWithFlags line1
ParsedLineWithFlags line2

Funkcia zistí, či dve čiary majú spoločný bod.

Vráti:

isCorner

Typ: public static

Návratová hodnota: byte

Parametre:
ParsedLineWithFlags line1
ParsedLineWithFlags line2

Vzor:„roh“
Funkcia zistí, či čiary predané ako parametre predstavujú roh.

Vráti:

areCircleLines

Typ: public static

Návratová hodnota: byte

Parametre:
ParsedLineWithFlags line1
ParsedLineWithFlags line2

Vzor:„časť kruhu“
Funkcia zistí, či čiary predané ako parametre predstavujú roh.

Vráti:

Poznámka:ak dve čiary majú spoločný koncový bod – môže sa jednať buď o roh alebo o časť kruhu. Pri rohu zvierajú čiary 90° uhol, pri časti kruhu to je 144°, ak je uhol menší ako 117° (v polovici medzi 90 a 144) → jedná sa o roh, inak ak je väčší ako 117° jedná sa o časť kruhu. 27° rozdiel je tolerancia spôsobená zašumením informácii o čiarach.

isT

Typ: public static

Návratová hodnota: byte

Parametre:
ParsedLineWithFlags line1
ParsedLineWithFlags line2

Vzor: „T“
Zistí, či je medzi čiarami „T“ priesečník.

Riešenie:

1. Zistí sa, či niektorý koniec je koniec čiary.

2. Ak je koniec čiary, zistí sa, či pretína druhú čiaru

3. Podľa výsledku vráti návratovú hodnotu:

Do funkcie vstúpia dve čiary (obe sú definované dvoma koncovými bodmi). Z týchto dvoch bodov sa vypočítajú rovnice (priamok) týchto čiar v tvare y = ax + b.

Pre tieto rovnice priamok sa vypočíta ich priesečník. Tento priesečník by mal byť bodom, v ktorom sa vzor “T” nachádza.

Následne sa pre všetky 4 body, ktoré vstúpili do funkcie, zistí, či sú totožné s týmto novým bodom. Na túto kontrolu slúži funkcia isSamePoint(), ktorá by mala pracovať aj s potenciálnou chybou.

V prípade, že sa zistí, že sa jedná o bod ktorý leží na priesešníku čiar sa ešte skontroluje, či ani jeden bod z druhej čiary neleží na tomto bode (jednalo by sa o vzor “corner” nie “T”).

Pre metódu justLineSeen() boli vytvorené ďalšie dve metódy LinePatternRecognition.isHorizontalT() a LinePatternRecognition.isVerticalT() na zistenie, či ide o vzor “T” na krajoch v strede ihriska alebo o “T” tvoriace časť bránkoviska.

Testovanie

Základné testovanie vypracovaných metód sa nachádza v triede LinePatternRecognitionTest. Pre účely testovania novej metódy sú v teste vytvorené nové objekty čiar, ktoré netvoria T a také, ktoré tvoria T. Správnosť výsledku metódy je potom skontrolovaná porovnaním s očakávanou hodnotou. Príklad volania:

assertEquals(0, isT(lines.get(6), lines.get(7)));

Pre potreby testovania bola pridaná funkcia na menenie endFlagu – setEndFlag1(Boolean bool) a setEndFlag2(Boolean bool).

isPlus

Typ: public static

Návratová hodnota: boolean

Parametre:
ParsedLineWithFlags line1
ParsedLineWithFlags line2

Vzor: „+“

Vracia:

Vzor + sa nachádza iba medzi stredovou čiarou a kruhom.

Pomocou metódy isIntersection() sa zisťuje, či dané dve čiary sa pretínajú a zároveň netvoria roh. Zároveň sa zisťuje, že ak sa pretínajú dané dve čiary tak nech netvoria vzor „T“, toto sa ošetruje volaním funkcie isT(), ktorá vracia hodnotu nula ak dve čiary netvoria vzor „T“. Ďalej sa zisťuje či existuje bod priesečníka pomocou metódy getSegmentIntersect() medzi dvomi čiarami.

Implementovali sme funkciu isPlus (), ktorá zisťuje pomocou metódy isIntersection() , či dané dve čiary sa pretínajú a zároveň netvoria roh. Zároveň sa zisťuje, že ak sa pretínajú dané dve čiary tak nech netvoria vzor „T“, toto sa ošetruje volaním funkcie isT() , ktorá vracia hodnotu nula ak dve čiary netvoria vzor „T“. Ďalej sa zisťuje či existuje bod priesečníka pomocou metódy getSegmentIntersect() medzi dvomi čiarami. Bod musí existovať. Ak sa všetky predchádzajúce podmienky splnia tak vzor plus existuje. Stredová čiara je stále prvá čiara, ktorá sa posiela zo servera. Do funkcie isPlus() sa majú posielať iba čiary 1,14,19 pretože ináč sa nedá zistiť, že ktorá je stredová čiara. Inštancia čiary nemá informáciu v sebe o type čiary alebo poradí. Toto sa má ošetriť pred volaním samotnej funkcie pri spracovaní odpovede zo servera.

Testovanie

Základné testovanie vypracovaných metód sa nachádza v triede LinePatternRecognitionTest. Pre účely testovania novej metódy sú v teste vytvorené nové objekty čiar, ktoré netvoria + a také, ktoré tvoria +. Správnosť výsledku metódy je potom skontrolovaná porovnaním s očakávanou hodnotou. Príklad volania:

assertEquals(0, isPlus(lines.get(6), lines.get(7)));

isGoalBox

Typ: public static

Návratová hodnota: byte[]

Parametre:
ParsedLineWithFlags line1
ParsedLineWithFlags line2
ParsedLineWithFlags line3

Zistí, či čiary formujú časť bránkoviska.

Vracia:

Keďže nevie, ktorá čiara je ktorá, je treba zistiť, medzi ktorými dvoma čiarami sa nachádza vzor roh (funkciou isCorner()). Tieto dve čiary sú čiary bránkoviska - šestnástky. Následne sa pre obe tieto čiary skontroluje, či s treťou čiarou netvoria vzor T (funkciou isT). Ak sa zistí že sa jedná o bránkovisko, tak sa vráti usporiadaná trojica, kde na prvej pozícii (indexe 0) je číslo zadnej čiary, na druhej pozícii (indexe 1) je číslo hrany tvoriacou vzor “T” so zadnou čiarou, a na tretej pozícii (indexe 2) je číslo poslednej, prednej čiary.

Čiara na indexe 1 má priradené záporné číslo ak spoločný bod čiar bránkoviska je druhým bodom bočnej čiary a kladné číslo, ak sa jedná o prvý bod. Podobne pre čiaru na indexe 2 platí, že ak je tento spoločný bod druhým bodom, vrátená hodnota bude záporná a ak prvým bodom, tak hodnota bude kladná.

Funkcia teda môže vrátiť 6 rôznych permutácií poľa [1,2,3], pričom druhá a tretia hodnota môžu byť záporné (celkovo 24 rôznych hodnôt), plus null v prípade, že sa nejedná o bránkovisko.

goalAndLine

Typ: public static

Návratová hodnota: boolean

Parametre:
Vector3D point
ParsedLineWithFlags line

Vzor:„Bránka a čiara“
Zistí, či daná čiara je v blízkosti bránky (s toleranciou odchýlky je možné, že funkcia vráti hodnotu „true“ aj pre nejakú z čiar bránkoviska).