Konstruktorji
Za shranjevanje točk v tabelo poti potrebujemo koordinati x in y tipa int. V konstruktorju razreda Polzek bomo hranili:
- koordinati x in y tipa int;
- niz navodil navodilaZaPot(brez številk – ustrezne premike bomo zapisali s črkami) in niz krajše poti krajsaPot;
- seznam tockePot tipa Point, kjer bomo hranili vse prehojene točke polža in seznam tockeKrajsaPot tipa Point, kjer bomo hranili krajšo pot, če le ta obstaja;
- v spremenljivki maxD tipa int pa bomo hranili največji odklon od središča – rabili ga bomo pri risanju, da bomo lahko določili smiseln koeficient za razdaljo med točkami.
Prazen konstruktor
Pri klicu praznega konstruktorja imata x in y vrednost 0, maxD vrednost 1, seznama tockePot in tockeKrajsaPot pa sta prazna. Nizov navodilaZaPot in krajsaPot ne omenjamo.
Poln konstruktor
Objekta razreda Polzek s klicem polnega konstruktorja generiramo z vnosom niza navodil, ki je sestavljen iz velikih črk U, D, L in R in število od 2 do 9.
X in y nastavimo na 0, maxD na 1, ustvarimo prazna seznama tockePot in tockeKrajsaPot.
Pri branju niza navodil si bomo v primeru številke pomagali še z dvema spremenljivkama. Ena spremenljivka bo tipa int, kamor bomo shranili vrednost števila, druga bo tipa char, tja pa bomo shranili črko, ki se nahaja pred to številko.
Točke bomo dodajali s pomočjo zanke po nizu navodil. Prvo točko – koordinatno izhodišče pa dodamo še pred zanko v oba seznama.
Po nizu navodil spustimo for zanko in pregledamo vsak znak v nizu. Najprej bomo določili število premikov in to shranili v spremenljivko st, nato pa še smer premika, ki jo bomo shranili v spremenljivko trenutni.
- Če je znak ustrezna črka, potem števec st dobi vrednost 1, smer premika pa je določena z znakom.
- Če je znak ustrezna številka, potem števec st dobi vrednost za eno manjše od številke na i-tem koraku zanke (en premik smo namreč naredili v prejšnjem koraku zanke). Smer premika določa črka na predhodnem znaku tekočega števila.
Nato znotraj for zanke ustvarimo še eno while zanko, ki teče dokler je števec st večji od 0.
- znak U – povečujemo y;
- znak D – zmanjšujemo y;
- znak L – zmanjšujemo x;
- znak D –povečujemo x.
V niz navodilaZaPot dodajamo ustrezne črke – pridelujemo niz navodil, v katerem bomo vse številke nadomestili z ustreznim številom črk.
V vsakem koraku te while zanke moramo v seznam točk, ki opisujejo pot dodati tekočo točko, ki je opisana s parom koordinat (x,y).
Preveriti moramo še odmik od izhodišča – tega bomo potrebovali pri risanju polžkove poti.
Objekt razreda Polžek tako po »obdelavi« vhodnega niza hrani koordinati x in y, s ki lahko opišeta končno lokacijo polžka; niz navodil za pot (brez številk, samo črke); prazen niz krajsaPot; seznam tockePot, v katerih so hranjene vse prehojene točke; seznam tockeKrajsaPot, v katerem je samo točka (0,0); maxD pa nam opiše največji odmik od izhodišča tekom potovanja.
Končna točka
Z metodo public string Tocka() vrnemo končno točko polžka tako, da vrnemo zadnji element tabele poti.
Krajša pot
Z metodo public string KrajsaPot() vrnemo okrajšan niz navodil.
V metodi najprej definiramo prazno tabelo tipa int[], kamor bomo shranjevali oznake točk in oznako tipa int z začetno vrednostjo 1. Dolžina tabele oznak je enaka dolžini tabele poti, saj vsaki točki na vzporednem mestu v tabeli oznak priredimo število.
Ustvarimo tudi seznam naPoti tipa Point, v katerem bomo hranili vse točke do tekoče – to bomo potrebovali pri preverjanju, če je polžek že kdaj bil na točki, na kateri se trenutno nahaja (zato nas bodoče točke ne zanimajo).
- S for zanko bomo pregledali vsako točko iz tabele poti. Najprej v zanki v pomožno tabelo dodamo na konec seznama tekočo točko iz tabele poti.
Če se točka na j-tem mestu tabele poti v pomožni tabeli nahaja več kot enkrat, lahko hitro ugotovimo s pomočjo metode Array.IndexOf(element iz seznama), ki nam vrne indeks prve pojavitve elementa iz tabele. Če je dobljeni indeks manjši od j-ja, potem imamo cikel. Oznako v tabeli oznak spremenimo na mestu, ki ga v zanki določa indeks ind:
- če ind==j: potem spremenimo oznako v tabeli oznak na j-tem mestu;
- če ind<j: spremenimo oznako v tabeli oznak na mestu ind, oznaka na mestu j ostane 0.
- V zanki na koncu povečamo vrednost oznake za 1.
Po izteku zanke smo dobili tabelo oznak iz katere pa zelo preprosto dobimo krajšo pot brez ciklov. Niz krajsaPot določimo kot prazen niz, kamor bomo hranili ustrezne premike. Oznaki pa spremenimo vrednost oznake, ki pripada koordinatnemu izhodišču (pregled bomo vršili od začetka). Nato ustvarimo for zanko, v kateri pregledamo vse oznake v tabeli oznak.
Grafični prikaz poti
Za pregleden grafični vmesnik so na formi ustvarjeni:
- vnosno polje ob oznaki niz navodil, v katerega vnašamo polžkovo pot;
- pod to vrstico je oznaka, ki nam izpiše, v katero točko bo polžek prišel;
- še niže pa se izpiše polžkova krajša pot;
- gumb, s katerim izvršimo kreacijo objekta razreda Polžek in klic metod za izračun krajše poti, končne točke in risanje poti;
- desno od tekstovnih vsebin pa se nahaja še risalna površina.
Celotna forma hrani spremenljivke:
- int xP, yP – x in y koordinati središča platna;
- int premikX, premikY – velikost premika (sorazmerna velikosti risalne površine)
- public Polzek Pepe – objekt razreda Polzek
- int thread – v tej spremenljivki hranimo zamik v milisekundah, ki ga bomo uporabili za nazornejši prikaz premikanja polžka.
Ker nekaj istih izračunov potrebujemo večkrat in to hkrati, jih združimo v metodi Init(). Ta metoda se uporablja pri zgoraj omenjenih dogodkih, izračuna pa nam središčni koordinati risalne površine in sliko »osveži« oz. razveljavi, paint event pa jo ponovno izriše.
Na vrhu je v programu spisan še dogodek za klik z miško na vnosno polje - tbNavodila_MouseClick. Ta ima le lepotno funkcijo, saj ob kliku pobriše vnosno polje in skrije podatke o končni točki in krajši poti.
Pri grafičnem delu so pomembnejši dogodki:
pnlPot_Paint (risalni dogodek za risalno ploščo): za poenostavitev risanja povezav ustvarimo še seznam Pot tipa Point, kjer bomo imeli shranjene točke, ki se bodo nato risale na platno. Povezave bomo narisali kot daljice med točkami.
- najprej pogledamo kakšna je vrednost maxD. Če je večja kot 6, potem prilagodimo razmik med točkama.
- Sledi izris celotne poti – objekt Polžek hrani seznam točk, v katerih se polžek premika po eno enoto na vsakem koraku. Polžek svojo pot prične v izhodišču, kar je na sliki središče platna. Za izris točke potrebujemo odmik od izhodišča pomnožen z velikostjo premika, ki smo ga določili pred zanko.
- V vseh korakih zanke razen začetnem izrisujemo tudi povezave. Povezavo narišemo kot daljico med tekočo in predhodno točko.
- Na koncu zanke uporabimo zamrznitev, da se slika izrisuje »po korakih«.
- podobno izrisujemo krajšo pot, le da moramo najprej preveriti, če krajša pot sploh obstaja (če sta niza navodilaZaPot in krajsaPot različna).
- izrisujemo manjše točke in povezave ter uporabimo drugo barvo.