Changes between Version 68 and Version 69 of naloge


Ignore:
Timestamp:
Dec 5, 2011, 3:25:12 PM (13 years ago)
Author:
skulovec
Comment:

dodane prej izbrisane vaje

Legend:

Unmodified
Added
Removed
Modified
  • naloge

    v68 v69  
    767767}}}
    768768
    769 
     769= Grafični jezik OpenGL =
     770
     771Vse naloge v nadaljevanju so zastavljene tako, da se želi grafični izris z določenimi
     772primitivi in v določeni obliki. Če ni podrobneje določeno, je potrebno pripraviti izris tako,
     773da je dovolj ličen in v ustreznem razmerju z velikostjo okna. Okno naj bo velikosti 400x400. 
     774Za spremembo koordinatnega sistema modela je potrebno uporabiti transformacijske funkcije
     775v ustreznem vrstnem redu. Transformacijske funkcije so:
     776 - translacija 
     777{{{
     778#!c
     779void glTranslatef( GLfloat x,   GLfloat y, GLfloat z )
     780}}}
     781 - skaliranje 
     782{{{
     783#!c
     784void glScalef( GLfloat x, GLfloat y, GLfloat z )
     785}}}
     786 - rotacija
     787{{{
     788#!c
     789void glRotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z )
     790}}}
     791 
     792== vaja120 ==
     793Program, ki bere podatke robnih elementov iz datoteke 
     794{{{
     7958 1
     79600 00 06 00 0
     79706 00 14 00 -1
     79814 00 20 00 0
     79920 00 20 10 0
     80020 10 14 10 0
     80114 10 06 10 1
     80206 10 00 10 0
     80300 10 00 00 0
     804}}}
     805tako, da bo na vozlišča elementov postavil rdečo kroglo 
     806velikosti 1.0, na sredino robnih elementov pa zeleno kroglo
     807velikosti 0.5. Za izris krogle uporabite 
     808{{{
     809#!c
     810void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
     811}}}
     812z osmimi delitvami po dolžini in širini krogle.
     813
     814V prikazani datoteki v prvi vrstici piše število elementov 8 in število delitev 1.
     815V naslednjih vrsticah so koordinate robnih elementov v ravnini in jakost vtoka. 
     816Vsaka vrstica ima naslednje koordinate
     817{{{
     818x1 y1 x2 y1 q
     819}}}
     820         
     821== vaja121 ==
     822Tako kot v vaji 120 preberite datoteko robih elementov in na sredini vsakega
     823elementa pravokotno na element narišite puščico vtoka ali iztoka v element.
     824Velikost puščice naj bo sorazmerna velikosti pretoka. Če pretoka ni, se puščice ne
     825riše. Puščica pritoka naj bo zelen,  puščica odtoka pa rdeče barve.
     826                         
     827== vaja122 ==
     828Tako kot 120 naj se izriše sistem robnih elementov. V prvem kvadrantu pa naj
     829se kot podlaga izriše še mreža točk (''grid'') v obsegu [0..10] z gostoto 1.0
     830         
     831Za risanje točk uporabite primitiv {{{GL_POINTS}}} v sivi barvi 
     832{{{glColorf(0.5, 0.5, 0.5);}}}
     833                 
     834Spodnja leva točka sistema mora sovpadati z izhodiščem prvega kvadranata.
     835                 
     836== vaja123 ==
     837Program naj vpraša za rotacijo okoli osi x, y in z ter nato nariše
     838koordinatni sistem kot tri vektorje dolžine 1.0 v rdeči, zeleni in modri barvi.
     839Na koncu naj bo še prostorska puščica primerne velikosti (npr 0.15) 
     840izdelana s stožcem za kar lahko izdelamo z 
     841{{{
     842#!c
     843void glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
     844}}}
     845         
     846== vaja124 ==
     847Narišite kocko v izometrični projekciji z dolžino stranice a = 3. Vozlišča povežite med seboj s črtami in v vsako vozlišče postavite rumeno kroglo velikosti 0.5. Za izris črt uporabite primitiv 
     848{{{
     849#!c
     850glBegin(GL_LINES)
     851 /// ...
     852glEnd();
     853}}}
     854         
     855== vaja 125 ==
     856Napišite program, ki bo za vrednost n = 1 do 7 zračunal n!. Vrednosti n naj bodo na osi x, n! pa na osi y. 
     857Točke (x, y) za posamezno vrednost poveži skupaj z uporabo primitiva 
     858{{{
     859#!c
     860glBegin(GL_LINE_STRIP)
     861 /// ...
     862glEnd();
     863}}}
     864         
     865== vaja 126 ==
     866Datoteka vaja126.dat:
     867||3||||
     868||0||0||
     869||2||1||
     870||-1||2||
     871         
     872Iz datoteke preberi tri točke p1, p2 in p3. 
     873Z vektorskim produktom med vektorjema vec(a)=p2-p1 in vec(b)=p3-p1 ustvari nov vektor vec(c),
     874ki bo določal mesto točke p4 (s puščicami prikažite smer vektorjev a, b in c). 
     875Vse točke povežite med sabo in v novo določeno točko p4 vstavite čajnik za kar uporabite:
     876{{{
     877#!c
     878   glutWireTeapot(0.5);
     879}}}
     880         
     881== vaja 127 ==
     882Narišite 2D koordinatni sistem, katerega izhodišče se bo nahajalo v sredini zaslona 
     883(x os naj bo rdeče, y os pa zelene barve). V vsakem
     884kvadrantu koordinatnega sistema nariši mrežo točk v obsegu [0..10] z gostoto
     885(Kvadrant: K1[0.5], K2[1.0], K3[0.5], K4[1.0]). 
     886Vsak kvadrant naj ima mrežne točke drugačne barve (K1-zelene, K2-modre, K3-sive in K4-bele)
     887izdelane s primitivom
     888{{{
     889#!c
     890glBegin(GL_POINTS);
     891  ///....
     892glEnd();
     893}}}
     894                                 
     895== vaja128 ==
     896Narišite sinusno krivuljo v razponu od -π do π. Število točk naj bo možno spremeniti s konstanto N, izris
     897pa izvedemo z {{{GL_LINE_STRIP}}}.
     898{{{
     899#!c
     900#define N 50
     901}}}
     902                                 
     903== vaja129 ==
     904V enem od prejšnjih vaj uporabite naslednji podprogram in ga prijavi kot GLUT podprogram, 
     905ki se izvede pri spremembi velikosti okna.               
     906{{{
     907#!c
     908void reshape(int w, int h)
     909{
     910  GLdouble width = w, height = h;
     911  GLdouble left, right, bottom, top, znear, zfar;
     912         
     913  if (w > h)
     914    {
     915      left = -width/height;
     916      right = width/height;
     917      bottom = -1.0;
     918      top = 1.0;
     919    }
     920  else
     921    {
     922      left = -1.0;
     923      right = 1.0;
     924      bottom = -height/width;
     925      top = height/width;
     926    }
     927  znear = -1.0;
     928  zfar = 1.0;
     929  glViewport(0, 0, w, h);
     930  glMatrixMode(GL_PROJECTION);
     931  glLoadIdentity();
     932  glOrtho(left, right, bottom, top, znear, zfar);
     933  glMatrixMode(GL_MODELVIEW);
     934  glLoadIdentity();
     935}
     936}}}
     937Kakšna je lastnost take spremembe okna? Začetno okno izrišite v velikosti 500x300.
     938                                 
     939== vaja130 ==
     940                 
     941Izrišite trikotnik s prelivanjem osnovnih barv v vozliščih. Za osnovo naj vam bo naslednji fortranski program:           
     942{{{
     943#!f
     944subroutine display
     945implicit none
     946include ’GL/fgl.h’
     947call fglClear(GL_COLOR_BUFFER_BIT)
     948call fglBegin(GL_TRIANGLES)
     949call fglColor3f(1.0, 0.0, 0.0)
     950call fglVertex2f(-1.0, -1.0)
     951call fglColor3f(0.0, 1.0, 0.0)
     952call fglVertex2f(0.0, 1.0)
     953call fglColor3f(0.0, 0.0, 1.0)
     954call fglVertex2f(1.0, 0.0)
     955call fglEnd
     956call fglFlush
     957end
     958}}}
     959                                 
     960== vaja131 ==
     961Izrišite kocko v prostoru tako, da uporabite podprogram, ki izrisuje kvadrate različnih barv
     962s funkcijo
     963{{{
     964#!c
     965void glRectf( GLfloat x1, GLfloat y1, GLfloat x2,  GLfloat y2 );
     966}}}
     967Funkcija glRectf riše v ravnini z=0. Z uporabo matričnih transformacij pa lahko rišemo
     968v poljubni ravini.
     969Za osnovo naj vam bo naslednji fortarnski program:
     970{{{
     971#!f
     972subroutine kvadrat(i)
     973real r(6), g(6), b(6)
     974data r /1,0,0,1,1,1/, g /0,1,0,1,0,0/
     975data b /0,0,1,0,1,1/
     976call fglPushMatrix
     977call fglColor3f(r(i), g(i), b(i))
     978call fglTranslatef(0.0, 0.0, 1.0)
     979call fglRectf(-1.0, -1.0, 1.0, 1.0)
     980call fglPopMatrix
     981end
     982subroutine display
     983implicit none
     984include ’GL/fgl.h’
     985call fglClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT)
     986call fglPushMatrix
     987call fglRotatef(30.0, 1.0, 0.0, 0.0)
     988call fglRotatef(30.0, 0.0, 1.0, 0.0)
     989call fglScalef(0.5, 0.5, 0.5)
     990call kvadrat(1)
     991call fglRotatef(90.0, 0.0, 1.0, 0.0)
     992call kvadrat(2)
     993call fglRotatef(90.0, 0.0, 1.0, 0.0)
     994call kvadrat(3)
     995call fglRotatef(90.0, 0.0, 1.0, 0.0)
     996call kvadrat(4)
     997call fglRotatef(90.0, 1.0, 0.0, 0.0)
     998call kvadrat(5)
     999call fglRotatef(180.0, 1.0, 0.0, 0.0)
     1000call kvadrat(6)
     1001call fglPopMatrix
     1002call fglFlush
     1003end
     1004}}}
     1005
     1006Pri izbiri okna morate vklopiti globinski pomnilnik z 
     1007{{{
     1008#!c
     1009glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);
     1010glEnable(GL DEPTH TEST);
     1011}}}
     1012                                 
     1013== vaja132 ==
     1014Tako kot v nalogi 130 izrišite prelivajoč se trikotnik s tem da prijavite še
     1015naslednjo funkcijo pri izrisu okna velikosti 500x300:
     1016{{{
     1017#!c
     1018void reshape (intw, inth) {
     1019glViewport(0, 0, w, h);
     1020glMatrixMode(GL_PROJECTION);
     1021glLoadIdentity();
     1022gluOrtho2D (0.0, w, 0.0, h);
     1023}
     1024}}}
     1025                                 
     1026== vaja133 ==
     1027Izrišite naslednji mnogokotnik v oknu velikosti 300x300 tako, da bo z leve in desne
     1028strani okoli 20% praznega prostora. Če želite ga lahko tudi pobarvate.
     1029{{{
     1030#!c
     1031glBegin(GL_POLYGON);
     1032glVertex2f(0.0, 0.0);
     1033glVertex2f(0.0, 3.0);
     1034glVertex2f(4.0, 3.0);
     1035glVertex2f(6.0, 1.5);
     1036glVertex2f(4.0, 0.0);
     1037glEnd();
     1038}}}
     1039                 
     1040== vaja134 ==
     1041Kocko iz vaje 124 rišite z gladkimi črtami debeline 1.5, za kar uporabite naslednja
     1042ukaza v glavnem programu:
     1043{{{
     1044#!c
     1045glEnable(GL_LINE_SMOOTH); 
     1046glLineWidth(1.5);
     1047}}}