TIE-20100 Tietorakenteet ja algoritmit, kevät 2019 Harjoitustyön aihe Harjoitustyö 1: Beacons of RGB Viimeksi päivitetty 18.03.2019 Mystisessä Cmykin maailmassa on Muinaisten rakentamia majakoita, jotka tuntemattomasta syystä pyörimisen sijaan lähettävät valoaan toiselle majakalle, joka yhdistää oman valonsa näihin tuleviin valonsäteisiin. Lähettämänsä valon värin lisäksi jokaisella majakalla on (x,y)-sijainti ja nimi. Ensimmäisessä harjoitustyössä tehdään luokka, joka hallinnoi majakoita ja niistä lähteviä valonsäteitä. Harjoitustyössä harjoitellaan valmiiden tietorakenteiden ja algoritmien tehokasta käyttöä (STL), mutta siinä harjoitellaan myös algoritmien tehokasta toteuttamista ja niiden tehokkuuden arvioimista. Majakoiden yksilöiminen tehdään yksikäsitteisen ID-tunnisteen avulla. Harjoitustyössä ohjelmaan syötetään tietoja majakoista (ID, nimi, koordinaatit ja väri), ja ohjelmalta voi kysyä majakkoja halutussa järjestyksessä sekä minimi- ja maksimitietoja. Ei-pakollisena osana majakkoja voi myös poistaa. Kysyä voi myös majakoiden valaistussuhteita ja lähetetyn valon väriä. Koska kyseessä on Tietorakenteiden ja algoritmien harjoitustyö, ohjelman tehokkuus on tärkeä arvostelukriteeri. Tavoitteena on tehdä mahdollisimman tehokas toteutus, kun oletetaan että kaikki ohjelman tuntemat komennot ovat suunnilleen yhtä yleisiä (ellei komentotaulukossa toisin mainita). Plussaa tietysti saa, mitä tehokkaammin operaatiot pystyy toteuttamaan. Huomaa erityisesti seuraavat asiat: Tässä harjoitustyössä harjoitellaan valmiiden tietorakenteiden ja algoritmien (STL) tehokasta käyttöä, joten kannattaa suosia STL:ää omien algoritmien/tietorakenteiden sijaan silloin, kun se on tehokkuuden kannalta järkevää. Valmiina annetun pääohjelman voi ajaa joko graafisen käyttöliittymän kanssa QtCreatorilla/ qmakella käännettynä, tai tekstipohjaisena pelkällä g++:lla käännettynä. Itse ohjelman toiminnallisuus ja opiskelijan toteuttama osa on täsmälleen sama molemmissa tapauksissa. Vihje tehokkuudesta: Jos minkään operaation keskimääräinen tehokkuus on huonompi kuin ϴ(n log n),ratkaisun tehokkuus ei ole hyvä. Suurin osa operaatioista on mahdollista toteuttaa paljon nopeamminkin. Osana ohjelman palautusta tiedostoon datastructures.hh on jokaisen operaation oheen laitettu kommentti, johon lisätään oma arvio kunkin toteutetun operaation asymptoottisesta tehokkuudesta lyhyiden perusteluiden kera.
Osana ohjelman palautusta palautetaan git:ssä myös dokumentti (samassa hakemistossa/kansiossa kuin lähdekoodi), jossa perustellaan toteutuksessa käytetyt tietorakenteet tehokkuuden kannalta. Hyväksyttäviä dokumentin formaatteja ovat puhdas teksti (readme.txt), markdown (readme.md) ja Pdf (readme.pdf). Operaatioiden remove_beacon(), path_inbeam_longest() ja total_color() toteuttaminen ei ole pakollista läpipääsyn kannalta. Vain pakolliset osat toteuttamalla harjoitustyön maksimiarvosana on 3. Tehokkuudessa olennaisinta on, miten ohjelman tehokkuus muuttuu datan kasvaessa, eivät pelkät sekuntimäärät. Operaation tehokkuuteen lasketaan kaikki siihen liittyvä työ, myös mahdollisesti alkioiden lisäyksen yhteydessä tehty operaation hyväksi liittyvä työ. Plussaa tietysti saa, jos operaatioita saa toteutettua vaadittua mahdollisimman tehokkaasti. Samoin plussaa saa, mitä nopeammaksi operaatiot saa sekunteinakin mitattuna (jos siis kertaluokka on vähintään vaadittu). Mutta plussaa saa vain tehokkuudesta, joka syntyy omista algoritmivalinnoista ja suunnittelusta. (Esim. kääntäjän optimointivipujen vääntely, rinnakkaisuuden käyttö, häkkerioptimoinnilla kellojaksojen viilaaminen eivät tuo pisteitä.) Riittävän huonolla toteutuksella työ voidaan hylätä. Esimerkkejä kysymyksistä, joilla tehokkuutta voi usein parantaa: Tehdäänkö jokin asia turhaan useaan kertaan? Voiko jonkin asian joskus jättää kokonaan tekemättä? Tehdäänkö joissain työtä enemmän kuin on välttämättä tarpeen? Voiko jonkin asian tehdä "lähes ilmaiseksi" samalla, kun tehdään jotain muuta? Värien laskemisesta Harjoitustyössä majakat lähettävät valoa toiselle majakalle, joka yhdistää saapuvan valon ja oman valonsa lähteväksi valonsäteeksi. Värien yhdistäminen tehdään yksinkertaisesti laskemalla jokaisen värikomponentin r, g ja b kohdalla keskiarvo tulevien valojen väreistä ja majakan omasta väristä. Keskiarvo lasketaan ensin laskemalla arvot yhteen ja sitten jakamalla lukumäärällä pyöristäen alaspäin (ts. normaali C++:n pyöristys jakolaskussa). Järjestämisen yhteydessä väreistä lasketaan niiden kirkkaus, jonka perusteella järjestäminen tehdään. Kirkkaus lasketaan kaavalla 3 r+6 g+b (tämä on likiarvo siitä, miten ihmissilmä näkisi värin kirkkauden srgb-väriavaruudessa). Järjestämisestä Majakoita järjestettäessä on mahdollista, että nimen mukaan järjestettäessä usealla on sama etäisyys (tai kirkkausjärjestyksessä kirkkaus). Tällaisten tapausten keskinäinen järjestys on mielivaltainen (ts. saavat olla keskenään missä järjestyksessä tahansa). Ohjelman hyväksymissä nimissä voi olla vain kirjaimia A-Z ja a-z. Järjestämisen voi tehdä joko std::string-luokan vertailuoperaattorin "<" mukaan (jossa isot kirjaimet tulevat ennen pieniä) tai "oikealla tavalla", jossa vastaavat isot ja pienet kirjaimet ovat samanarvoisia.
Majakoiden ID:iden järjestämisessä tulee käyttää C++:n string-luokan "<"-vertailua. Harjoitustyön toteuttamisesta ja C++:n käytöstä Harjoitustyön kielenä on C++17. Tämän harjoitustyön tarkoituksena on opetella valmiiden tietorakenteiden ja algoritmien käyttöä, joten C++:n STL:n käyttö on erittäin suotavaa ja osa arvostelua. Mitään erityisiä rajoituksia C++:n standardikirjaston käytössä ei ole. Luonnollisesti kielen ulkopuolisten kirjastojen käyttö ei ole sallittua (esim. Windowsin omat kirjastot tms.). Huomaa kuitenkin, että jotkut operaatiot joudut todennäköisesti toteuttamaan myös kokonaan itse. Ohjelman toiminta ja rakenne Osa ohjelmasta tulee valmiina kurssin puolesta, osa toteutetaan itse. Valmiit osat, jotka tarjotaan kurssin puolesta Tiedostot mainprogram.hh, mainprogram.cc, mainwindow.hh, mainwindow.cc, mainwindow.ui (joihin EI SAA TEHDÄ MITÄÄN MUUTOKSIA) Pääohjelma, joka hoitaa syötteiden lukemisen, komentojen tulkitsemisen ja tulostusten tulostamisen. Pääohjelmassa on myös valmiina komentoja testaamista varten. QtCreatorilla tai qmakella käännettäessä graafinen käyttöliittymä, jonka "komentotulkkiin" voi näppäimistön lisäksi hiirellä lisätä komentoja, tiedostoja yms. Graafinen käyttöliittymä näyttää myös luodut majakat ja niiden lähettämät valonsäteet graafisesti samoin kuin suoritettujen operaatioiden tulokset. Tiedosto datastructures.hh class Datastructures: Luokka, johon harjoitustyö kirjoitetaan. Luokasta annetaan valmiina sen julkinen rajapinta (johon EI SAA TEHDÄ MITÄÄN MUUTOKSIA) Tyyppimäärittely BeaconID, jota käytetään majakat yksilöivänä tunnisteena (samannimisiä majakoita voi olla monta ja vaikka samoissa koordinaateissa, mutta jokaisella on eri id). Tyyppimäärittely Coord, jota käytetään rajapinnassa (x,y)-koordinaattien esitykseen. Tälle tyypille on esimerkinomaisesti valmiiksi määritelty vertailuoperaatiot ==,!= ja < sekä hajautusfunktio. Tyyppimäärittely Color, jota käytetään rajapinnassa (r,g,b)-värien esitykseen. Tälle tyypille on esimerkinomaisesti valmiiksi määritelty vertailuoperaatiot == ja!= (itse voi halutessaan määritellä lisää). Vakiot NO_ID, NO_NAME, NO_COORD ja NO_COLOR, joita käytetään paluuarvoina, jos tietoja kysytään majakasta, jota ei ole olemassa. Tiedosto datastructures.cc Tänne luonnollisesti kirjoitetaan luokan operaatioiden toteutukset.
Funktio random_in_range: Arpoo luvun annetulla välillä (alku- ja loppuarvo ovat molemmat välissä mukana). Voit käyttää tätä funktiota, jos tarvitset toteutuksessasi satunnaislukuja. Graafisen käyttöliittymän käytöstä QtCreatorilla käännettäessä harjoitustyön valmis koodi tarjoaa graafisen käyttöliittymän, jolla ohjelmaa voi testata ja ajaa valmiita testejä sekä visualisoida ohjelman toimintaa. Käyttöliittymässä on komentotulkki, jolle voi antaa myöhemmin kuvattuja komentoja, jotka kutsuvat opiskelijan toteuttamia operaatioita. Käyttöliittymä näyttää myös luodut majakat ja niiden valonsäteet graafisesti. Graafista näkymää voi vierittää ja sen skaalausta voi muuttaa. Majakan klikkaaminen hiirellä tulostaa sen tiedot ja tuottaa sen ID:n komentoriville (kätevä tapa syöttää komentojen parametreja). Käyttöliittymästä voi myös valita, mitä graafisessa näkymässä näytetään. Huom! Käyttöliittymän graafinen esitys kysyy kaikki tiedot opiskelijoiden koodista! Se ei siis ole "oikea" lopputulos vaan graafinen esitys siitä, mitä tietoja opiskelijoiden koodi antaa. Käyttöliittymä hakee kaikki majakat operaatiolla all_beacons() ja kysyy majakoiden tiedot operaatioilla get_...(). Jos valonsäteiden piirtäminen on päällä, ne kysytään operaatiolla get_lightsources(), ja jos säteiden väritys on päällä, säteiden värit kysytään operaatiolla total_color() (vapaaehtoinen). Käyttöliittymässä on myös muutama tässä vaiheessa ei-aktiivinen toiminto, joita tarvitaan toisessa harjoitustyössä. Harjoitustyönä toteutettavat osat Tiedostot datastructures.hh ja datastructures.cc class Datastructures: Luokan julkisen rajapinnan jäsenfunktiot tulee toteuttaa. Luokkaan saa listätä omia määrittelyitä (jäsenmuuttujat, uudet jäsenfunktiot yms.) Tiedostoon datastructures.hh kirjoitetaan jokaisen toteutetun operaation yläpuolelle kommentteihin oma arvio ko. operaation toteutuksen asymptoottisesti tehokkuudesta ja lyhyt perustelu arviolle. Lisäksi harjoitustyönä toteutetaan alussa mainittu dokumentti readme.pdf. Huom! Omassa koodissa ei ole tarpeen tehdä ohjelman varsinaiseen toimintaan liittyviä tulostuksia, koska pääohjelma hoitaa ne. Mahdolliset Debug-tulostukset kannattaa tehdä cerr-virtaan (tai qdebug:lla, jos käytät Qt:ta), jotta ne eivät sotke testejä. Ohjelman tuntemat komennot ja luokan julkinen rajapinta Kun ohjelma käynnistetään, se jää odottamaan komentoja, jotka on selitetty alla. Komennot, joiden yhteydessä mainitaan jäsenfunktio, kutsuvat ko. Datastructure-luokan operaatioita, jotka siis opiskelijat toteuttavat. Osa komennoista on taas toteutettu kokonaan kurssin puolesta pääohjelmassa.
Jos ohjelmalle antaa komentoriviltä tiedoston parametriksi, se lukee komennot ko. tiedostosta ja lopettaa sen jälkeen. Alla operaatiot on listattu siinä järjestyksessä, kun ne suositellaan toteutettavaksi (tietysti suunnittelu kannattaa tehdä kaikki operaatiot huomioon ottaen jo alun alkaen). Komento Julkinen jäsenfunktio beacon_count int beacon_count() clear_beacons void clear_beacons() all_beacons all_beacons() add_beacon ID Name (x,y) (r,g,b) bool add_beacon(beaconid id, std::string const& name, Coord xy, Color color) (no command) std::string get_name(beaconid id) (no command) Coord get_coordinates(beaconid id) (no command) Color get_color(beaconid id) (Allaolevat kannattaa toteuttaa todennäköisesti vasta, kun ylläolevat on toteutettu.) sort_alpha beacons_alphabetically() sort_brightness beacons_brightness_increasing() min_brightness BeaconID min_brightness() Selitys Palauttaa tietorakenteessa olevien majakoiden lukumäärän. Tyhjentää tietorakenteet eli poistaa kaikki majakat ja niiden valonsäteet (tämän jälkeen beacon_count() palauttaa 0). Palauttaa kaikki tietorakenteessa olevat majakat mielivaltaisessa järjestyksessä (ts. järjestyksellä ei ole väliä). Tämä operaatio ei ole oletuksena mukana tehokkuustesteissä. Lisää tietorakenteeseen uuden majakan annetulla uniikilla id:llä, nimellä, sijainnilla ja värillä. Aluksi eivät lähetä valonsädettä minnekään. Jos annetulla id:llä on jo majakka, ei tehdä mitään ja palautetaan false, muuten palautetaan true. Palauttaa annetulla ID:llä olevan majakan nimen, tai NO_NAME, jos id:llä ei löydy majakkaa. (Pääohjelma kutsuu tätä eri paikoissa.) Tätä operaatiota kutsutaan useammin kuin muita. Palauttaa annetulla ID:llä olevan majakan sijainnin, tai arvon NO_COORD, jos id:llä ei löydy majakkaa. (Pääohjelma kutsuu tätä eri paikoissa.) Tätä operaatiota kutsutaan useammin kuin muita. Palauttaa annetulla ID:llä olevalle majakalle asetetun oman valon värin (ts. tulevia säteitä ei oteta huomioon), tai NO_COLOR, jos id:llä ei löydy majakkaa. (Pääohjelma kutsuu tätä eri paikoissa.) Tätä operaatiota kutsutaan useammin kuin muita. Palauttaa majakkojen id:t majakoiden nimen mukaan aakkosjärjestyksessä. Palauttaa majakkojen id:t majakoiden oman värin kirkkausjärjestyksessä, himmein ensin. Huomaa kirkkauden määritelmä aiempana. Palauttaa majakan, jonka oma väri on himmein. Jos tällaisia on useita, palauttaa jonkin niistä. Jos majakoita ei ole, palautetaan NO_ID. Huomaa kirkkauden määritelmä aiempana.
Komento Julkinen jäsenfunktio max_brightness BeaconID max_brightness() find_beacons name find_beacons(std::string const& name) change_name ID newname bool change_beacon_name(beaconid id, std::string const& newname) change_color ID (r,g,b) bool change_beacon_color(beaconid id, Color newcolor) (Allaolevat kannattaa toteuttaa todennäköisesti vasta, kun ylläolevat on toteutettu.) add_lightbeam SourceID TargetID bool add_lightbeam(beaconid sourceid, BeaconID targetid) lightsources BeaconID get_lightsources(beaconid id) path_outbeam path_outbeam(beaconid id) (Seuraavien operaatioiden toteuttaminen ei ole pakollista, mutta ne parantavat arvosanaa.) Selitys Palauttaa majakan, jonka oma väri on kirkkain. Jos tällaisia on useita, palauttaa jonkin niistä. Jos majakoita ei ole, palautetaan NO_ID. Huomaa kirkkauden määritelmä aiempana. Palauttaa majakat, joilla on annettu nimi tai tyhjän vektorin, jos sellaisia ei ole. Paluuarvo on järjestettävä nousevan ID:n mukaiseen järjestykseen. Tätä operaatiota kutsutaan harvoin, eikä se ole oletuksena mukana tehokkuustestissä. Muuttaa annetulla ID:llä olevan majakan nimen. Jos majakkaa ei löydy, palauttaa false, muuten true. Muuttaa annetulla ID:llä olevan majakan värin. Jos majakkaa ei löydy, palauttaa false, muuten true. Lisää valonsäteen majakasta toiseen. Majakka voi lähettää valoa vain yhdelle toiselle majakalle. Työssä saa olettaa, että valonsäteet eivät voi muodostaa silmukoita (ts. majakka ei voi olla suoraan tai epäsuorasti valaista itseään). Jos jompaa kumpaa majakkaa ei löydy tai lähdemajakka lähettää jo valoa toiselle majakalle, ei tehdä mitään ja palautetaan false. Muuten palautetaan true. Palauttaa niiden majakoiden id:t, jotka lähettävät valonsa suoraan annetulla id:llä olevalle majakalle, tai vektorin jonka ainoa alkio on NO_ID, jos id:llä ei löydy majakkaa. Paluuarvo on järjestettävä nousevan ID:n mukaiseen järjestykseen. (Pääohjelma kutsuu tätä eri paikoissa.) Palauttaa listan majakoista, joille annettu majakka välittää valoa suoraan tai epäsuorasti. Paluuvektoriin talletetaan ensin majakka itse, sitten sen valon suora kohdemajakka, kohdemajakan kohdemajakka jne. niin kauan kuin valonsäteitä riittää. Jos id:llä ei ole majakkaa, palautetaan vektori, jonka ainoa alkio on NO_ID.
Komento Julkinen jäsenfunktio remove_beacon ID bool remove_beacon(beaconid id) path_inbeam_longest ID path_inbeam_longest(beaconid id) total_color ID Color total_color(beaconid id) (Seuraavat komennot on toteutettu valmiiksi pääohjelmassa.) random_add n random_seed n read 'tiedostonimi' Selitys Poistaa annetulla id:llä olevan majakan. Jos id ei vastaa mitään majakkaa, ei tehdä mitään ja palautetaan false, muuten palautetaan true. Jos poistettavasta majakasta tulee tai lähtee valonsäteitä, nämä valonsäteet poistetaan. Tämän operaation tehokkuus ei ole kriittisen tärkeää (sitä ei oleteta kutsuttavan usein), joten se ei ole oletuksena mukana tehokkuustesteissä. Tämän operaation toteuttaminen ei ole pakollista (mutta otetaan huomioon arvostelussa). Palauttaa pisimmän mahdollisen ketjun valonsäteitä, jotka päätyvät annettuun majakkaan. Paluuvektorissa majakat ovat valonsädejärjestyksessä niin, että edellinen majakka lähettää aina säteen seuraavaan, ja viimeisenä on parametrina annettu majakka (jos yhtä pitkiä ketjuja on useita, palautetaan jokin niistä). Jos id:llä ei ole majakkaa, palautetaan vektori, jonka ainoa alkio on NO_ID. Tämän komennon toteutus ei ole pakollinen (mutta se vaikuttaa arvosteluun). Palauttaa majakasta lähtevän valon kokonaisvärin eli tulevien säteiden ja majakan oman värin keskiarvon (tarkempi määrittely aiemmin tässä ohjeessa). Jos id:llä ei löydy majakkaa, palautetaan NO_COLOR. Tämän komennon toteutus ei ole pakollinen (mutta se vaikuttaa arvosteluun). Tätä operaatiota kutsutaan useammin kuin muita. Lisää tietorakenteeseen (testausta varten) n kpl majakoita, joilla on satunnainen id, nimi, sijainti ja väri. 80 % todennäköisyydellä majakasta lisätään myös valonsäde toiseen majakkaan. Huom! Arvot ovat tosiaan satunnaisia, eli saattavat olla kerrasta toiseen eri. Asettaa pääohjelman satunnaislukugeneraattorille uuden siemenarvon. Oletuksena generaattori alustetaan joka kerta eri arvoon, eli satunnainen data on eri ajokerroilla erilaista. Siemenarvon asettamalla arvotun datan saa toistumaan samanlaisena kerrasta toiseen (voi olla hyödyllista debuggaamisessa). Lukee lisää komentoja annetusta tiedostosta. (Tällä voi esim. lukea listan tiedostossa olevia työntekijöitä tietorakenteeseen, ajaa valmiita testejä yms.)
Komento Julkinen jäsenfunktio stopwatch on / off / next perftest all/compulsory/cmd1;cmd2... timeout n n1;n2;n3... testread 'in-tiedostonimi' 'out-tiedostonimi' help quit Selitys Aloittaa tai lopettaa komentojen ajanmittauksen. Ohjelman alussa mittaus on pois päältä ("off"). Kun mittaus on päällä ("on"), tulostetaan jokaisen komennon jälkeen siihen kulunut aika. Vaihtoehto "next" kytkee mittauksen päälle vain seuraavan komennon ajaksi (kätevää read-komennon kanssa, kun halutaan mitata vain komentotiedoston kokonaisaika). Ajaa ohjelmalle tehokkuustestit. Tyhjentää tietorakenteen ja lisää sinne n1 kpl satunnaisia majakoita (ks. random_add). Sen jälkeen arpoo n kertaa satunnaisen komennon. Mittaa ja tulostaa sekä lisäämiseen että komentoihin menneen ajan. Sen jälkeen sama toistetaan n2:lle jne. Jos jonkin testikierroksen suoritusaika ylittää timeout sekuntia, keskeytetään testien ajaminen (tämä ei välttämättä ole mikään ongelma, vaan mielivaltainen aikaraja). Jos ensimmäinen parametri on all, arvotaan lisäyksen jälkeen kaikista komennoista, joita on ilmoitettu kutsuttavan usein. Jos se on compulsory, testataan vain komentoja, jotka on pakko toteuttaa. Jos parametri on lista komentoja, arvotaan komento näiden joukosta (tällöin kannattaa mukaan ottaa myös random_add, jotta lisäyksiä tulee myös testikierroksen aikana). Jos ohjelmaa ajaa graafisella käyttöliittymällä, "stop test" nappia painamalla testi keskeytetään (nappiin reagointi voi kestää hetken). Ajaa toiminnallisuustestin ja vertailee tulostuksia. Lukee komennot tiedostosta in-tiedostonimi ja näyttää ohjelman tulostuksen rinnakkain tiedoston outtiedostonimi sisällön kanssa. Jokainen eroava rivi merkitään kysymysmerkillä, ja lopuksi tulostetaan vielä tieto, oliko eroavia rivejä. Tulostaa listan tunnetuista komennoista. Lopettaa ohjelman. (Tiedostosta luettaessa lopettaa vain ko. tiedoston lukemisen.) "Datatiedostot" Kätevin tapa testata ohjelmaa on luoda "datatiedostoja", jotka add-komennolla lisäävät joukon majakoita ohjelmaan. Majakat voi sitten kätevästi lukea sisään tiedostosta read-komennolla ja sitten kokeilla muita komentoja ilman, että majakat täytyisi joka kerta syöttää sisään käsin. Alla on esimerkit datatiedostoista, joista toinen lisää majakoita, toinen valonsäteitä: example-beacons.txt # Add beacons
add_beacon G1 Lime (0,0) (0,255,0) add_beacon M1 Fuchsia (5,0) (255,0,255) add_beacon R1 Crimson (0,5) (220,20,60) add_beacon B2 Teal (10, 10) (0,128,128) add_beacon M2 Indigo (10, 5) (75,0,130)
example-lightbeams.txt # Add light sources add_lightbeam G1 M1 add_lightbeam R1 M2 add_lightbeam M1 M2 add_lightbeam M2 B2 Esimerkki ohjelman toiminnasta Alla on esimerkki ohjelman toiminnasta. Esimerkin syötteet löytyvät tiedostoista examplecompulsory-in.txt ja example-all-in.txt, tulostukset tiedostoista example-compulsory-out.txt ja example-all-out.txt. Eli esimerkkiä voi käyttää pienenä testinä pakollisten toimintojen toimimisesta antamalla käyttöliittymästä komennon testread "example-compulsory-in.txt" "example-compulsory-out.txt" > read "example-compulsory-in.txt" ** Commands from 'example-compulsory-in.txt' > clear_beacons Cleared all beacons > beacon_count Number of beacons: 0 > read "example-beacons.txt" ** Commands from 'example-beacons.txt' > # Add beacons > add_beacon G1 Lime (0,0) (0,255,0) Lime: pos=(0,0), color=(0,255,0):1530, id=g1 > add_beacon M1 Fuchsia (5,0) (255,0,255) Fuchsia: pos=(5,0), color=(255,0,255):1020, id=m1 > add_beacon R1 Crimson (0,5) (220,20,60) Crimson: pos=(0,5), color=(220,20,60):840, id=r1 > add_beacon B2 Teal (10, 10) (0,128,128) Teal: pos=(10,10), color=(0,128,128):896, id=b2 > add_beacon M2 Indigo (10, 5) (75,0,130) Indigo: pos=(10,5), color=(75,0,130):355, id=m2 > ** End of commands from 'example-beacons.txt' > beacon_count Number of beacons: 5 > sort_alpha 1. Crimson: pos=(0,5), color=(220,20,60):840, id=r1 2. Fuchsia: pos=(5,0), color=(255,0,255):1020, id=m1 3. Indigo: pos=(10,5), color=(75,0,130):355, id=m2 4. Lime: pos=(0,0), color=(0,255,0):1530, id=g1 5. Teal: pos=(10,10), color=(0,128,128):896, id=b2 > min_brightness Indigo: pos=(10,5), color=(75,0,130):355, id=m2 > max_brightness Lime: pos=(0,0), color=(0,255,0):1530, id=g1 > sort_brightness 1. Indigo: pos=(10,5), color=(75,0,130):355, id=m2 2. Crimson: pos=(0,5), color=(220,20,60):840, id=r1 3. Teal: pos=(10,10), color=(0,128,128):896, id=b2 4. Fuchsia: pos=(5,0), color=(255,0,255):1020, id=m1 5. Lime: pos=(0,0), color=(0,255,0):1530, id=g1 > change_name M1 Indigo
Indigo: pos=(5,0), color=(255,0,255):1020, id=m1 > find_beacons Indigo 1. Indigo: pos=(5,0), color=(255,0,255):1020, id=m1 2. Indigo: pos=(10,5), color=(75,0,130):355, id=m2 > read "example-lightbeams.txt" ** Commands from 'example-lightbeams.txt' > # Add light sources > add_lightbeam G1 M1 Added lightbeam: Lime -> Indigo > add_lightbeam R1 M2 Added lightbeam: Crimson -> Indigo > add_lightbeam M1 M2 Added lightbeam: Indigo -> Indigo > add_lightbeam M2 B2 Added lightbeam: Indigo -> Teal > ** End of commands from 'example-lightbeams.txt' > lightsources M2 1. Indigo: pos=(5,0), color=(255,0,255):1020, id=m1 2. Crimson: pos=(0,5), color=(220,20,60):840, id=r1 > change_color M1 (83,0,143) Indigo: pos=(5,0), color=(83,0,143):392, id=m1 > path_outbeam R1 0. Crimson: pos=(0,5), color=(220,20,60):840, id=r1 1. -> Indigo: pos=(10,5), color=(75,0,130):355, id=m2 2. -> Teal: pos=(10,10), color=(0,128,128):896, id=b2 > ** End of commands from 'example-compulsory-in.txt' > path_inbeam_longest B2 0. Lime: pos=(0,0), color=(0,255,0):1530, id=g1 1. -> Indigo: pos=(5,0), color=(83,0,143):392, id=m1 2. -> Indigo: pos=(10,5), color=(75,0,130):355, id=m2 3. -> Teal: pos=(10,10), color=(0,128,128):896, id=b2 > total_color B2 Total color of Teal: (56,88,107) > remove_beacon M2 Indigo removed. > lightsources B2 No lightsources! > Kuvakaappaus käyttöliittymästä Alla vielä kuvakaappaus käyttöliittymästä sen jälkeen, kun example-beacons.txt ja examplelightbeams.txt on luettu sisään.