[ Atlantic777 @ 30.12.2009. 15:11 ] @
Pokušao sam da napravim neku simulaciju, računski deo, fizički model i sve ispod haube radi kako treba. Prešao sam na grafički deo, da te silne brojke i iscrtam, nešto sam već napravio i zapelo je kod sinusoide koja se kreće (iscrtava). Imam više ideja, a tražim ih još.

Cilj
Sinusoida koja se konstantno iscrtava nadesno
Period koji se prikazuje je konstantan

Prva stvar čega sam se setio je da u niz od recimo 256 celobrojnih vrednosti upisujem trenutnu vrednost veličine u datom trenutku. Tada će indeks elementa u nizu biti x koordinata, a vrednost smeštena pod tim indeksom je y koordinata. Isto važi za sve elemente niza, tako da samo farbam piksele sa tim koordinatama i eto mi sinusoide. Ok, to je to, ali pošto želim da se sinusoida kreće, potrebno je i da se elementi niza kreću.

Kako najjednostavnije postići da kada u niz dodam element sa indeksom 0, da novi element bude na početku niza, a sve ostale vrednosti se pomere za jedno mesto?

Ideja 1
Da kopiram pretposlednji element na mesto poslednjeg i tako unazad sve dok ne kopiram nulti na mesto prvog. Tada su mi prvi i drugi iste vrednosti i slobodno mogu pregaziti nulti element sa novom vrednošću. Najmanji mi je problem napisati ovakvu funkciju, nego... koliko je ovo zahtevno po procesor pošto mi je potrebna relativno velika brzina, simulacija se mora odvijati u realnom vremenu i trenutno je cilj 100 FPS, mada, mislim da nije potrebno čak toliko. Tačnije, svake sekunde sto puta izračunam trenutnu vrednost, odnosno potrebno mi je da dodajem i do 100 novih vrednosti u niz po ovom principu.

Ideja 2
Druga ideja je vezana za pointere. Početak niza pomerim za jedno mesto naniže, upišem element sa indeksom 0. Ostaje smeće pošto je dužina niza konstantna. Ok, nije problem i taj poslednji element da se briše, ali simulacija možda nekada treba da radi 2 dana, a u neke delove memorije se ne može upisivati, tako da mi se ovo baš i ne sviđa.

Pitanje
Šta onda da radim? Da ostavim ovako sa prvim rešenjem i sam implementiram funkciju ili možda takva funkcija već postoji u standardnim bibliotekama cpp-a? Čini mi se da je ova prva ideja isto što i rotiranje za jedno mesto nadesno i ubacivanje „novog“ nultog elementa. Ali... ima li šta kreativnije i praktičnije?

FILO stack mi izgleda kao moguće rešenje, mada se nikada nisam ozbiljno zanimao sa tom vrstom organizacije podataka i stvarno ne znam kako bi to trebalo da izgleda.
[ deerbeer @ 30.12.2009. 16:14 ] @
Citat:

Šta onda da radim? Da ostavim ovako sa prvim rešenjem i sam implementiram funkciju ili možda takva funkcija već postoji u standardnim bibliotekama cpp-a? Čini mi se da je ova prva ideja isto što i rotiranje za jedno mesto nadesno i ubacivanje „novog“ nultog elementa. Ali... ima li šta kreativnije i praktičnije?

FILO stack mi izgleda kao moguće rešenje, mada se nikada nisam ozbiljno zanimao sa tom vrstom organizacije podataka i stvarno ne znam kako bi to trebalo da izgleda.

Koristi std::dequeue jer ga mozes koristiti i za FIFO i za FILO , pa vidi sta ti vise odgovara ,
jer je malo besmisleno implementirati ovakve kontejnere jer vec postoje gotovi koji dobro rade .
http://en.wikipedia.org/wiki/Double-ended_queue

[ Atlantic777 @ 30.12.2009. 19:38 ] @
Ok, izgleda da je to to. :)

Za dequeue još nisam čuo, u članku sa ovog linka piše da je to skraćenica od double ended queue. Da li to ima ikakve veze sa listama? Evo držim u ruci c++ izvornik i tražim odgovarajuće poglavlje, i ovaj dequeue mi liči na povezane liste. Da li je to ista stvar ili samo liči? U redu, dalje ću već potražiti sam.

Hvala na savetu! :)
[ VladimirCDT @ 31.12.2009. 10:27 ] @
Meni se cini da sam ukapirao kako mislis da ti se sinusoida pomera, ali nisam bas siguran. :)
No, to je manje vazno, ja bih da ti napomenem par drugih stvari.

Kao prvo, nisam siguran da ti je potrebno 100 fps, ako je osvezavanje ekrana sporije od toga. U principu, gornja granica bi ti bila frekvencija osvezavanja ekrana. Medjutim, cak ni to nije nuzno postici, mislim da bi ti npr. 50 fps bilo savrseno dovoljno.

Druga stvar se tice crtanja. Po mom iskustvu, crtanje pixel po pixel je daleko sporije od iscrtavanja celih linija (lukovi, figure itd...). Takodje, u slucaju visoke amplitude sinusoide, u okolini n*PI, razmak izmedju susednih piksela je relativno velik i tada izmedju takva dva piksela imas prazan prostor po visini, bez obzira sto su im x koordinate susedne. Prema tome, potrebno je da izmedju dve susedne tacke iscrtas liniju, ne samo da imas dva piksela.

Medjutim, ni to nije bas najbrzi nacin za iscrtavanje, stavise ume da bude primetno spor. Ja se ne bavim grafikom, tako da ti ne mogu dati neki validan savet po tom pitanju. Ipak, iskreno bih ti preporucio da potrazis na netu neku pricu o tehnikama iscrtavanja takvih funkcija u realnom vremenu. Stavise, mozda nadjes negde i neku malu biblioteku otvorenog koda koja radi takve stvari efektno, dok je tvoj posao da se bavis samo simulacijom, ondnosno izracunavanjima. Problem je, verujem prilicno cest, tako da bi moglo nesto da se iskopa.

Sto se tice struktura podataka, u principu STL zavrsava stvar u vecini slucajeva. Postoji i stack, s tim sto je njegova implementacija odradjena uz koriscenje druge strukture (list, deque...) a koju ti zadajes. STL moze da bude problem samo tamo gde si zaista u problemu sa performansama i bijes se za svaki takt. Odnosno, udobnost rada sa STL-om placas odredjenim gubitkom na performansi. Medjutim, cak i tada je jedino brze imati neke strukture sa staticki odredjenim kapacitetom, bez ulancanih lista tj. staticke nizove i tek tada bi imalo smisla pisati sopstvene strukture. Verujem medjutim da se ti neces naci u takvoj vrsti problema, stoga udri po STL-u. :)

Pozz