OpenGL:n perusteet Osa 3: Teksturointi

Koko: px
Aloita esitys sivulta:

Download "OpenGL:n perusteet Osa 3: Teksturointi"

Transkriptio

1 OpenGL:n perusteet Osa 3: Teksturointi OpenGL on käyttöjärjestelmäriippumaton kirjasto 2D- ja 3D-grafiikan piirtoon. Tämä artikkelisarja opettaa sinulle 3D-grafiikan perusteet OpenGL:ää käyttäen. Esimerkeissä käytetään C\C++ kieltä. Tämä on artikkelisarjan kolmas osa. 1 Johdatus tekstuureihin Monitahokkaalla voidaan siis helposti jäljitellä kappaleen muotoa, mutta entäpä sen pintakuviota? Tietysti voimme värittää monitahokkaan glcolor3f()-funktion kutsuilla, mutta harvan kappaleen pinnan väritys on kauniin tasainen. Voisimme tietenkin jakaa monitahokkaan tahot yhä pienempiin ja pienempiin polygoneihin, jolloin saisimme aikaiseksi millaisen värikuvion tahansa, mutta vähänkään shakkilautaa monimutkaisemmissa kuvioissa polygonien määrä nousisi valtavan suureksi. Olisikin hyvä, jos voisimme päällystää monitahokkaan valmiilla kuvalla, joka sisältäisi tarvittavan pintakuvion. Juuri tätä varten ovat olemassa tekstuurit. Tekstuuri voidaan piirtää erikseen jollakin kuvankäsittelyohjelmalla tai se voidaan generoida ajon aikana. Esim. shakkilautakuvion tuottaminen algoritmillisesti ei ole kovin hankalaa. Asteroidin malli ilman tekstuuria ja sen kanssa. Oikealla käytetty tekstuuri. Kuinka sitten määritellään miten tekstuuri asettuu monitahokkaan pinnalle? Tämä tehdään tekstuurikoordinaattien avulla. Jokaiselle verteksille määritellään sen sijainnin lisäksi myös missä kohtaa tekstuuria se sijaitsee. Tekstuurin origo sijaitsee sen vasemmassa alakulmassa. X-akseli kasvaa oikealle ja Y-akseli ylöspäin. Siis tavallisen koordinaatiston tapaan. Huomattavaa kuitenkin on, että riippumatta tektuurin koosta tai sen leveyden ja korkeuden suhteesta oikean ylänurkan koordinaatit ovat aina ( 1, 1 ).

2 Tekstuurikoordinaatit annetaan OpenGL:lle gltexcoord2f()-funktiolla. Funktiota kutsutaan jokaiselle verteksille erikseen. Sen prototyyppi näyttää tältä: void gltexcoord2f(glfloat s, GLfloat t); s ja t ovat siis tekstuurikoordinaatin x ja y komponentit. Huomattavaa lisäksi on, että teksturointi täytyy myös laittaa päälle glenable()-funktiolla, jolle annetaan parametrina GL_TEXTURE_2D. Käytimme tässä siis 2D-tekstuureja. On myös muita tekstuurityyppejä kuten 1D-tekstuurit. Silloin koordinaatti annettaisiin funktiolla gltexcoord1f() ja teksturointi laitettaisiin päälle antamalla glenable()-funktiolle parametriksi GL_TEXTURE_1D. Kuten glvertex-sarjan funktiolla annetut koordinaatit kerrottiin modelview-matriisilla, niin gltexcoord-sarjan funktioilla annetut koordinaatit kerrotaan tekstuurimatriisilla. Tätä matriisia voi muokata samoin kuin modelview-matriisiakin. Tekstuurimatriisi valitaan glmatrixmode()-funktiolla, jolle annetaan parametrina GL_TEXTURE ja sitä voi muokata samoilla funktioilla kuin kaikkia muitakin matriiseja eli esim. gltranslatef() ja glrotatef(). Teksturoinnin hoitaa näytönohjaimen teksturointiyksikkö. Jotta teksturointi olisi mahdollista, pitää tekstuuri ensin sitoa tähän teksturointiyksikköön glbindtexture()- funktiolla. Sen prototyyppi näyttää tältä. void glbindtexture(glenum target, GLuint texture);

3 Target on sidottavan tekstuurin tyyppi ja texture sen tunnus. Vain yksi tekstuuri voi olla sidottuna kerrallaan (tästä on tosin poikkeus, josta puhumme kappaleessa 8)! Kun polygoni piirretään, teksturoidaan se sillä tekstuurilla, joka on sillä hetkellä sidottuna teksturointiyksikköön. Myös kaikki tekstuureihin vaikuttavat funktiot, joista tässä artikkelissa puhumme vaikuttavat siihen tekstuuriin, joka on sillä hetkellä sidottuna. 2 Tekstuuriobjektit OpenGL:ssä tekstuurit ovat näytönohjaimen muistissa sijaitsevia objekteja, jotka täytyy luoda ennen käyttöä. Tekstuurin luominen tehdään funktiolla glgentextures(). Sen prototyyppi näyttää tältä: void glgentextures(glsizei n, GLuint *textures); Parametri n kertoo kuinka monta tekstuuriobjektia luodaan ja parametri textures on osoitin taulukkoon, johon luotujen tekstuurien tunnukset laitetaan. Luotu tekstuuri on kuitenkin tyhjä, eikä sisällä mitään dataa. Jos kokeilisit teksturoida tyhjällä tekstuurilla saisit tulokseksi pelkkää valkoista väriä. Niinpä tekstuuriin täytyy ladata dataa. OpenGL:ssä on useita eri tekstuurityyppejä, mutta hyödyllisin niistä on 2D-tekstuuri, joka vastaa tavallista kuvaa. Tällainen tekstuuridata ladataan funktiolla glteximage2d(). Prototyyppi on tämän näköinen: void glteximage2d( GLenum target, GLint level, GLint components, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type,

4 const GLvoid *pixels); Parametrin target arvon pitää olla aina GL_TEXTURE_2D. Parametrien level ja border arvojen pitää olla nolla. Components kertoo tekstuuriin tulevien värikomponenttien määrän. Tämä on yleensä 3 (RGB). Joskus myös 4 (RGBA), jos alphakanava on mukana, mutta siitä enemmän kappaleessa läpinäkyvyys. Width ja height kertovat tekstuurin leveyden ja korkeuden. Näiden lukujen täytyy olla kakkosen potensseja eli 32, 64, 128, 256 jne. Näillä arvoilla on myös jokin yläraja, jonka saat selville funktiolla glgetintegerv(), parametrilla GL_MAX_TEXTURE_SIZE. Hyvin vanhoissa näytönohjaimissa raja on 256, kun taas uusissa 4096 tai jopa enemmän. Format kertoo tekstuurin datan muodon. Tämä on joko GL_RGB tai GL_RGBA jos alphakin on mukana. Viimeinen parametri on osoitin varsinaiseen ladattavaan dataan, joka on esim. piirretty kuvankäsittelyohjelmalla tai generoitu jollakin algoritmilla. Type-parametri kertoo tämän datan tyypin. Vaihtoehdot ovat: GL_UNSIGNED_BYTE, GL_BYTE, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, ja GL_FLOAT. Ladattavan datan pitää sisältää tekstuurin kaikkien pikselien värit tyyliin RGBRGBRGB... jne. Eli ensimmäisen pikselin värin Red, Green ja Blue komponentit, sitten seuraavan jne. Jos tekstuurissa on alphakanava mukana, pitää datan taas olla muodossa RGBARGBARGBA... jne. Jos datan tyyppi on GL_FLOAT pitää näiden arvojen olla välillä 0-1. Muuten suurin käytetyllä tyypillä esitettävissä oleva luku tulkitaan luvuksi 1 ja pienin luvuksi 0. Huomaa, että data ladataan siihen tekstuuriin, joka on sillä hetkellä sidottuna teksturointiyksikköön. Jos tekstuuri sisältää jo dataa, korvautuu se uudella. Kun tekstuuri käy turhaksi, se voidaan poistaa funktiolla gldeletetextures(glsizei n, const GLuint * textures). Parametrien merkitykset ovat samat kuin glgentextures()- funktiossakin, eli poistettavien tekstuurien määrä ja osoitin taulukkoon, joka sisältää poistettavien tekstuurien tunnukset.

5 3 Tekstuurin reunat ja suodatus Mitä mahtaakaan tapahtua, jos annetut tekstuurikoordinaatit menevät tekstuurin reunojen ulkopuolelle? Sen voit valita itse. Vaihtoehdot ovat joko korvata ulkopuoliset pikselit jollain vakio värillä (mustalla), korvata ne lähimmällä reunapikselillä tai alkaa toistaa pikseleitä tekstuurin toisesta reunasta. Reunakäyttäytyminen asetetaan funktiolla gltexparameteri(). Prototyyppi näyttää tältä: void gltexparameteri( GLenum target, GLenum pname, GLint param ); Ensimmäinen parametri on tekstuurin tyyppi (tässä tapauksessa GL_TEXTURE_2D). Toisen parametrin on oltava GL_TEXTURE_WRAP_S tai GL_TEXTURE_WRAP_T. Se ilmaisee asetetaanko käyttäytyminen vaaka vai pystyakselille. Voit siis laittaa kummallekkin akselille erilaisen. Viimeinen parametri on GL_CLAMP, GL_CLAMP_TO_EDGE, tai GL_REPEAT. Vaihtoehdot on kuvattu alla olevassa kuvassa. 3D-korttien alkuaikoina oli Voodoo-korttien ajureissa bugi, jonka takia GL_CLAMP käyttäytyi samoin kuin GL_CLAMP_TO_EDGE. Monet sovelluksen tekijät luottivat sokeasti tähän käyttäytymiseen tarkistamatta asiaa dokumentaatiosta ja näin ollen kun ohjelmia käytettiin korteilla, joissa tätä bugia ei ollut, oli grafiikka joskus virheellistä. Tämän ja sen takia, että GL_CLAMP:n oikeaoppinen käyttäytyminen on käytännössä hyödytön, monet näytönohjainvalmistajat jättivät mahdollisuuden laittaa tämä bugi päälle omissa näytönohjaimissaan.

6 Mahdollisuus laittaa GL_CLAMP-bugi päälle GeForce4-kortin ajureissa. Kun teksturoitua kappaletta katsotaan niin läheltä, että yksi tekstuurin kuvapiste eli tekseli näyttää suuremmalta kuin pikseli, kuva ns. puuroutuu eli muuttuu (lego)palikkamaiseksi. Asia voidaan korjata suodatuksella, joka saadaan päälle tutulla gltexparameteri()-funktiolla, joka saa toisena parametrinaan GL_TEXTURE_MAG_FILTER ja viimeisenä parametrinaan joko GL_NEAREST, jos suodatus halutaan pois päältä, tai GL_LINEAR jos suodatus halutaan päälle. Oletuksena suodatus on jo valmiina päällä. Vasemmalla ilman suodatusta ja oikealla sen kanssa. Vastaavasti kun kappale on niin kaukana, että yhden pikselin alalle mahtuu monta tekseliä alkaa kuva vilkkua. Tähänkin ongelmaan on ratkaisu. Sitä kutsutaan termillä mipmapping. Ideana on tallentaa tekstuurista monta erikokoista versiota ja valita niistä sitten se, joka lähinnä vastaa oikeaa kokoa. Mipmapping asetetaan päälle gltexparameteri()-funktiolla. Tällä kertaa keskimmäisenä parametrina on GL_TEXTURE_MIN_FILTER ja viimeisenä GL_LINEAR_MIPMAP_LINEAR. Lisäksi meidän on generoitava mipmap:it. OpenGL osaa tehdä tämän automaattisesti useammallakin eri tavalla, mutta helpoimmalla pääset kun lataat datan glteximage2d()- funktion sijasta glubuild2dmipmaps()-funktiolla. Sen prototyyppi on seuraavanlainen. int glubuild2dmipmaps(

7 GLenum target, GLint components, GLint width, GLint height, GLenum format, GLenum type, const void * data ); Parametrien merkitykset ovat samat kuin glteximage2d()-funktiollakin. 4 Läpinäkyvyys Vasemmalla ilman mipmap:eja ja oikealla niiden kanssa. Yksi kysymys, joka usein nousee esille on, kuinka jokin tietty tekstuurin väri saadaan läpinäkyväksi. Mitään väriä ei voida suoraan asettaa läpinäkyväksi, vaan värille täytyy määrittää tavallisten red, green ja blue komponenttien lisäksi vielä neljäs läpinäkyvyyskomponentti eli ns. alphakomponentti. Useimmat kuvankäsittelyohjelmat kuten Paint Shop Pro ja Photo Shop tukevat alphakanavaa. Kuvaformaateista esim. TGA ja PNG tukevat alphakanavaa. Voit myös generoida alphakanavan ajon aikana. Kun lataat tekstuurin, testaa onko pikselin väri se, jonka haluat läpinäkyväksi. Jos on aseta sen alpha nollaksi, muuten ykköseksi (tai jos et käytä GL_FLOAT-tyyppiä, niin käyttämäsi tyypin maksimi arvoon).

8 Kuvassa vasemmalla tekstuuri, joka sisältää kuvan avaruushirviöstä. Keskellä tämän tekstuurin alphakanava. Oikealla tekstuuri piirretty taustan päälle, niin että pikselit joiden alphan arvo on pienempi kuin 0.5 (musta) on jätetty piirtämättä. On kaksi tapaa saada aikaan läpinäkyvyys alphan avulla. Ne ovat GL_ALPHA_TEST ja GL_BLEND. Ne voidaan laittaa päälle glenable()-funktiolla antamalla kyseinen symboli parametrina. GL_ALPHA_TEST:n ideana on asettaa funktio, joka joko hyväksyy tai hylkää pikselin sen alphan arvon perusteella. Tämä funktio asetetaan glalphafunc()-funktiolla. Sen prototyyppi näyttää tältä: void glalphafunc(glenum func, GLclampf ref); Ensimmäinen parametri kertoo funktion. Sen mahdolliset arvot ovat GL_NEVER, GL_LESS, GL_EQUAL, GL_GREATER ja GL_ALWAYS. Nimestä pystyy helposti näkemään mitä ne tekevät. Viimeinen kertoo tämän funktion käyttämän vertailuarvon. Esim. jos haluaisimme, että pikseli piirretään vain kun sen alphan arvo on yli 0.5 käyttäisimme kutsua glalphafunc(gl_greater, 0.5);. GL_BLEND:n idea on hieman erilainen. Siinä pikselin lopullinen väri lasketaan sen alkuperäisestä väristä ja ikkunassa pikselin paikalla olevan aikaisemman pikselin väristä. Lopullinen väri lasketaan kaavalla S*uusiPikseli+D*vanhaPikseli. Parametrit S ja D asetetaan funktiolla glblendfunc(). Prototyyppi on seuraavan näköinen: glblendfunc(glenum sfactor, GLenum dfactor);

9 sfactor asettaa S parametrin ja sfactor D parametrin. Kummatkin arvot on valittava seuraavista: GL_ZERO, GL_ONE, GL_DST_COLOR, GL_SRC_COLOR, GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA ja GL_ONE_MINUS_DST_ALPHA. Nimistä on helppo päätellä mitä ne ovat, kun panet merkille, että SCR tarkoittaa uutta pikseliä ja DST vanhaa pikseliä. Esim. jos haluaisimme tekstuurin alphakanavan määräävän pikselin läpinäkyvyyden käyttäisimme kutsua: glblendfunc(gl_scr_alpha, GL_ONE_MINUS_SCR_ALPHA). GL_BLEND siis mahdollistaa osittaisen läpinäkyvyyden toisin kuin GL_ALPHA_TEST. GL_ALPHA_TEST:llä ja GL_BLEND:llä on vielä yksi merkittävä ero. GL_ALPHA_TEST nimittäin jättää läpinäkyvät pikselit piirtämättä syvyyspuskuriin, kun taas GL_BLEND piirtää kaikki pikselit syvyyspuskuriin. Myös täysin läpinäkyvät. Olettaen tietenkin, että GL_DEPTH_TEST on päällä. Kaksiulotteista teksturoitua suorakaiteen muotoista osittain läpinäkyvää polygonia kutsutaan joskus kuvahahmoksi (englanniksi sprite). Ne ovat varsin käytännöllisia 2Dgrafiikassa. Kaksiulotteisten kuvien piirtoon löytyy OpenGL.stä ihan oma funktionsa: glbitmap(), mutta se on hitaampi ja vähemmän käytännöllinen kuin teksturoidun nelikulmion piirto, joten en suosittele sen käyttöä. 5 Texture environment Polygoneillehan voitiin määrätä väri glcolor3f()-funktiolla, mutta kuinka tämä väri sitten yhdistyy tekstuurin väriin? Tästä asiasta huolehtii texture environment. Texture environment on itse asiassa funktio, joka saa syötteenään varsinaisen värin ja tekstuurin värin ja laskee näistä pikselin lopullisen värin. Tämä funktio pitää valita muutamasta valmiista vaihtoehdosta. Texture environment:in funktio valitaan funktiolla gltexenvi(), jonka prototyyppi näyttää tältä: void gltexenvi(glenum target, GLenum pname, GLint param);

10 Ensimmäisen parametrin arvon on aina oltava GL_TEXTURE_ENV ja toisen GL_TEXTURE_ENV_MODE. Kolmas on asetettava funktio. Sen mahdolliset arvot ovat: GL_MODULATE, GL_DECAL ja GL_ADD. GL_MODULATE kertoo värit keskenään ja GL_ADD taas laskee ne yhteen. GL_DECAL sen sijaan interpoloi näiden arvojen välillä käyttäen viitteenä tekstuurin alphakanavaa. Alphan arvolla yksi väri on tekstuurin väri ja arvolla nolla varsinainen väri. Muilla arvoilla jossakin tässä välissä. Jos tekstuurissa ei ole alphakanavaa, katsotaan alphan arvon olevan yksi. 6 OpenGL:n laajennukset Ennen kuin voimme jatkaa, pitää meidän puhua jokunen sana OpenGL:n laajennuksista (englanniksi extensions). Näytönohjaimet kehittyvät koko ajan ja niihin ilmestyy uusia ominaisuuksia. Tämän takia myös niitä käyttävien rajapintojen on kehityttävä mukana. Direct3D:n tapauksessa tämä on ratkaistu julkaisemalla siitä uusi versio vuoden parin välein. Tällä uudella versiolla ei ole välttämättä mitään yhteistä vanhan kanssa ja koko rajapinta on pahimmillaan opeteltava uudestaan. OpenGL:ssä sen sijaan rakennetaan vanhan päälle. Aina, kun jokin uusi ominaisuus ilmestyy näytönohjaimiin, julkaistaan siitä laajennus OpenGL:ään. Laajennus tuo mukanaan nipun uusia funktioita ja/tai uusia parametrejä vanhoihin funktioihin. Joskus ei kumpaakaan. Laajennuksista pitää kirjaa SGI:n laajennusrekisteri osoitteessa:

11 Lisäksi kaikkien näytönohjainvalmistajien kotisivuilta on löytyy sama rekisteri. Voidaksesi käyttää laajennuksia tarvitset myös uuden otsikkotiedoston glext.h. Saat sen osoitteesta: Se mitä laajennuksia käytössä on, riippuu koneen näytönohjaimesta. Uudet näytönohjaimet tukevat lähes kaikkia laajennuksia, kun taas hyvin vanhat vain muutamaa. Saat selville tuetut laajennukset funktiolla glgetstring(), jolle annetaan parametrinä GL_EXTENSIONS. Se palauttaa osoittimen merkkijonoon, joka sisältää kaikkien tuettujen laajennusten nimet välilyönnillä eroteltuna. Laajennus ei siis tuo välttämättä mitään uusia funktioita tai parametrejä. Se vain sallii jotain sellaista, joka oli aikaisemmin kiellettyä. Hyvä esimerkki tästä on ARB_texture_non_power_of_two-laajennus, joka sallii käytettävän tekstuureja, joiden koko ei ole kakkosen potenssi. Eli jos glgetstring(gl_extensions) palauttamassa merkkijonossa esiintyy nimi GL_ARB_texture_non_power_of_two voit käyttää minkä kokoisia tekstuureja tahansa. Jos taas laajennus tuo uusia parametrejä ei laajennuksen käyttö ole hankalaa silloinkaan. Kaikki uudet symbolit on nimittäin määritelty tiedostossa glext.h. Hyvä esimerkki tällaisesta laajennuksesta on GL_ARB_texture_env_combine-laajennos, joka tuo texture environment:iin rutkasti lisää vaihtoehtoja perinteisten GL_MODULATE:n ja GL_ADD:n lisäksi. Vasta, kun laajennus tuo mukanaan uusia funktioita, on laajennuksen käyttö hieman hankalampaa. Funktioihin pitää nimittäin käydä noutamassa osoittimet. wglgetprocaddress() funktiolla. Sen prototyyppi näyttää tältä: PROC wglgetprocaddress( LPCSTR lpszproc //Name of the extension function ); Eli sille annetaan parametrinä uuden funktion nimi ja se palauttaa osoittimen siihen.

12 Laajennuksia on tällä hetkellä useampi sata, joten niiden hallinnointi käsin alkaa olla sulaa hulluutta. Tämän takia netti on pullollaan erilaisia kirjastoja laajennusten hallintaan. Niiden periaate on, että ne tarjoavat jonkin helppokäyttöisen funktion, joka lataa yhdellä kutsulla osoittimet kaikkiin näytönohjaimen tukemiin laajennuksiin. Lisäksi laajennusten dokumentaatiot on laadittu niin, että on mahdollista laatia ohjelma, joka generoi tarvittavan alustuskoodin pelkkää dokumenttia tutkimalla. Myös tälläisia ohjelmia löytyy valmiina paljon. Yksi hyvä on GLEW: Huomaa vielä, että jokaisella laajennuksen nimellä on jokin etuliite. Esim. ARB, EXT, NV tai ATI. ARB ja EXT ovat laajennuksia, joita kaikkien näytönohjainvalmistajien kortit tukevat. Kun taas muut ovat valmistajakohtaisia laajennuksia. Vältä niiden käyttöä, sillä ne ovat tuettuja yleensä vain yhden valmistajan kortilla. Pyri käyttämään ensisijaisesti ARB-laajennuksia ja toissijaisesti EXT-laajennuksia. 7 Eksoottisemmat tekstuurimuodot 1D- ja 2D-tekstuurien lisäksi OpenGL:ssä kaksi muutakin tekstuurimuotoa: 3D-tekstuurit (GL_TEXTURE_3D_EXT) ja cubemap-tekstuurit (GL_CUBE_MAP_EXT). Kummatkin nämä tekstuurimuodot ovat laajennuksia eli sinun pitää tarkistaa ennen niiden käyttöä, että käytössä oleva näytönohjain tukee niitä D-tekstuurit 3D-tekstuurit ovat looginen jatko 1D- ja 2D-tekstuureille. 3D tekstuurit ovat laajennus OpenGL:ään ja tämän laajennuksen nimi on GL_EXT_texture3D. Eli niitä voidaan käyttää vain, jos glgetstring(gl_extensions)-kutsun palauttama merkkijono sisältää kyseisen nimen. Tämä laajennus tuo mukanaan yhden uuden funktion glteximage3dext(), jonka prototyyppi näyttää tältä: void glteximage3dext(enum target, int level, enum internalformat, sizei width,

13 sizei height, sizei depth, int border, enum format, enum type, const void* pixels); Meidän tarvitsee siis hakea osoitin tähän funktioon ennen sen käyttöä. Se tehdään seuraavasti: void (*glteximage3dext)(enum, int, enum, sizei, sizei, sizei, int, enum, enum, const void*)= wglgetprocaddress("glteximage3dext "); Jätin tyyppimuunnoksen selkeyden vuoksi tekemättä. Kun osoitin on haettu voidaan funktiota käyttää normaalisti. glteximage3dext()-funktio toimii aivan samoin kuin glteximage1d() ja glteximage2d():kin. Siinä vain on tekstuurin leveyden ja korkeuden lisäksi mukana syvyys. Lisäksi tekstuurikoorndinaatit pitää antaa gltexcoord3f()- funktiolla ja teksturointi laittaa päälle kutsulla glenable(gl_texture_3d_ext);. 7.2 Cube map-tekstuurit "Cube map"-tekstuuri on nimensä mukaisesti kuution muotoinen tekstuuri. Se muodostuu kuudesta eri 2D-tekstuurista, joista jokainen muodostaa kuution yhden sivun. Myös cube map on laajennus. Sen nimi on ARB_texture_cube_map. Cube map ei tuo uusia funktioita ainoastaan uusia parametrejä. Data cube map:iin ladataan glteximage2d()-funktiolla. Ainoa ero on, että ensimmäiseksi parametriksi tulee GL_TEXTURE_2D:n sijaan TEXTURE_CUBE_MAP_POSITIVE_X_ARB, TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB,

14 TEXTURE_CUBE_MAP_POSITIVE_Z_ARB tai TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB, riippuen siitä mikä kuution kuudesta eri sivusta halutaan asettaa. Vastaavasti cube map teksturointi laitetaan päälle glenable()- functiolla, jolle annetaan parametrina TEXTURE_CUBE_MAP_ARB. Tekstuurikoordinaatit toimivat cube map:issa hieman oudosti. Tekstuurikoordinaatti annetaan gltexcoord3f()-funktiolla, mutta koordinaattia vastaa kuutiolla piste, joka saadaan kuution keskipisteestä lähtevän gltexcoord3f()-funktiolla annetun vektorin suuntaisen suoran ja kuution leikkauspisteestä. 8 Multiteksturointi Multiteksturointi tarkoittaa mahdollisuutta päällystää polygoni usealla tekstuurilla yhtä aikaa. Näytönohjaimissa on ns. teksturointiyksikköjä, joista jokaiseen voi sitoa oman tekstuurin. Kun pikseli sitten piirretään vaikuttaa sen väriin jokainen teksturointiyksikkö. Teksturointiyksiköiden määrää kutsutaan näytönohjaimen pikseliliukuhihnan pituudeksi ja näytönohjainvalmistajat kilpailevat sen pituudella. Nykyisissä näytönohjaimissa voi olla jopa 8-16 teksturointiyksikköä, kun taas vanhoissa yleensä vain 2-4. Saat selville näytönohjaimen teksturointiyksiköiden määrän glgetintegerv()-funktiolla, jolle annetaan parametrina GL_MAX_TEXTURE_UNITS_ARB. Kuten muutkin nykyiset hienoudet on myös multiteksturointi laajennus. Multiteksturointi tuo OpenGL:ään useitakin uusia funktioita kuten: void glmultitexcoord1farb(enum texture, GLfloat s), void

15 glmultitexcoord2farb(enum texture, GLfloat s, GLfloat t), ja void glactivetexturearb(enum texture);. Jokaiseen teksturointiyksikköön voi olla sidottuna kerrallaan yksi tekstuuri. glbindtexture() sitoo tekstuurin kulloinkin aktiivisena olevaan teksturointi yksikköön. Yksi teksturointiyksiköistä voi olla aktiivisena kerrallaan ja aktiivinen yksikkö valitaan glactivetexturearb()-funktiolla, joka saa syötteenään GL_TEXTURE0_ARB, GL_TEXTURE1_ARB, GL_TEXTURE2_ARB jne. eli aktivoitavan teksturointi yksikön. Huomaa myös, että kutsu glenable(gl_texture_2d) laittaa teksturoinnin päälle siihen teksturointiyksikköön, joka on sillä hetkellä aktiivisena, eli funktiota on kutsuttava jokaiselle teksturointiyksikölle erikseen. Tekstuurikoordinaatit vuorostaan annetaan glmultitexcoord2farb()-funktiolla. Sen ensimmäinen parametri kertoo teksturointiyksikön samoin kuin glactivetexturearb()- funktiollakin ja loput tekstuurikoordinaatit. gltexcoord2f()-funktion kutsu vastaa glmultitexcoord2farb()-funktion kutsua, jonka ensimmäinen parametri on GL_TEXTURE0_ARB. Vielä viimeinen ongelma on, mikä sitten määrää kuinka nämä tekstuurit yhdistyvät? Vastaus on tietenkin teksture environment. gltextureenvi()-funktio asettaa texture environment funktion aktivoituna olevaan teksturointiyksikköön. Jokaisella teksturointiyksiköllä on siis oma texture environment funktio. Kun pikseli piirretään saa se aluksi glcolor3f()-funktiolla annetun värin. Sen jälkeen pikselin väriin vaikuttaa vuoronperään jokainen teksturointiyksikkö, jolle teksturointi on laitettu päälle, omalla texture environment funktiollaan. 9 Esimerkkiohjelma Vaikka tässä artikkelissa puhuimmekin OpenGL:än laajennuksista ja monista edistyneimmistä teksturointitekniikoista on esimerkkiohjelma varsin yksinkertainen. Se lataa levyltä kaksi tekstuuria tiedostoista alien.kuva ja tausta.kuva. Ohjelma piirtää kaksi nelikulmaista polygonia, joista toisen se teksturoi alien-tekstuurilla ja toisen tausta-

16 tekstuurillla. Data näissä tiedostoissa on ns. raakamuodossa eli se voidaan antaa sellaisenaan glteximage2d()-funktiolle. raakadatakuvia voi tallentaa yleisimmillä kuvankäsittelyohjelmilla. Tälläisten raakatiedostojen käyttö ei kuitenkaan ole suositeltavaa sillä ne eivät ole mitään standartiformaatteja ja ne eivät sisällä esimerkiksi tietoa kuvan koosta, joten se on tiedettävä erikseen. Yleensä kannattaakin käyttää jotain hyvää standardia tiedostomuotoa kuten TGA tai PNG. Näiden formaattien lataamisesta voisi kuitenkin kirjoittaa vaikka oman artikkelinsa, joten käytän tässä helpompaa raakadataformaattia. On olemassa valmiita kirjastoja, jotka osaavat lukea lukuisia kuvaformaaatteja. Yksi hyvä tällainen on Devil. Saadaksesi esimerkkiohjelman toimimaan sinun tarvitsee imuroida kuvatiedostot. Voit tehdä sen tästä: Paketti sisältää myös oheisen lähdekoodin ja valmiiksi käännetyn version. #include <windows.h> #include <stdio.h> #include <math.h> #include <gl\gl.h> #include <gl\glu.h> //#include <gl\glext> // Ei tarvita tässä ohjelmassa // Määrittele laitekonteksti globaaliksi sitä nimittäin tarvitaan myös pääfunktiossa. HDC hdc; // Viestinkäsittelijä LRESULT CALLBACK WindowProc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) switch (umsg) // Koska piirrämme ikkunan sisällön pääsilmukassa jatkuvasti uudelleen // reakoimme WM_PAINT-viestiin vain tyhjentämällä ikkunan mustaksi. case WM_PAINT: PAINTSTRUCT p; BeginPaint(hwnd, &p); glclear(gl_color_buffer_bit); SwapBuffers(hdc); EndPaint(hwnd, &p); return 0; // Ikkuna yritetään sulkea kutsu PostQuitMessage()-funktiota. case WM_CLOSE: PostQuitMessage(0);

17 return 0; // Käsittele myös WM_SIZE se lähetetään ikkunalle aina kun sen kokoa muutetaan. // Tämä on oiva tilaisuus muuttaa viewport // oikean kokoiseksi peittämään koko ikkuna. case WM_SIZE: // Ikkunan uusi koko saadaan lparam parametrista LOWORD ja HIWORD makroilla. glviewport(0, 0, LOWORD(lParam), HIWORD(lParam)); return 0; // Viestiä ei käsitelty kutsu DefWindowProc()-funktiota. return DefWindowProc(hwnd, umsg, wparam, lparam); int luoikkuna(unsigned int leveys, unsigned int korkeus, char *otsikko) // Rekisteröi ikkunaluokka WNDCLASS wc; memset(&wc, 0, sizeof(wndclass)); wc.style = CS_HREDRAW CS_VREDRAW CS_OWNDC; wc.hcursor= LoadCursor(NULL, IDC_ARROW); wc.lpfnwndproc = (WNDPROC) WindowProc; wc.hinstance = GetModuleHandle(NULL); wc.lpszclassname = "OpenGLtutoriaali"; if (!RegisterClass(&wc)) return 0; // Luo ikkuna RECT r; r.left=getsystemmetrics(sm_cxscreen)/2-leveys/2; r.top=getsystemmetrics(sm_cyscreen)/2-korkeus/2; r.right=r.left+leveys; r.bottom=r.top+korkeus; AdjustWindowRectEx(&r, WS_CLIPSIBLINGS WS_CLIPCHILDREN WS_OVERLAPPEDWINDOW, FALSE, WS_EX_APPWINDOW); HWND hwnd; hwnd=createwindowex(ws_ex_appwindow, "OpenGLtutoriaali", otsikko, WS_CLIPSIBLINGS WS_CLIPCHILDREN WS_OVERLAPPEDWINDOW, r.left, r.top, r.right-r.left, r.bottom-r.top, NULL, NULL, GetModuleHandle(NULL), NULL); // Luo laitekonteksti hdc=getdc(hwnd); if (!hdc) return 0; // Valitse pikseliformaatti PIXELFORMATDESCRIPTOR pfd; memset(&pfd, 0, sizeof(pixelformatdescriptor)); pfd.nsize=sizeof(pixelformatdescriptor);

18 pfd.nversion=1; pfd.dwflags=pfd_draw_to_window PFD_SUPPORT_OPENGL PFD_DOUBLEBUFFER; pfd.ipixeltype=pfd_type_rgba; pfd.credbits=8; pfd.cgreenbits=8; pfd.cbluebits=8; pfd.calphabits=8; pfd.cstencilbits=8; pfd.cdepthbits=16; pfd.ilayertype=pfd_main_plane; int pixelformat; pixelformat=choosepixelformat(hdc, &pfd); if (!pixelformat) return 0; if (!SetPixelFormat(hdc, pixelformat, &pfd)) return 0; // Luo renderöintikonteksti HGLRC hrc; hrc=wglcreatecontext(hdc); if (!hrc) return 0; if (!wglmakecurrent(hdc, hrc)) return 0; // Tuo ikkuna näkyviin ShowWindow(hwnd, SW_SHOW); SetForegroundWindow(hwnd); SetFocus(hwnd); // Palauta onnistuminen return 1; // Pääfunktio int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) unsigned char *data; float angle=0; GLuint taustatekstuuri=0; GLuint alientekstuuri=0; FILE *tiedosto=null; unsigned int aika; unsigned int piirtoaika; unsigned int alkuaika; // Luo ikkuna if (!luoikkuna(800, 600, "OpenGL:n perusteet - Osa 3: Teksturointi")) return 0; // Varaa muistia väliaikaiselle datalle data=(unsigned char *)malloc(256*256*4*sizeof(unsigned char)); if (!data) return 0; // luo yksi tekstuuriobjekti glgentextures(1, &taustatekstuuri);

19 // Sido äsken luotu tekstuuri teksturointiyksikköön glbindtexture(gl_texture_2d, taustatekstuuri); // Lataa kuvadata tiedostosta. tiedosto=fopen("tausta.kuva", "rb"); if (!tiedosto) return 0; fread(data, 3, 128*128, tiedosto); fclose(tiedosto); // Lataa data tekstuuriin glteximage2d(gl_texture_2d, 0, 3, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE, data); // Suodatus päälle gltexparameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gltexparameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // luo yksi tekstuuriobjekti glgentextures(1, &alientekstuuri); // Sido äsken luotu tekstuuri teksturointiyksikköön glbindtexture(gl_texture_2d, alientekstuuri); // Lataa kuvadata tiedostosta tiedosto=fopen("alien.kuva", "rb"); if (!tiedosto) return 0; fread(data, 4, 256*256, tiedosto); fclose(tiedosto); // Lataa data tekstuuriin. Huomaa, että tässä on nyt alpha mukana! glteximage2d(gl_texture_2d, 0, 4, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); // Suodatus päälle gltexparameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gltexparameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Vapauta väliaikainen data free(data); // Teksturointi päälle glenable(gl_texture_2d); // Viestinkäsittelysilmukka alkuaika=gettickcount(); MSG msg; while(1) if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) if (msg.message==wm_quit) break; TranslateMessage(&msg); DispatchMessage(&msg); else // Käytämme GetTickCount()-funktiota, joka palauttaa ajan millisekunneissa, // laskemaan kuvan piirtämiseen kuluneen ajan. // Näin voimme ajastaa alienin pyörimään samalla nopeudella kaikilla kokeilla. aika=gettickcount(); piirtoaika=aika-alkuaika; if (piirtoaika>0)

20 alkuaika=aika; // Kasvata pyörityskulmaa hieman seuraavaa framea varten. // Alien pyörii nyt 0.06 astetta millisekunnissa // eli 1 kierroksen 6 sekunnissa angle+=0.06*piirtoaika; // Tyhjennä puskuri glclear(gl_color_buffer_bit); // Piirretään ensin tausta // Luo 2D koordinaatisto glmatrixmode(gl_projection); glloadidentity(); gluortho2d(0, 800, 0, 600); // Aseta modelview-matriisi glmatrixmode(gl_modelview); glloadidentity(); // Aseta tekstuurimatriisi niin, että taustaan saadaan hieman liikettä. glmatrixmode(gl_texture); glloadidentity(); gltranslatef(sin(0.01*angle), cos(0.01*angle), 0); // Ota alpha test pois päältä sitä ei tarvita taustassa gldisable(gl_alpha_test); // Sido taustatekstuuri glbindtexture(gl_texture_2d, taustatekstuuri); // Piirrä koko ikkunan peittävä nelikulmio glbegin(gl_quads); gltexcoord2f(0, 0); glvertex2f(0, 0); gltexcoord2f(6, 0); glvertex2f(800, 0); gltexcoord2f(6, 4); glvertex2f(800, 600); gltexcoord2f(0, 4); glvertex2f(0, 600); glend(); // piirretään sitten alieni // Aseta 3D-koordinaatisto glmatrixmode(gl_projection); glloadidentity(); gluperspective(60, 800.0/600.0, 1, 10); // Aseta modelview-matriisi glmatrixmode(gl_modelview); glloadidentity(); gltranslatef(0, 0, -2); // Siirrä alienia hieman kauemmaksi kamerasta glrotatef(angle, 0, 1, 0); // Pyöritä alienia y-akselin ympäri

21 // Aseta tekstuurimatriisi glmatrixmode(gl_texture); glloadidentity(); // laita alpha test päälle glenable(gl_alpha_test); // aseta alpha test niin että vain pikselit, // joiden alpha arvo on yli 0.5 piirretään glalphafunc(gl_greater, 0.5); // Sido alien tekstuuri glbindtexture(gl_texture_2d, alientekstuuri); // Piirrä alien glbegin(gl_quads); gltexcoord2f(0, 0); glvertex3f(-1, 1, 0); gltexcoord2f(1, 0); glvertex3f( 1, 1, 0); gltexcoord2f(1, 1); glvertex3f( 1, -1, 0); gltexcoord2f(0, 1); glvertex3f(-1, -1, 0); glend(); // Vaihda puskuri näytölle. SwapBuffers(hdc); return 0; 10 Loppusanat Tässä artikkelissa opit teksturoimaan. Seuraavassa ja viimeisessä osassa puhumme valoista ja varjoista. Raportoithan kaikki tästä artikkelista löytämäsi virheet (niin kirjoitus-, kuin asiavirheetkin) osoitteeseen niin korjaan ne mahdollisimman nopeasti. Myös kaikki kommentit ja kysymykset ovat tervetulleita.

22 11 Liite 1: TGA-tiedoston lataus Käytimme esimerkkiohjelmassamme raakadatakuvia, koska niiden lataus ei vaadi mitään ylimääräisiä toimenpiteitä. Niiden käyttö ei kuitenkaan ole suositeltavaa, koska ne eivät sisällä mitään tietoa kuvan tyypistä, koosta jne. Seuraavaksi luomme funktion, joka lataa TGA-kuvia. TGA on siitä hyvä formaatti, että se tukee alphakanavaa, eikä ole kovin hankala ladatakkaan. Yksinkertaisuuden vuoksi tekemämme funktio ei tue pakattuja tai paletillisia kuvia. Eli kun tallennat kuvan tarkista, että sen värisyvyys on 24 bittiä ja muoto pakkaamaton. TGA-tiedostojen speksit löydät esim. osoitteesta Funktio palauttaa osoittimen kuvadataan, ja tallentaa sen leveyden, korkeuden ja värikomponenttien määrän (3 tai 4) muuttujiin width, height ja components. Koska funktio varaa muistin datalle täytyy data vapauttaa free()-funktiolla, kun se käy turhaksi. unsigned char *loadtgafile(const char *filename, unsigned int *width, unsigned int *height, unsigned int *components) // Avaa tiedosto FILE *file=null; file = fopen(filename, "rb"); if (!file) fprintf(stderr,"can't find file %s!\n", filename); return NULL; // Ensimmäinen tavu kertoo kuvatunnistekentän pituuden unsigned char idlen=0; fread(&idlen, 1, 1, file); // Toinen tavu kertoo sisältääkö kuva paletin (jota emme tässä tue). unsigned char colormap=0; fread(&colormap, 1, 1, file); if (colormap!=0) fprintf(stderr,"the file %s has a color map witch are not supported!\n", filename); fclose(file); return NULL; // Kolmas tavu kertoo kuvan tyypin. unsigned char type=0; fread (&type, 1, 1, file); if (type!=2) // Tuemme tässä tyyppiä 2 (pakkaamaton)

23 fprintf(stderr,"the file %s has unsupported type (%d)!\n", filename, type); fclose(file); return NULL; // tavut kertovat kuvan leveyden ja tavut kuvan korkeuden unsigned char lo, hi; fseek(file, 12, SEEK_SET); fread(&lo, 1, 1, file); fread(&hi, 1, 1, file); *width=makeword(lo, hi); fread(&lo, 1, 1, file); fread(&hi, 1, 1, file); *height=makeword(lo, hi); // 16 tavu kertoo kuvan värisyvyyden 24=RGB ja 32=RGBA unsigned char bits=0; fseek(file, 16, SEEK_SET); fread(&bits, 1, 1, file); if (bits!=24 && bits!=32) fprintf(stderr,"the file %s has unsupported color depth (%d)!\n", filename, bits); fclose(file); return NULL; *components=bits/8; // Hyppää yli kuvatunniste, jonka koon luimme alussa fseek(file, 18+idLen, SEEK_SET); // lue data unsigned char *data=null; unsigned int i; unsigned char temp; data=(unsigned char *)malloc(*width * *height * *components); if (!data) fprintf(stderr,"no memory for data in file %s!\n", filename); fclose(file); return NULL; for (i=0; i<*width * *height; i++) fread(data + i * *components, *components, 1, file); // Tiedosto sisältää datan muodossa BRG(A), vaihdamme sen muotoon RGB(A). temp=data[*components * i]; data[*components * i]=data[*components * i + 2]; data[*components * i + 2]=temp; // Vähän näkökulmasta riippuen TGA tiedoston sisältämän kuvan // voidaan sanoa olevan ylösalaisin, joten haluamme kääntää sen. unsigned int x, y; for (y=0; y<*height/2; y++)

24 for (x=0; x<*components * *width; x++) temp=data[y * (*components * *width) + x]; data[y * (*components * *width) + x]=data[((*height - 1) - y)*(*components * *width) + x]; data[((*height - 1) - y) * (*components * *width) + x]=temp; // Kaikki ok fclose(file); return data; Nyt voit käyttää funktiota seuraavasti: unsigned char *data; unsigned int w, h, c; unsigned int tekstuuri; // luo yksi tekstuuriobjekti glgentextures(1, &tekstuuri); // Sido äsken luotu tekstuuri teksturointiyksikköön glbindtexture(gl_texture_2d, tekstuuri); // Lataa kuvadata tiedostosta. data=loadtgafile("tiedostonnimi.tga", &w, &h, &c); if (!data) tiedoston_lataus_epäonnistui; // Lataa data tekstuuriin if (c==3) // Ei alphakanavaa glteximage2d(gl_texture_2d, 0, 3, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, data); else // Alphakanava mukana glteximage2d(gl_texture_2d, 0, 4, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); // Suodatus päälle gltexparameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gltexparameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); free(data); // Dataa ei enää tarvita.

OpenGL:n perusteet - Osa 2: 3D grafiikka

OpenGL:n perusteet - Osa 2: 3D grafiikka OpenGL:n perusteet - Osa 2: 3D grafiikka OpenGL on käyttöjärjestelmäriippumaton kirjasto 2D- ja 3D-grafiikan piirtoon. Tämä artikkelisarja opettaa sinulle 3D-grafiikan perusteet OpenGL:ää käyttäen. Esimerkeissä

Lisätiedot

OpenGL:n perusteet - Osa 1: Ikkunan luominen

OpenGL:n perusteet - Osa 1: Ikkunan luominen OpenGL:n perusteet - Osa 1: Ikkunan luominen OpenGL on käyttöjärjestelmäriippumaton kirjasto 2D- ja 3D-grafiikan piirtoon. Tämä artikkelisarja opettaa sinulle 3D-grafiikan perusteet OpenGL:ää käyttäen.

Lisätiedot

OpenGL:n perusteet Osa 4: Valot ja varjot

OpenGL:n perusteet Osa 4: Valot ja varjot OpenGL:n perusteet Osa 4: Valot ja varjot OpenGL on käyttöjärjestelmäriippumaton kirjasto 2D- ja 3D-grafiikan piirtoon. Tämä artikkelisarja opettaa sinulle 3D-grafiikan perusteet OpenGL:ää käyttäen. Esimerkeissä

Lisätiedot

Windowsin sanomanvälitys. Juha Järvensivu 2007

Windowsin sanomanvälitys. Juha Järvensivu 2007 Windowsin sanomanvälitys Juha Järvensivu juha.jarvensivu@tut.fi 2007 Sisällys Windowsin sanomat Sanomanvälitysmekanismi Ikkunan kahva Sanomien lähettäminen Esimerkki winamp Tapahtumapohjainen toiminta

Lisätiedot

Sisällys. OpenGL 2. Display-listat. Display-Listat. Display-listat. Display-listat. Tietokonegrafiikka / perusteet Ako/T /301 4 ov / 2 ov

Sisällys. OpenGL 2. Display-listat. Display-Listat. Display-listat. Display-listat. Tietokonegrafiikka / perusteet Ako/T /301 4 ov / 2 ov Tietokonegrafiikka / perusteet Ako/T-111.300/301 4 ov / 2 ov OpenGL 2 Display Listat Tekstitys GLUT:lla Teksturointi Varjot Lopuista harjoituksista Valaistus ja materiaalit GLUT Sisällys Marko Myllymaa

Lisätiedot

OpenGL 2. Sisältö. Tietokonegrafiikka / perusteet T /301 4 ov / 2 ov

OpenGL 2. Sisältö. Tietokonegrafiikka / perusteet T /301 4 ov / 2 ov Tietokonegrafiikka / perusteet T-111.300/301 4 ov / 2 ov OpenGL 2 Iikka Olli OpenGL / 1 GLUT Display listat Teksturointi Sumu Blendaus Antialiasointi Picking Optimointi Sisältö OpenGL / 2 1 GLUT = OpenGL

Lisätiedot

Windowsin sanomanvälitys. Juha Järvensivu juha.jarvensivu@tut.fi 2008

Windowsin sanomanvälitys. Juha Järvensivu juha.jarvensivu@tut.fi 2008 Windowsin sanomanvälitys Juha Järvensivu juha.jarvensivu@tut.fi 2008 Sisällys Windowsin sanomat ja Sanomanvälitysmekanismi Ikkunan kahva ja Sanomien lähettäminen Windows API ohjelmointi Resurssit Sanomat

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava

Lisätiedot

Harjoitustyö: virtuaalikone

Harjoitustyö: virtuaalikone Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman

Lisätiedot

Sisällys. T-111.4300 Tietokonegrafiikan perusteet. OpenGL-ohjelmointi 11/2007. Mikä on OpenGL?

Sisällys. T-111.4300 Tietokonegrafiikan perusteet. OpenGL-ohjelmointi 11/2007. Mikä on OpenGL? T-111.4300 Tietokonegrafiikan perusteet OpenGL-ohjelmointi 11/2007 Sisällys Mikä on OpenGL? historia nykytilanne OpenGL:n toiminta Piirtäminen ja matriisit Muuta hyödyllistä kameran sijoittaminen valaistus

Lisätiedot

ASCII-taidetta. Intro: Python

ASCII-taidetta. Intro: Python Python 1 ASCII-taidetta All Code Clubs must be registered. Registered clubs appear on the map at codeclubworld.org - if your club is not on the map then visit jumpto.cc/18cplpy to find out what to do.

Lisätiedot

Mainoksen taittaminen Wordilla

Mainoksen taittaminen Wordilla Mainoksen taittaminen Wordilla Word soveltuu parhaiten standardimittaisten (A4 jne) word-tiedostojen (.docx) tai pdf-tiedostojen taittoon, mutta sillä pystyy tallentamaan pienellä kikkailulla myös kuvaformaattiin

Lisätiedot

Android. Sähköpostin määritys. Tässä oppaassa kuvataan uuden sähköpostitilin käyttöönotto Android 4.0.3 Ice Cream Sandwichissä.

Android. Sähköpostin määritys. Tässä oppaassa kuvataan uuden sähköpostitilin käyttöönotto Android 4.0.3 Ice Cream Sandwichissä. Y K S I K Ä Ä N A S I A K A S E I O L E M E I L L E LI I A N P I E NI TAI M I K Ä Ä N H A A S T E LI I A N S U U R I. Android Sähköpostin määritys Määrittämällä sähköpostitilisi Android-laitteeseesi, voit

Lisätiedot

Loppukurssin järjestelyt

Loppukurssin järjestelyt C! Loppukurssin järjestelyt 29.3.2018 Ohjelmassa Yhteenvetoa palautteesta Ohjelmontitehtävän järjestelyt Tietokonetentin järjestelyt Kysyttävää / kerrattavaa 10-kierroksen asioista? Aikatauluista 10. kierroksen

Lisätiedot

Loppukurssin järjestelyt C:n edistyneet piirteet

Loppukurssin järjestelyt C:n edistyneet piirteet C! Loppukurssin järjestelyt C:n edistyneet piirteet 30.3.2017 Ohjelmassa Ohjelmontitehtävän järjestelyt Tietokonetentin järjestelyt Esikääntäjä Parametrilistat Funktio-osoittimet Kunniamainintoja Kuura

Lisätiedot

T Tietokonegrafiikan perusteet. OpenGL-ohjelmointi

T Tietokonegrafiikan perusteet. OpenGL-ohjelmointi T-111.4300 Tietokonegrafiikan perusteet OpenGL-ohjelmointi Id Softwaren huhtikuussa 2004 julkaisema Doom 3 -peli käyttää OpenGL-kirjastoa. Sisällys Mikä on OpenGL? historia nykytilanne OpenGL:n toiminta

Lisätiedot

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta 5. 1. Toteuta Pythonilla seuraava ohjelma:

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta 5. 1. Toteuta Pythonilla seuraava ohjelma: Kerta 2 Kerta 3 Kerta 4 Kerta 5 Kerta 2 1. Toteuta Pythonilla seuraava ohjelma: 2. Tulosta Pythonilla seuraavat luvut allekkain a. 0 10 (eli, näyttää tältä: 0 1 2 3 4 5 6 7 8 9 10 b. 0 100 c. 50 100 3.

Lisätiedot

3.3 Paraabeli toisen asteen polynomifunktion kuvaajana. Toisen asteen epäyhtälö

3.3 Paraabeli toisen asteen polynomifunktion kuvaajana. Toisen asteen epäyhtälö 3.3 Paraabeli toisen asteen polynomifunktion kuvaajana. Toisen asteen epäyhtälö Yhtälön (tai funktion) y = a + b + c, missä a 0, kuvaaja ei ole suora, mutta ei ole yhtälökään ensimmäistä astetta. Funktioiden

Lisätiedot

Taulukot. Jukka Harju, Jukka Juslin 2006 1

Taulukot. Jukka Harju, Jukka Juslin 2006 1 Taulukot Jukka Harju, Jukka Juslin 2006 1 Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti

Lisätiedot

1 of

1 of http:people.cc.jyu.fi/~minurmin/gko/materiaali/esimerkit/... http:people.cc.jyu.fi/~minurmin/gko/materiaali/esimerkit/... /* PROGRAM: Mhello.c PURPOSE: "Pienin Windows-ohjelma". Tulostaa näyttöön tekstin

Lisätiedot

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille: Merkkijonot C-kielessä merkkijono on taulukko, jonka alkiot ovat char -tyyppiä. Taulukon viimeiseksi merkiksi tulee merkki '\0', joka ilmaisee merkkijonon loppumisen. Merkkijono määritellään kuten muutkin

Lisätiedot

Matikkaa KA1-kurssilaisille, osa 3: suoran piirtäminen koordinaatistoon

Matikkaa KA1-kurssilaisille, osa 3: suoran piirtäminen koordinaatistoon Matikkaa KA1-kurssilaisille, osa 3: suoran piirtäminen koordinaatistoon KA1-kurssi on ehkä mahdollista läpäistä, vaikkei osaisikaan piirtää suoraa yhtälön perusteella. Mutta muut kansiksen kurssit, no

Lisätiedot

Osoitin ja viittaus C++:ssa

Osoitin ja viittaus C++:ssa Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja

Lisätiedot

KUVANKÄSITTELY THE GIMP FOR WINDOWS OHJELMASSA

KUVANKÄSITTELY THE GIMP FOR WINDOWS OHJELMASSA KUVANKÄSITTELY THE GIMP FOR WINDOWS OHJELMASSA Ohjeistuksessa käydään läpi kuvan koon ja kuvan kankaan koon muuntaminen esimerkin avulla. Ohjeistus on laadittu auttamaan kuvien muokkaamista kuvakommunikaatiota

Lisätiedot

Ohjeita. Datan lukeminen

Ohjeita. Datan lukeminen ATK Tähtitieteessä Harjoitustyö Tehtävä Harjoitystyössä tehdään tähtikartta jostain taivaanpallon alueesta annettujen rektaskensio- ja deklinaatiovälien avulla. Karttaan merkitään tähdet aina kuudenteen

Lisätiedot

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5) Alkuarvot ja tyyppimuunnokset (1/5) Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int luku = 123; Alkuarvon on oltava muuttujan tietotyypin mukainen, esimerkiksi int-muuttujilla kokonaisluku,

Lisätiedot

Toinen harjoitustyö. ASCII-grafiikkaa

Toinen harjoitustyö. ASCII-grafiikkaa Toinen harjoitustyö ASCII-grafiikkaa Yleistä Tehtävä: tee Javalla ASCII-merkkeinä esitettyä grafiikkaa käsittelevä ASCIIArt-ohjelma omia operaatioita ja taulukoita käyttäen. Työ tehdään pääosin itse. Ideoita

Lisätiedot

Ohjelmointiharjoituksia Arduino-ympäristössä

Ohjelmointiharjoituksia Arduino-ympäristössä Ohjelmointiharjoituksia Arduino-ympäristössä Yleistä Arduino-sovelluksen rakenne Syntaksi ja käytännöt Esimerkki ohjelman rakenteesta Muuttujat ja tietotyypit Tietotyypit Esimerkkejä tietotyypeistä Ehtolauseet

Lisätiedot

Jypelin käyttöohjeet» Ruutukentän luominen

Jypelin käyttöohjeet» Ruutukentän luominen Jypelin käyttöohjeet» Ruutukentän luominen Pelissä kentän (Level) voi luoda tekstitiedostoon "piirretyn" mallin mukaisesti. Tällöin puhutaan, että tehdään ns. ruutukenttä, sillä tekstitiedostossa jokainen

Lisätiedot

Hämeenlinnan Offset-Kolmio Paino Oy:n aineisto-ohjeet

Hämeenlinnan Offset-Kolmio Paino Oy:n aineisto-ohjeet Hämeenlinnan Offset-Kolmio Paino Oy:n aineisto-ohjeet Sivun koko Painotuotteen sivun koon tulee olla taitto-ohjelmassa määritetty sivun lopulliseksi kooksi. Tarvittavat leikkuuvarat (Bleed), vähintään

Lisätiedot

Tasogeometriaa GeoGebran piirtoalue ja työvälineet

Tasogeometriaa GeoGebran piirtoalue ja työvälineet Tasogeometriaa GeoGebran piirtoalue ja työvälineet Näissä harjoituksissa työskennellään näkymässä Näkymät->Geometria PIIRRÄ (ja MITTAA) a) jana toinen jana, jonka pituus on 3 b) kulma toinen kulma, jonka

Lisätiedot

5.3 Ensimmäisen asteen polynomifunktio

5.3 Ensimmäisen asteen polynomifunktio Yllä olevat polynomit P ( x) = 2 x + 1 ja Q ( x) = 2x 1 ovat esimerkkejä 1. asteen polynomifunktioista: muuttujan korkein potenssi on yksi. Yleisessä 1. asteen polynomifunktioissa on lisäksi vakiotermi;

Lisätiedot

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus Tampereen yliopisto Tietokonegrafiikka 201 Tietojenkäsittelytiede Harjoitus 6 1..201 1. Tarkastellaan Gouraudin sävytysmallia. Olkoon annettuna kolmio ABC, missä A = (0,0,0), B = (2,0,0) ja C = (1,2,0)

Lisätiedot

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus 2 7.2.2013 1. Matematiikan lukiokurssissa on esitetty, että ylöspäin aukeavan paraabelin f(x) = ax 2 +bx+c,a > 0,minimikohtasaadaan,kunf

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin

Lisätiedot

Demokoodaus Linuxilla, tapaus Eternity

Demokoodaus Linuxilla, tapaus Eternity Demokoodaus Linuxilla, tapaus Eternity Tuomo Sipola tuomo.sipola@iki.fi Linkin lanit 9.4.2010 Tuomo Sipola tuomo.sipola@iki.fi () Demokoodaus Linuxilla, tapaus Eternity Linkin lanit 9.4.2010 1 / 17 Sisältö

Lisätiedot

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014 18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana Muilla kielillä: English Suomi Pong-peli, vaihe 2 Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana Laitetaan pallo liikkeelle Tehdään kentälle reunat Vaihdetaan kentän taustaväri Zoomataan

Lisätiedot

Datatähti 2019 loppu

Datatähti 2019 loppu Datatähti 2019 loppu task type time limit memory limit A Summa standard 1.00 s 512 MB B Bittijono standard 1.00 s 512 MB C Auringonlasku standard 1.00 s 512 MB D Binääripuu standard 1.00 s 512 MB E Funktio

Lisätiedot

Joomla pikaopas. Yksinkertainen opas, jossa neuvotaan esimerkkisivuston teko Joomla julkaisujärjestelmällä vaihe vaiheelta.

Joomla pikaopas. Yksinkertainen opas, jossa neuvotaan esimerkkisivuston teko Joomla julkaisujärjestelmällä vaihe vaiheelta. Joomla pikaopas Yksinkertainen opas, jossa neuvotaan esimerkkisivuston teko Joomla julkaisujärjestelmällä vaihe vaiheelta. Paavo Räisänen www.ohjelmoimaan.net Tätä opasta saa vapaasti kopioida, tulostaa

Lisätiedot

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti C! Perusteet 19.1.2017 Palautteesta (1. kierros toistaiseksi) Toistaiseksi helppoa Miksi vain puolet pisteistä? Vaikeinta oli ohjelmointiympäristön asennus ja käyttö Vaikeaa eroavuudet Pythonin ja C:n

Lisätiedot

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A. Tehtävä. Tämä tehtävä on aineistotehtävä, jossa esitetään ensin tehtävän teoria. Sen jälkeen esitetään neljä kysymystä, joissa tätä teoriaa pitää soveltaa. Mitään aikaisempaa tehtävän aihepiirin tuntemusta

Lisätiedot

Tapahtumapohjainen ohjelmointi. Juha Järvensivu juha.jarvensivu@tut.fi 2007

Tapahtumapohjainen ohjelmointi. Juha Järvensivu juha.jarvensivu@tut.fi 2007 Tapahtumapohjainen ohjelmointi Juha Järvensivu juha.jarvensivu@tut.fi 2007 Sisältö Tapahtumapohjainen ohjelmointi Käyttöliittymän rakenne Pääikkuna (top-level window) Lapsi-ikkuna (child window) Dialogit

Lisätiedot

Tietueet. Tietueiden määrittely

Tietueet. Tietueiden määrittely Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään

Lisätiedot

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla ALKUHARJOITUS Kynän ja paperin avulla peilaaminen koordinaatistossa a) Peilaa pisteen (0,0) suhteen koordinaatistossa sijaitseva - neliö, jonka

Lisätiedot

Digikuvan peruskäsittelyn. sittelyn työnkulku. Soukan Kamerat 22.1.2007. Soukan Kamerat/SV

Digikuvan peruskäsittelyn. sittelyn työnkulku. Soukan Kamerat 22.1.2007. Soukan Kamerat/SV Digikuvan peruskäsittelyn sittelyn työnkulku Soukan Kamerat 22.1.2007 Sisält ltö Digikuvan siirtäminen kamerasta tietokoneelle Skannaus Kuvan kääntäminen Värien säätö Sävyjen säätö Kuvan koko ja resoluutio

Lisätiedot

TALLENNETAAN MUISTITIKULLE JA MUISTIKORTILLE

TALLENNETAAN MUISTITIKULLE JA MUISTIKORTILLE TALLENNETAAN MUISTITIKULLE JA MUISTIKORTILLE HERVANNAN KIRJASTON TIETOTORI Insinöörinkatu 38 33720 Tampere 040 800 7805 tietotori.hervanta@tampere.fi TALLENNETAAN MUISTIKULLE JA MUISTIKORTILLE 1 Muistitikun

Lisätiedot

Tehtävä 3 ja 4. 3. aikakausilehden kansi pastissi 4. runokirjan kansi

Tehtävä 3 ja 4. 3. aikakausilehden kansi pastissi 4. runokirjan kansi Tehtävä 3 ja 4 3. aikakausilehden kansi pastissi 4. runokirjan kansi 3. Valitse esim. Opettaja-lehti ja tee sille uusi kansi lehden tyyliin samoilla fonteilla ym. (ohje sille), NYT-liite, tms. käy myös

Lisätiedot

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti C! Perusteet 19.1.2017 Palautteesta (1. kierros toistaiseksi) (Erittäin) helppoa Miksi vain puolet pisteistä? Vaikeinta oli ohjelmointiympäristön asennus ja käyttö Ei selvää että main funktion pitikin

Lisätiedot

Kun olet valmis tekemään tilauksen, rekisteröidy sovellukseen seuraavasti:

Kun olet valmis tekemään tilauksen, rekisteröidy sovellukseen seuraavasti: HENKILÖKORTTIEN SUUNNITTELUSOVELLUS SOVELLUKSEN KÄYTTÖOHJE Voit kokeilla korttien suunnittelemista valmiiden korttipohjien avulla ilman rekisteröitymistä. Rekisteröityminen vaaditaan vasta, kun olet valmis

Lisätiedot

FOTONETTI BOOK CREATOR

FOTONETTI BOOK CREATOR F O T O N E T T I O Y FOTONETTI BOOK CREATOR 6 2012 Kemintie 6 95420 Tornio puhelin: 050-555 6500 pro/kirja: 050-555 6580 www.fotonetti.fi Ohjelman asentaminen 1 Hae ohjelma koneellesi osoitteesta http://www.fotonetti.fi/kuvakirjatilaa

Lisätiedot

Zeon PDF Driver Trial

Zeon PDF Driver Trial Matlab-harjoitus 2: Kuvaajien piirto, skriptit ja funktiot. Matlabohjelmoinnin perusteita Numeerinen integrointi trapezoidaalimenetelmällä voidaan tehdä komennolla trapz. Esimerkki: Vaimenevan eksponentiaalin

Lisätiedot

Muita kuvankäsittelyohjelmia on mm. Paint Shop Pro, Photoshop Elements, Microsoft Office Picture Manager

Muita kuvankäsittelyohjelmia on mm. Paint Shop Pro, Photoshop Elements, Microsoft Office Picture Manager Missio: 1. Asentaminen 2. Valokuvien tarkastelu, tallennus/formaatit, koko, tarkkuus, korjaukset/suotimet, rajaus 3. Kuvan luonti/työkalut (grafiikka kuvat) 4. Tekstin/grafiikan lisääminen kuviin, kuvien/grafiikan

Lisätiedot

Collector for ArcGIS. Ohje /

Collector for ArcGIS. Ohje / Collector for ArcGIS Ohje / 10.5.2019 2 (11) Sisältö 1. Collector for ArcGIS... 3 2. Kartan luominen ArcGIS Onlinessa... 3 2.1 Karttatason luominen... 3 2.2 Ominaisuustietotaulun kenttien määrittäminen...

Lisätiedot

Tuotetietojen täydentäminen sähköpisteelle

Tuotetietojen täydentäminen sähköpisteelle 1 Tuotetietojen täydentäminen sähköpisteelle Tuotteen etsintä valmistajan web-sivuilta Tuotevalmistajilla on useita eri tapoja tietojen jakamiseen ja tiedostot voivat löytyä eritavalla valmistajasta riippuen.

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Useampitasoiset ADT:t Käytetään esimerkkiohjelmaa Ratkaisuyritys 1 Ratkaisuyritys 2 Lopullinen ratkaisu Lopullisen ratkaisun toteutusyritys Lopullisen ratkaisun oikea toteutus

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,

Lisätiedot

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot Tiedosto yhteenkuuluvien tietojen joukko, joka on tavallisesti talletettu pysyväismuistiin muodostuu tietueista, jotka voivat olla keskenään samanlaisia tai vaihdella tyypiltään tiedostot ovat joko tekstitiedostoja

Lisätiedot

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++? JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,

Lisätiedot

Uuden Peda.netin käyttöönotto

Uuden Peda.netin käyttöönotto Sisällysluettelo Uuden Peda.netin käyttöönotto...2 Sisään- ja uloskirjautuminen...2 OmaTila...3 Peda.netin yleisrakenne...4 Työvälineet - Sivut...5 Sivun lisääminen omaan profiiliin:...5 Sivun poistaminen

Lisätiedot

TAITAJA 2007 ELEKTRONIIKKAFINAALI 31.01-02.02.07 KILPAILIJAN TEHTÄVÄT. Kilpailijan nimi / Nro:

TAITAJA 2007 ELEKTRONIIKKAFINAALI 31.01-02.02.07 KILPAILIJAN TEHTÄVÄT. Kilpailijan nimi / Nro: KILPAILIJAN TEHTÄVÄT Kilpailijan nimi / Nro: Tehtävän laatinut: Hannu Laurikainen, Deltabit Oy Kilpailutehtävä Kilpailijalle annetaan tehtävässä tarvittavat ohjelmakoodit. Tämä ohjelma on tehty laitteen

Lisätiedot

Entiteetit erotetaan muusta tekstistä & ja puolipiste. esim. copyright-merkki näkyy sivulla

Entiteetit erotetaan muusta tekstistä & ja puolipiste. esim. copyright-merkki näkyy sivulla 1 ENTITEETIT Tehtävä 1. Tietokoneet ja käyttöjärjestelmät käyttävät erilaisia merkkijärjestelmiä ja varsinkin Internetin alkutaipaleella aiheutti sen, että jotkut merkit eivät näkyneet kaikilla oikein.

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2011 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2011 1 / 39 Kertausta: tiedoston avaaminen Kun ohjelma haluaa lukea tai kirjoittaa tekstitiedostoon, on ohjelmalle

Lisätiedot

Google-dokumentit. Opetusteknologiakeskus Mediamylly

Google-dokumentit. Opetusteknologiakeskus Mediamylly Google-dokumentit 1 2 3 Yleistä 1.1 Tilin luominen 4 1.2 Docs-päävalikkoon siirtyminen 7 Dokumentit-päävalikko 2.1 Kirjaudu Dokumentteihin 9 2.2 Lähetä tiedosto Google-dokumentteihin 11 2.3 Uuden asiakirjan

Lisätiedot

Kuvat. 1. Selaimien tunnistamat kuvatyypit

Kuvat. 1. Selaimien tunnistamat kuvatyypit Kuvat Kuvia voi liittää xhtml-sivulle -elementillä -elementillä -elementillä lomakkeiden yhteydessä lähinnä painikenappeja taustakuvina -elementin background-attribuutilla tai

Lisätiedot

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu 811312A Tietorakenteet ja algoritmit 2017-2018, Harjoitus 2 ratkaisu Harjoituksen aiheena on algoritmien oikeellisuus. Tehtävä 2.1 Kahvipurkkiongelma. Kahvipurkissa P on valkoisia ja mustia kahvipapuja,

Lisätiedot

KESKUSTANUORTEN NETTISIVUT- OHJEITA PIIRIYLLÄPITÄJÄLLE 1. KIRJAUTUMINEN

KESKUSTANUORTEN NETTISIVUT- OHJEITA PIIRIYLLÄPITÄJÄLLE 1. KIRJAUTUMINEN KESKUSTANUORTEN NETTISIVUT- OHJEITA PIIRIYLLÄPITÄJÄLLE 1. KIRJAUTUMINEN -Mene osoitteeseen keskustanuoret.fi/user - Kirjoita saamasi käyttäjätunnus ja salasana - Klikkaa yllä olevaa piirisi logoa niin

Lisätiedot

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti Luku 6 Dynaaminen ohjelmointi Dynaamisessa ohjelmoinnissa on ideana jakaa ongelman ratkaisu pienempiin osaongelmiin, jotka voidaan ratkaista toisistaan riippumattomasti. Jokaisen osaongelman ratkaisu tallennetaan

Lisätiedot

Mikäli olet saanut e-kirjan latauslinkin sähköpostilla, seuraa näitä ohjeita e-kirjan lataamisessa.

Mikäli olet saanut e-kirjan latauslinkin sähköpostilla, seuraa näitä ohjeita e-kirjan lataamisessa. E-kirjan latausohje Mikäli olet saanut e-kirjan latauslinkin sähköpostilla, seuraa näitä ohjeita e-kirjan lataamisessa. Pikaohjeet 1. Varmista että tietokoneellesi on asennettu Adobe Digital Editions ohjelma.

Lisätiedot

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Osoittimet Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Muistilohkon koko riippuu muuttujan tyypistä, eli kuinka suuria arvoja muuttujan

Lisätiedot

KUVAN TUOMINEN, MUOKKAAMINEN, KOON MUUTTAMINEN JA TALLENTAMINEN PAINTISSA

KUVAN TUOMINEN, MUOKKAAMINEN, KOON MUUTTAMINEN JA TALLENTAMINEN PAINTISSA KUVAN TUOMINEN, MUOKKAAMINEN, KOON MUUTTAMINEN JA TALLENTAMINEN PAINTISSA SISÄLLYS 1. KUVAN TUOMINEN PAINTIIN...1 1.1. TALLENNETUN KUVAN HAKEMINEN...1 1.2. KUVAN KOPIOIMINEN JA LIITTÄMINEN...1 1.1. PRINT

Lisätiedot

Asiointipalvelun ohje

Asiointipalvelun ohje Asiointipalvelun ohje Yleistä 1. Kirjautuminen 2. Yhteystiedot 3. Vastaustavan valinta 1. Yleistä 2. Palkkatietojen lataaminen tiedostosta 4. Lomake 1. Yleistä 2. Linkit ja vastaajan tiedot 3. Lomakekäsittely

Lisätiedot

Ohjeet e kirjan ostajalle

Ohjeet e kirjan ostajalle 1 Ohjeet e kirjan ostajalle 1. Ostaminen ja käyttöönotto 1.1. Näin saat e kirjan käyttöösi Lataa tietokoneellesi Adobe Digital Editions (ADE) ohjelma täältä: http://www.adobe.com/products/digitaleditions/.

Lisätiedot

Kotisivuohjeet. Eteläpohjalaiset Kylät ry. Sivupohjien rakenne

Kotisivuohjeet. Eteläpohjalaiset Kylät ry. Sivupohjien rakenne Kotisivuohjeet Tässä ohjeessa käydään läpi kotisivujen tekemisen perusteet keskittyen html-koodiin ja sen ominaisuuksiin. Sivupohjissa ulkoasu ja rakenne on pääasiassa jaettu erilliseen css-tyylitiedostoon,

Lisätiedot

Kuukauden kuvat kerhon galleriaan 1.4.2016 lähtien kuukaudenkuvaajan kuvagalleria on siirretty uudelle palvelimelle osoitteeseen:

Kuukauden kuvat kerhon galleriaan 1.4.2016 lähtien kuukaudenkuvaajan kuvagalleria on siirretty uudelle palvelimelle osoitteeseen: Kuukauden kuvat kerhon galleriaan 1.4.2016 lähtien kuukaudenkuvaajan kuvagalleria on siirretty uudelle palvelimelle osoitteeseen: http://www.kamera73.fi/kuukaudenkuvaaja Kukin seuran jäsen voi laittaa

Lisätiedot

Tietotekniikan valintakoe

Tietotekniikan valintakoe Jyväskylän yliopisto Tietotekniikan laitos Tietotekniikan valintakoe 2..22 Vastaa kahteen seuraavista kolmesta tehtävästä. Kukin tehtävä arvostellaan kokonaislukuasteikolla - 25. Jos vastaat useampaan

Lisätiedot

Useimmin kysytyt kysymykset

Useimmin kysytyt kysymykset Useimmin kysytyt kysymykset Versio 1.1 1 1. Mikä mobiilikortti on? Mobiilikortti on matkapuhelimessa toimiva sovellus ja www.mobiilikortti.com osoitteessa oleva palvelu. Sovelluksen avulla voit siirtää

Lisätiedot

Kuvan pienentäminen Paint.NET-kuvankäsittelyohjelmalla

Kuvan pienentäminen Paint.NET-kuvankäsittelyohjelmalla Kuvan pienentäminen Paint.NET-kuvankäsittelyohjelmalla Avaa Paint.NET tuplaklikkaamalla sen pikakuvaketta. Paint.NET avautuu tämän näköisenä. Edessä on tyhjä paperi. Saadaksesi auki kuvan, jota aiot pienentää

Lisätiedot

Valitse aineisto otsikoineen maalaamalla se hiirella ja kopioimalla (Esim. ctrl-c). Vaihtoehtoisesti, Lataa CSV-tiedosto

Valitse aineisto otsikoineen maalaamalla se hiirella ja kopioimalla (Esim. ctrl-c). Vaihtoehtoisesti, Lataa CSV-tiedosto Versio k15 Näin laadit ilmastodiagrammin Libre Officen taulukkolaskentaohjelmalla. Ohje on laadittu käyttäen Libre Officen versiota 4.2.2.1. Voit ladata ohjelmiston omalle koneellesi osoitteesta fi.libreoffice.org.

Lisätiedot

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4) 2. Lisää Java-ohjelmoinnin alkeita Muuttuja ja viittausmuuttuja Vakio ja literaalivakio Sijoituslause Syötteen lukeminen ja Scanner-luokka 1 Muuttuja ja viittausmuuttuja (1/4) Edellä mainittiin, että String-tietotyyppi

Lisätiedot

Nspire CAS - koulutus Ohjelmiston käytön alkeet Pekka Vienonen

Nspire CAS - koulutus Ohjelmiston käytön alkeet Pekka Vienonen Nspire CAS - koulutus Ohjelmiston käytön alkeet 3.12.2014 Pekka Vienonen Ohjelman käynnistys ja käyttöympäristö Käynnistyksen yhteydessä Tervetuloa-ikkunassa on mahdollisuus valita suoraan uudessa asiakirjassa

Lisätiedot

GREDDY PROFEC B SPEC II säätäminen

GREDDY PROFEC B SPEC II säätäminen GREDDY PROFEC B SPEC II säätäminen Päätin tehdä tällaisen ohjeen, koska jotkut ovat sitä kyselleet suomeksi. Tämä on vapaa käännös eräästä ohjeesta, joka on suunnattu Evoille (joka on koettu toimivaksi

Lisätiedot

Autentikoivan lähtevän postin palvelimen asetukset

Autentikoivan lähtevän postin palvelimen asetukset Autentikoivan lähtevän postin palvelimen asetukset - Avaa Työkalut valikko ja valitse Tilien asetukset - Valitse vasemman reunan lokerosta Lähtevän postin palvelin (SM - Valitse listasta palvelin, jonka

Lisätiedot

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä Rekursiolause Laskennan teorian opintopiiri Sebastian Björkqvist 23. helmikuuta 2014 Tiivistelmä Työssä käydään läpi itsereplikoituvien ohjelmien toimintaa sekä esitetään ja todistetaan rekursiolause,

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 30.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 30.9.2015 1 / 27 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

Luku 6: Grafiikka. 2D-grafiikka 3D-liukuhihna Epäsuora valaistus Laskostuminen Mobiililaitteet Sisätilat Ulkotilat

Luku 6: Grafiikka. 2D-grafiikka 3D-liukuhihna Epäsuora valaistus Laskostuminen Mobiililaitteet Sisätilat Ulkotilat 2D-grafiikka 3D-liukuhihna Epäsuora valaistus Laskostuminen Mobiililaitteet Sisätilat Ulkotilat 2D-piirto 2-ulotteisen grafiikan piirto perustuu yleensä valmiiden kuvien kopioimiseen näyttömuistiin (blitting)

Lisätiedot

Harjoitus 6 (viikko 42)

Harjoitus 6 (viikko 42) Nämä ovat kurssin viimeiset harjoitukset. Hyväksytyistä ratkaisuista ja läsnäoloista kerättyjen pisteiden summan tulee olla vähintään 40 % ( pistettä) tehtävien ja läsnäolopisteiden kokonaislukumäärien

Lisätiedot

ALVin käyttöohjeet. Kuvaus, rajaus ja tallennus puhelimella ALVin -mobiilisovelluksen avulla dokumentit kuvataan, rajataan ja tallennetaan palveluun.

ALVin käyttöohjeet. Kuvaus, rajaus ja tallennus puhelimella ALVin -mobiilisovelluksen avulla dokumentit kuvataan, rajataan ja tallennetaan palveluun. ALVin käyttöohjeet Nämä käyttöohjeet sisältävät hyödyllisiä vinkkejä palvelun käyttöön. Ne kannattaa lukea ennen palvelun käyttöä. Jos kuitenkin kohtaat ongelmia etkä löydä niihin ratkaisua näistä käyttöohjeista

Lisätiedot

Määrittelydokumentti

Määrittelydokumentti Määrittelydokumentti Aineopintojen harjoitustyö: Tietorakenteet ja algoritmit (alkukesä) Sami Korhonen 014021868 sami.korhonen@helsinki. Tietojenkäsittelytieteen laitos Helsingin yliopisto 23. kesäkuuta

Lisätiedot

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: Harjoitus 7 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: class Lintu //Kentät private int _siivenpituus; protected double _aivojenkoko; private bool _osaakolentaa; //Ominaisuudet public int

Lisätiedot

Harjoitus 4 (viikko 47)

Harjoitus 4 (viikko 47) Kaikki tämän harjoituksen tehtävät liittyvät joko suoraan tai epäsuorasti kurssin toiseen harjoitustyöhön. Saa hyvän alun harjoitustyön tekoon, kun ratkaiset mahdollisimman monta tehtävää. Mikäli tehtävissä

Lisätiedot

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti: 1 (7) Tiedon lukeminen näppäimistöltä Scanner-luokan avulla Miten ohjelma saa käyttöönsä käyttäjän kirjoittamaa tekstiä? Järjestelmässä on olemassa ns. syöttöpuskuri näppäimistöä varten. Syöttöpuskuri

Lisätiedot

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä muuttujia ja vakioita. Esittely

Lisätiedot

Toinen harjoitustyö. ASCII-grafiikkaa 2017

Toinen harjoitustyö. ASCII-grafiikkaa 2017 Toinen harjoitustyö ASCII-grafiikkaa 2017 Yleistä Tehtävä: tee Javalla ASCII-merkkeinä esitettyä grafiikkaa käsittelevä ASCIIArt17-ohjelma omia operaatioita ja taulukoita käyttäen. Työ tehdään pääosin

Lisätiedot

S-114.3812 Laskennallinen Neurotiede

S-114.3812 Laskennallinen Neurotiede S-114.3812 Laskennallinen Neurotiede Laskuharjoitus 2 4.12.2006 Heikki Hyyti 60451P Tehtävä 1 Tehtävässä 1 piti tehdä lineaarista suodatusta kuvalle. Lähtötietoina käytettiin kuvassa 1 näkyvää harmaasävyistä

Lisätiedot

Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä:

Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä: Linux-harjoitus 6 Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä: http://www.mysql.com/, MySQL-tietokantaohjelman kotisivu. http://www.mysql.com/doc/en/index.html,

Lisätiedot

811312A Tietorakenteet ja algoritmit, , Harjoitus 6, Ratkaisu

811312A Tietorakenteet ja algoritmit, , Harjoitus 6, Ratkaisu 811312A Tietorakenteet ja algoritmit, 2018-2019, Harjoitus 6, Ratkaisu Harjoituksen aiheet ovat verkkojen leveys- ja syvyyshakualgoritmit Tehtävä 6.1 Hae leveyshakualgoritmia käyttäen lyhin polku seuraavan

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 2.2.2011 1 / 37 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti

Lisätiedot

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot