03 SRGP - ulazrti.etf.bg.ac.rs/rti/ri5rg/materijali/predavanja/arhiva/03 SRGP - ulaz.pdf2 SRGP -...
Transcript of 03 SRGP - ulazrti.etf.bg.ac.rs/rti/ri5rg/materijali/predavanja/arhiva/03 SRGP - ulaz.pdf2 SRGP -...
Računarska grafika
SRGP - ulaz
18.03.2015.SRGP - ulaz2
Obrada osnovnih interakcija
� Tema: kako pisati interaktivne programe koji komuniciraju sa korisnikom preko miša i tastature
– generalna uputstva za pisanje interaktivnih programa– osnovni pojam logičkih (apstraktnih) ulaznih uređaja– režimi obrade podataka koji potiču od ulaznih uređaja– funkcije SRGP koji se bave obradom interakcija
� Ljudski faktori - važni koliko i funkcionalna kompletnost i korektnost:– stil interakcije (izgled i osećaj, look and feel)– lakoća učenja i korišćenja - intuitivnost
� Uputstva:– obezbediti jednostavne i konzistentne sekvence interakcije– ne preopteretiti korisnika sa previše opcija i stilova– pokazati jasno raspoložive opcije u svakom stanju interakcije– obezbediti odgovarajuću povratnu spregu prema korisniku– omogućiti korisniku elegantan oporavak od grešaka
18.03.2015.SRGP - ulaz3
Realizacija u putstava
� Jednostavnost i konzistentnost– mora se napraviti kompromis između funkcionalnosti i jednostavnosti
� ponekad je bolje žrtvovati neku mogućnost, nego previše iskomplikovati program– do svake funkcionalnosti se mora stizati u par koraka– konzistentnost sekvenci akcija doprinosi intuitivnom korišćenju programa
� Mera u broju opcija i stilova– često korišćene opcije moraju biti mnogo pristupačnije od retko korišćenih– važno je dobro odabrati podrazumevane opcije i stilove
� Prikaz raspoloživih opcija – o(ne)mogućeno stanje dugmadi i stavki menija
� Povratna sprega se obezbeđuje kroz – isticanje izabrane opcije iz menija
(posebo bojenje, uokvirivanje ili neki drugi poseban efekat)– eho manipulacije ulaznim uređajem
(eho unesenog znaka, kurzor koji prati pokret miša) � Oporavak od greške kroz cancel i undo/redo mogućnosti
18.03.2015.SRGP - ulaz4
Tipovi ulaznih ure đaja
� Glavni cilj u projektovanju grafičkih paketa je nezavisnost od uređaja– za grafički izlaz
� SRGP specificira primitive u terminima apstraktnog koordinatnog sistema� tako oslobađa aplikaciju potrebe da postavlja individualne piksele u video memoriji
– za grafički ulaz � SRGP podržava skup logičkih uređaja� tako oslobađa aplikaciju bavljenja detaljima fizičkih ulaznih uređaja
� Logički uređaji koje podržava SRGP su:– Lokator – uređaj za definisanje
� koordinata pokazane tačke na ekranu� stanja jednog ili više pridruženih tastera
– Tastatura – uređaj za definisanje ulaza znakovnih niski
� SRGP mapira logičke u raspoložive fizičke uređaje – npr. lokator --> miš, džojstik, grafički tablet, ...
� Analogno mapiranje u OS: – fizički uređaji (monitor, disk, ...) se apstrahuju logičkim datotekama
18.03.2015.SRGP - ulaz5
Ulazni u ređaji u drugim paketima
� SRGP podržava samo po jedan lokator i jednu tastaturu, dok GKS i PHIGS dozvoljavaju više
� GKS i PHIGS podržavaju i druge tipove uređaja:– Uređaji poteza (stroke)
� vraćaju poliliniju definisanu pozicijama kurzora unetih lokatorom– Uređaji izbora (choice)
� apstrahuju funkcionalnu tastaturu i vraćaju ključni identifikator– Valuatori (valuator)
� apstrahuju klizače i kontrolnu obrtnu dugmad i vraćaju realan broj– Selektori (pick)
� apstrahuju ukazivačke uređaje sa tasterom za selekciju (npr. miš) i vraćaju identifikaciju selektovanog logičkog entiteta
� Drugi paketi (npr. QuickDraw ili Xlib) ostavljaju aplikaciji znatno veću zavisnost od uređaja
18.03.2015.SRGP - ulaz6
Uzorkovanje ili obrada prekida
� Postoji više osnovnih tehnika za prijem podataka sa ulaznih uređaja� Uzorkovanje (sampling, polling)
– program pita za tekuću vrednost uređaja (meru) i nastavlja– komunikacija je sinhrona sa glavnim programom– vrši se bez obzira da li se vrednost uređaja promenila od poslednjeg čitanja– skupo je – troši se vreme u petlji uposlenog čeknja na promenu stanja uređaja
� Obrada prekida (interrupt handling) – programer obezbeđuje prekidnu proceduru za obradu događaja– komunikacija se izvršava asinhrono u odnosu na glavni program– aplikacija omogući uređaje za ulaz i nastavi normalnu obradu sve do prekida– pri prekidu se kontrola privremeno prenosi na prekidnu proceduru– mehanizam je suviše niskog nivoa apstrakcije za programiranje interakcije
� Obrada događaja (event handling)– viši nivo apstrakcije koji u pozadini ima obradu prekida– jednostavan model za programiranje interakcije korisnika sa računarom
18.03.2015.SRGP - ulaz7
Režim obrade doga đaja
� Grafički sistemi ne nude direktnu kontrolu nad obradom prekida, već viši nivo apstrakcije – obradu događaja:
– paket u pozadini nadgleda uređaje i smešta informacije u red događaja(što može biti realizovano kroz tehniku prekida)
– aplikacija proverava red događaja i obrađuje ih po redosledu događanja� kada postoji događaj u redu,
aplikacija može da ga preuzme i događaj se tada izbacuje iz reda� ako događaja nema u redu,
aplikacija može da specificira da li i koliko želi da čeka na događaj � čekanje blokira aplikaciju, ne troši se uzaludno procesorsko vreme
� Režim obrade događaja zamenjuje uzorkovanje mnogo efikasnijom tehnikom čekanja na događaje u blokiranom stanju
� Za svaki ulazni uređaj i režim rada – zna se korisnička akcija koja je okidački događaj (kada se događaj smešta u red)– na primer: pritisak proizvoljnog ili samo [Enter] tastera za uređaj tastature
18.03.2015.SRGP - ulaz8
Model obrade doga đaja
� Program koji obrađuje događaje koristeći SRGP:inicijalizuj, uklju čuju ći generisanje po četne slike;aktiviraj interaktivne ure đaje u režimu doga đaja;while (korisnik nije zatražio kraj){ /* glavna petl ja */
čekaj na doga đaj koji okida korisnik na ulaznom ure đaju; switch (ure đaj koji je prouzrokovao doga đaj) {
case DEVICE_1: prikupi vrednosti sa DEVICE_1, obradi ih i odgovori; break;
case DEVICE_2: prikupi vrednosti sa DEVICE_2, obradi ih i odgovori; break;
...}
}
� Korak dalje – objektni model delegirane obrade događaja (java.awt)– programer ne brine o petlji čekanja na događaje– programer samo piše metode za obradu događaja u klasama osluškivača
18.03.2015.SRGP - ulaz9
Prednosti i mane obrad e događaja
� Na višeprocesnim platformama prednost režima obrade događaja je velika– osim u kratkim intervalima nakon korisnikove intervencije
program čeka i ne troši CPU cikluse
� "Kucanje unapred" koje se često primenjuje kod standardnih U/I jedinica,ovde nije poželjno
– efekti su teško predvidivi ukoliko se ne dozvoli aplikaciji da restaurira prikaz iz modela pre sledeće akcije korisnika
18.03.2015.SRGP - ulaz10
SRGP - režim uzorkovanja
� Procedura za aktiviranje ili deaktiviranje uređajatypedef enum {NO_DEVICE, LOCATOR, KEYBOARD} InputDe vice;
typedef enum {INACTIVE, SAMPLE, EVENT} InputMode;
void SRGP_setInputMode( InputDevice inputDevice,
InputMode inputMode);
� Postavljanje lokatora u režim uzorkovanja:SRGP_setInputMode(LOCATOR, SAMPLE);
� Oba uređaja su na početku u režimu INACTIVE
� Tastatura se skoro uvek koristi u režimu događaja, iako i ona može da radi u režimu uzorkovanja
18.03.2015.SRGP - ulaz11
Mera lokatora
� Lokator je apstrakcija miša ili drugog pokazivačkog uređaja koja vraća:– poziciju kurzora kao par koordinata na ekranu (x,y) – position– id tastera koji je poslednji menjao stanje – buttonOfMostRecentTransition
(na osnovu ove informacije aplikacija zna koji taster je prouzrokovao događaj)– vektor stanja tastera (više tastera može biti simultano pritisnuto) – buttonChord
typedef struct{point position;int buttonOfMostRecentTransition;enum {UP,DOWN}buttonChord[MAX_BUTTON_COUNT]; /*typ.1 -3*/
} locatorMeasure;
� Ako je lokator postavljen u režim uzorkovanja, može se očitavati pomoću:SRGP_sampleLocator(locatorMeasure *measure);
18.03.2015.SRGP - ulaz12
Primer uzorkovanja (1)
� Prototipska aplikacija sa uzorkovanjem– crtanje traga pravougaone “četkice” dok se drži pritisnuto dugme lokatora
� Dve petlje– u prvoj se samo uzorkuje lokator
� dok se ne pritisne taster– u drugoj se crta popunjeni pravougaonik na tekućoj poziciji lokatora
� dok se pritisnuti taster ne otpusti
� Nedostatak:– gustina crtanih pravougaonika zavisi od brzine pomeranja lokatora
18.03.2015.SRGP - ulaz13
Primer uzorkovanja (2)
SRGP_setInputMode(LOCATOR,SAMPLE);/* uzorkovanje dok se taster ne pritisne */do {
SRGP_sampleLocator(&locMeasure);} while (locMeasure.buttonChord[0]==UP);/* petlja crtanja */do {
rect = SRGP_defRectangle(locMeasure.position.x – halfBrushWidth,locMeasure.position.y – halfBrushHeight,locMeasure.position.x + halfBrushWidth,locMeasure.position.y + halfBrushHeight);
SRGP_fillRectangle(rect);SRGP_sampleLocator(&locMeasure);
} while (locMeasure.buttonChord[0]==DOWN);
18.03.2015.SRGP - ulaz14
SRGP - režim obrade doga đaja
� Prethodni primer režima uzorkovanja pokazuje da se CPU vreme neracionalno troši
� Problem u višeprocesnim sistemima
� Druga petlja je bila potrebna – da bi se znala aktuelna pozicija kurzora na kojoj se crta pravougaonik
� Prva petlja nije potrebna – u njoj se samo čeka na događaj kojim započinje crtanje
� Režim obrade događaja se može koristiti kada se čeka na događaj– barem u prvoj petlji, mada može i u drugoj
18.03.2015.SRGP - ulaz15
Čekanje na doga đaj
� U svakom trenutku nakon aktiviranja uređaja u režimu događaja program može da ispita red događaja ulazeći u stanje čekanja:
InputDevice SRGP_waitEvent(int maxWaitTime);� Kontrola se vraća odmah ako red nije prazan,
inače se čeka maxWaitTime (u jedinicama )� Negativna vrednost maxWaitTime (konstanta INDEFINITE )
predstavlja beskonačno čekanje� Nula označava trenutni povratak bez obzira da li je red prazan � Funkcija vraća
– identitet uređaja koji je prouzrokovao događaj na početku reda– vrednost NO_DEVICEako je isteklo vreme čekanja, a red ostao prazan
� Nakon detekcije uređaja koji je uzrokovao događaj, potrebno je odrediti njegov tip
18.03.2015.SRGP - ulaz16
Uređaj tastature
� Okidački događaj zavisi od režima obrade u kojem se nalazi uređaj tastature
� Režim EDIT:– koristi se kada aplikacija treba da dobija znakovne niske– korisnik unosi i edituje niske (koristeći Backspace),
a tek Return (Enter) taster izaziva događaj– svi kontrolni tasteri, izuzev Backspace i Return, se ignorišu– postoji eho, a pozicija kurzora ukazuje na mesto sledećeg karaktera– Backspace pomera kurzor jednu poziciju unazad i briše karakter
� Režim RAW:– koristi se kada aplikacija dobija pojedinačne znakove– svaki pritisak na taster generiše događaj– nema razlike između kontrolnih i drugih znakova - svi se isporučuju aplikaciji– nema eha
18.03.2015.SRGP - ulaz17
Upravljanje režimom tastature
� Funkcija za postavljanje režima tastature:typedef enum {EDIT, RAW} KeyboardMode;void SRGP_setKeyboardProcessingMode(
KeyboardMode keyboardMode);� Kada SRGP_waitEvent vrati rezultat KEYBOARD,
aplikacija dobija meru pozivom:void SRGP_getKeyboard(char *measure,
int measureSize);� U režimu EDIT, mera je znakovna niska� U režimu RAW, mera je tačno jedan znak
18.03.2015.SRGP - ulaz18
Primer rada u EDIT režimu
� Brisanje niza fajlova čija se imena unose preko tastature– posle unetog imena fajla potrebno je pritisnuti EnterSRGP_setInputMode(KEYBOARD,EVENT);SRGP_setKeyboardProcessingMode(EDIT);pt = SRGP_defPoint(100,100);SRGP_text(pt, "Navedite jedan ili vise fajlova (jed an
po redu) za brisanje; prazan red za izlazak");/* glavna petlja za dogadjaje */do {
device=SRGP_waitEvent(INDEFINITE);SRGP_getKeyboard(measure, measureSize);if (*measure != NULL) DeleteFile(measure);
} while (*measure != NULL);
18.03.2015.SRGP - ulaz19
Lokatorski ure đaj
� Događaj sa lokatora je pritiskanje ili otpuštanje tastera� Kada SRGP_waitEvent vrati rezultat LOCATOR,
aplikacija dobija meru pozivom:void SRGP_getLocator(locatorMeasure *measure);
� Program saopštava SRGP koji tasteri lokatora generišu događaj pozivom:void SRGP_setLocatorButtonMask(int activeButtons);
18.03.2015.SRGP - ulaz20
Primer
� Korisnik specificira tačke u kojima se postavljaju markeri, dok ne klikne na "Quit" dugme:
const int BUTTON=0, QUIT_MASK=0x1; /* dugme 1 */crtanje na ekranu dugmeta Quit;SRGP_setLocatorButtonMask(QUIT_MASK);SRGP_setInputMode(LOCATOR,EVENT);terminate = FALSE;while (!terminate){
device=SRGP_waitEvent(INDEFINITE);SRGP_getLocator(&measure);if (measure.buttonChord[BUTTON]==DOWN){
if (pickedQuitButton(measure.position)) terminate=T RUE;else SRGP_marker(measure.position);
} // pickedQuitButton() poredi merenu poziciju } // sa granicama pravougaonika ekranskog tastera Qu it
18.03.2015.SRGP - ulaz21
Čekanje na više doga đaja (1)
� SRGP smešta u red čekanja događaje po hronološkom redosledu� Aplikacija uzima najraniji događaj iz reda čekanja
i određuje koji je uređaj prouzrokovao događaj� Primer:
– pritiskom na dugme lokatora 1 (npr. levi taster miša) postavlja se marker– pritiskom na dugme lokatora 3 ili dugmeta na tastaturi "Q" ili "q" – kraj)const int PLACE_BUTTON=0, PLACE_MASK=0x1,
QUIT_BUTTON=2, QUIT_MASK=0x4;generisanje početnog izgleda ekrana;SRGP_setInputMode(KEYBOARD,EVENT);SRGP_setKeyboardProcessingMode(EDIT);SRGP_setInputMode(LOCATOR,EVENT);SRGP_setLocatorButtonMask(PLACE_MASK | QUIT_MASK);
18.03.2015.SRGP - ulaz22
Čekanje na više doga đaja (2)
terminate = FALSE;while (!terminate){
device=SRGP_waitEvent(INDEFINITE);switch(device) {
case KEYBOARD:SRGP_getKeyboard(keyMeasure, 2);terminate= (keyMeasure[0]=='q')||
(keyMeasure[0]=='Q');break;
18.03.2015.SRGP - ulaz23
Čekanje na više doga đaja (3)
case LOCATOR:SRGP_getLocator(&locMeasure);switch (locMeasure.buttonOfMostRecentTransition){
case PLACE_BUTTON:if ((locMeasure.buttonChord[PLACE_BUTTON]== DOWN)
&& inDrawingArea(locMeasure.position))SRGP_marker(locMeasure.position);
break;case QUIT_BUTTON:
terminate=TRUE; break;} /* button switch */
} /* device switch */} /* while */
18.03.2015.SRGP - ulaz24
Pik-korelacija za obradu interakcija
� Kada korisnik pritisne taster lokatora – aplikacija mora tačno da odredi koji je objekat selektovan
� Ovo određivanje se naziva pik-korelacijom (pick correlation)� Većina objekata za selektovanje na ekranu
su pravougaonici paralelni osama (tasteri, meni-stavke)� Paket GEOM
– sadrži uslužne funkcije za aritmetiku koordinata– distribuira se uz SRGP
� Funkcija GEOM_pointInRect(point, rectangle) iz paketa GEOM– određuje da li tačka leži u datom pravougaoniku
� Pri kreiranju objekata aplikacija dodeljuje ID objektima koji kasnije vraća procedura pik-korelacije
� Primer: tipična aplikacija za slikanje – meni-traka (menu bar) na vrhu ekrana i radna površina (drawing area) ispod
18.03.2015.SRGP - ulaz25
Primer
� Funkcija CorrelateMenuBar poziva GEOM_pointInRectza svako zaglavlje u traci menija, da odredi ID izabranog menija
� Funkcija CorrelateDrawingArea mora biti sofističnija, jer ovde objekti mogu biti nepravougaoni, a mogu se i preklapati
void HighLevelInteractionHandler(locatorMeasure loc Measure}{if (GEOM_pointInRect(locMeasure.position, menuBarEx tent)) {
menuID=CorrelateMenuBar(locMeasure.position);if (menuID>0) {
chosenItemIndex=PerformPulldownMenuInteraction(menu ID);if (chosenItemIndex>0)
PerformActionChosenFromMenu(menuID,chosenItemIndex) ;}
} else { /* korisnik je birao objekat u radnoj povrsi ni */
objectID=CorrelateDrawingArea(locMeasure.position);if (objectID>0) ProcessObject(objectID);
}}
18.03.2015.SRGP - ulaz26
Postavljanje atributa i mera ure đaja
� Svaki ulazni uređaj ima vlastiti skup atributa
� Neki utiču na povratnu spregu uređaja prema korisniku
� I atributi ulaznih uređaja se postavljaju modalno, u proizvoljnom trenutku� Meru (vrednost) koju inače vraća ulazni uređaj,
može inicijalno da postavlja aplikacija� Za razliku od atributa ulaznih uređaja,
mera se postavlja na početnu uvek kada se uređaj deaktivira
18.03.2015.SRGP - ulaz27
Eho atributi lokatora
� Programer može da upravlja tipom eha i oblikom kurzora pomoću:typedef enum{NO_ECHO,CURSOR,RUBBER_LINE,RUBBER_RECT} EchoType;void SRGP_setLocatorEchoType(EchoType echoType);
� Podrazumevana početna vrednost je CURSOR� SRGP implementacije podržavaju tabelu oblika kurzora� Primena promene oblika kurzora:
– pri promeni regiona u kojem se nalazi kurzor – za povratnu spregu� Vrednosti eha RUBBER_LINEi RUBBER_RECT
– koriste se za crtanje linije i pravougaonika– sa ovim ehom SRGP crta kontinualno menjanu liniju ili pravougaonik
kako se lokator pomera– linija i pravougaonik se razvlače od početne tačke (sidrišta)
do tekuće pozicije lokatora� Sidrište je atribut koji se postavlja pozivom:
void SRGP_setLocatorEchoRubberAnchor(point position );
18.03.2015.SRGP - ulaz28
Kontrola mere lokatora
� Kada se lokator deaktivira – polje position mere lokatora se resetuje na centar ekrana
� Kada se lokator reaktivira, ako je eho uključen– zapaža se promena pozicije lokatora u odnosu na trenutak pre deaktiviranja
(pojavljuje se CURSORili pokretna tačka RUBBEReha na centru ekrana)� Postavljanje mere lokatora (pozicija lokatora) se postiže pozivom:
void SRGP_setLocatorMeasure(point position); � Ovo se koristi radi efekta kontinuiteta pozicije lokatora:
– pozicija se pamti pre deaktiviranja– pre novog aktiviranja stara pozicija se restaurira
� Postavljanje mere može da se obavi bilo da je lokator aktivan ili ne Postavljanje mere ima neposredni vizuelni efekat, ako je uređaj aktivan
– trenutno se menja eho (npr. pozicija kurzora)
18.03.2015.SRGP - ulaz29
Atributi tastature i kontrola mera
� Pozicija na kojoj se pojavljuje eho tastature je atribut� Atribut se postavlja pomoću:
void SRGP_setKeyboardEchoOrigin(point origin); � Mera tastature – niska znakova, takođe može da se postavlja
� Podrazumevano je prazna niska� Kada se tastatura deaktivira
– mera tastature se resetuje na praznu nisku� Neprazna početna niska je ponekad pogodna za korisnika
– tada može samo da se pritisne Enter ili da se najpre dotera niska� Mera tastature se postavlja pomoću:
void SRGP_setKeyboardMeasure(char *measure);