Changes between Version 66 and Version 67 of naloge


Ignore:
Timestamp:
Dec 5, 2011, 2:19:30 PM (12 years ago)
Author:
skulovec
Comment:

dodanih šest primerov pythonocc

Legend:

Unmodified
Added
Removed
Modified
  • naloge

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