Главная » Все файлы » Просмотр файлов из архивов » PDF-файлы » Баяковский.Начальный курс OpenGL

Баяковский.Начальный курс OpenGL (Раздаточные материалы), страница 19

PDF-файл Баяковский.Начальный курс OpenGL (Раздаточные материалы), страница 19 Инженерная графика (39685): Другое - 5 семестрБаяковский.Начальный курс OpenGL (Раздаточные материалы) - PDF, страница 19 (39685) - СтудИзба2019-05-11СтудИзба

Описание файла

Файл "Баяковский.Начальный курс OpenGL" внутри архива находится в папке "Раздаточные материалы". PDF-файл из архива "Раздаточные материалы", который расположен в категории "". Всё это находится в предмете "инженерная графика" из 5 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Просмотр PDF-файла онлайн

Текст 19 страницы из PDF

Çàãðóçêà BMP ôàéëà{WORDbfType ;DWORDbfSize ;WORDbfReserved1 ;WORDbfReserved2 ;DWORDbfOffBits ;} BITMAPFILEHEADER;typedef struct tagBITMAPINFOHEADER {DWORDbiSize ;biWidth ;b iH e ig h t ;WORD b i P l a n e s ;WORD biBitCount ;DWORD biCompression ;DWORD b i S i z e I m a g e ;longbiXPelsPerMeter ;longbiYPelsPerMeter ;DWORD biClrUsed ;DWORD biClrImportant ;} BITMAPINFOHEADER;longlongstatic void IntTo2Bytes ( int val , BYTE buf [ 2 ] ){}buf [ 0 ] = (BYTE) v a l ;buf [ 1 ] = (BYTE) ( v a l >> 8 ) ;static void IntTo4Bytes ( int val , BYTE buf [ 4 ] ){}buf [ 0 ]buf [ 1 ]buf [ 2 ]buf [ 3 ]====(BYTE) v a l ;(BYTE) ( v a l >> 8 ) ;(BYTE) ( v a l >> 1 6 ) ;(BYTE) ( v a l >> 2 4 ) ;185Ïðèëîæåíèå Á.

Äåìîíñòðàöèîííûå ïðîãðàììû186Á.4. Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿÐåçóëüòàòîì âûïîëíåíèÿ ýòîé ïðîãðàììû ÿâëÿåòñÿ ïîñòðîåíèå òåòðàýäðà ñ âðàùàþùèìèñÿ âîêðóã íåãî êîëüöàìè, íà êîòîðûå íàíåñåíà òåêñòóðà.Ïðè êîìïèëÿöèè ïðîãðàììû â Microsoft Visual C++ ôàéë¾texture.bmp¿ íàäî ïîìåñòèòü â êàòàëîã ïðîåêòà èëè óêàçàòüïîëíûé ïóòü ê íåìó. Åñëè ïóòü íå óêàçàí, òî ïðè çàïóñêå èñïîëíÿåìîãî ôàéëà èç îïåðàöèîííîé ñèñòåìû ôàéë ñ òåêñòóðîéäîëæåí íàõîäèòüñÿ â òîì æå êàòàëîãå.

Äëÿ çàãðóçêè èçîáðàæåíèÿ òåêñòóðû ïðîãðàììà èñïîëüçóåò ôóíêöèþLoadBMP,ïðèâå-äåííóþ â ïðåäûäóùåì ïóíêòå.Ïðîãðàììà Á.5. Ïðèìåð òåêñòóðèðîâàíèÿ è àíèìàöèè.#include#include#include#include<s t d l i b . h><math . h><GL\ g l u t . h>"loadbmp . h"#define TETR_LIST 1GLfloat l i g h t _ c o l [ ] = { 1 , 1 , 1 } ;float mat_diff1 [ ] = { 0 . 8 , 0 . 8 , 0 .

8 } ;float mat_diff2 [ ] = { 0 . 0 , 0 . 0 , 0 . 9 } ;float mat_amb[] = { 0 . 2 , 0 . 2 , 0 . 2 } ;float mat_spec [ ] = { 0 . 6 , 0 . 6 , 0 . 6 } ;float s h i n i n e s s =0.7 * 128 , CurAng=0, RingRad=1,RingHeight =0.1;GLUquadricObj * QuadrObj ;GLuint TexId ;GLfloat TetrVertex [ 4 ] [ 3 ] , TetrNormal [ 4 ] [ 3 ] ;// Âû÷èñëåíèå íîðìàëè ê ïëîñêîñòè ,// çàäàâàåìîé òî÷êàìè a , b , cvoid getnorm ( float a [ 3 ] , float b [ 3 ] , float c [ 3 ] ,float * n )Á.4. Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿ{float mult =0;int i , j ;n [ 0 ] = ( b [1] − a [ 1 ] ) * ( c [2] − a [ 2 ] ) − ( b[2] − a [ 2 ] ) *( c [1] − a [ 1 ] ) ;n [ 1 ] = ( c [0] − a [ 0 ] ) * ( b [2] − a [ 2 ] ) − ( b[0] − a [ 0 ] ) *( c [2] − a [ 2 ] ) ;n [ 2 ] = ( b [0] − a [ 0 ] ) * ( c [1] − a [ 1 ] ) − ( c [0] − a [ 0 ] ) *( b[1] − a [ 1 ] ) ;}// Îïðåäåëåíèå íóæíîãî íàïðàâëåíèÿ íîðìàëè :// îò òî÷êè ( 0 , 0 , 0 )for ( i =0; i <3; i ++) mult+=a [ i ] * n [ i ] ;i f ( mult <0) for ( j =0; j <3; j++) n [ j ]=−n [ j ] ;//Âû÷èñëåíèå êîîðäèíàò âåðøèí òåòðàýäðàvoid I n i t V e r t e x T e t r ( ){float alpha =0;int i ;TetrVertex [ 0 ] [ 0 ] = 0 ;TetrVertex [ 0 ] [ 1 ] = 1 .

3 ;TetrVertex [ 0 ] [ 2 ] = 0 ;// Âû÷èñëåíèå êîîðäèíàò îñíîâàíèÿ òåòðàýäðàfor ( i =1; i <4; i ++){}}TetrVertex [ i ] [ 0 ] = 0 . 9 4 * cos ( alpha ) ;TetrVertex [ i ] [ 1 ] = 0 ;TetrVertex [ i ] [ 2 ] = 0 . 9 4 * s i n ( alpha ) ;alpha +=120.0 * 3.14/180.0;// Âû÷èñëåíèå íîðìàëåé ñòîðîí òåòðàýäðàvoid InitNormsTetr ( ){getnorm ( TetrVertex [ 0 ] , TetrVertex [ 1 ] ,187Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììû188}TetrVertex [ 2 ]getnorm ( TetrVertex [ 0 ]TetrVertex [ 3 ]getnorm ( TetrVertex [ 0 ]TetrVertex [ 1 ]getnorm ( TetrVertex [ 1 ]TetrVertex [ 3 ], TetrNormal [ 0 ] ) ;, TetrVertex [ 2 ] ,, TetrNormal [ 1 ] ) ;, TetrVertex [ 3 ] ,, TetrNormal [ 2 ] ) ;, TetrVertex [ 2 ] ,, TetrNormal [ 3 ] ) ;// Ñîçäàíèå ñïèñêà ïîñòðîåíèÿ òåòðàýäðàvoid MakeTetrList ( ){int i ;glNewList (TETR_LIST,GL_COMPILE) ;// Çàäàíèå ñòîðîí òåòðàýäðàg l B e g i n (GL_TRIANGLES) ;for ( i =1; i <4; i ++){glNormal3fv ( TetrNormal [ i − 1 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ 0 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ i ] ) ;i f ( i !=3)g l V e r t e x 3 f v ( TetrVertex [ i + 1 ] ) ;else}g l V e r t e x 3 f v ( TetrVertex [ 1 ] ) ;}glNormal3fv ( TetrNormal [ 3 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ 1 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ 2 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ 3 ] ) ;glEnd ( ) ;glEndList ( ) ;void DrawRing ( ){// Ïîñòðîåíèå öèëèíäðà ( êîëüöà ) , ðàñïîëîæåííîãîÁ.4.

Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿ////////////}ïàðàëëåëüíî îñè zÂòîðîé è òðåòèé ïàðàìåòðû çàäàþòðàäèóñû îñíîâàíèé , ÷åòâåðòûé âûñîòó ,ïîñëåäíèå äâà −÷èñëî ðàçáèåíèé âîêðóã èâäîëü îñè z . Ïðè ýòîì äàëüíåå îñíîâàíèåöèëèíäðà íàõîäèòñÿ â ïëîñêîñòè z=0g l u C y l i n d e r ( QuadrObj , RingRad , RingRad ,RingHeight , 3 0 , 2 ) ;void T e x t u r e I n i t ( ){char s t r F i l e [ ] = " t e x t u r e . bmp" ;IMAGE img ;// Âûðàâíèâàíèå â * . bmp ïî áàéòóg l P i x e l S t o r e i (GL_UNPACK_ALIGNMENT, 1 ) ;// Ñîçäàíèå èäåíòèôèêàòîðà äëÿ òåêñòóðûglGenTextures (1 ,& TexId ) ;// Çàãðóçêà èçîáðàæåíèÿ â ïàìÿòüi f ( ! LoadBMP( s t r F i l e , &img ) )return ; ;// Íà÷àëî îïèñàíèÿ ñâîéñòâ òåêñòóðûglBindTexture (GL_TEXTURE_2D, TexId ) ;// Ñîçäàíèå óðîâíåé äåòàëèçàöèè è èíèöèàëèçàöèÿ// òåêñòóðûgluBuild2DMipmaps (GL_TEXTURE_2D, 3 ,img .

width , img . height ,GL_RGB,GL_UNSIGNED_BYTE, img . data ) ;// Ðàçðåøåíèå íàëîæåíèÿ ýòîé òåêñòóðû íà// q u a d r i c −îáúåêòûgluQuadricTexture ( QuadrObj , GL_TRUE) ;// Çàäàíèå ïàðàìåòðîâ òåêñòóðû// Ïîâòîð èçîáðàæåíèÿ ïî ïàðàìåòðè÷åñêèì189190Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììû// îñÿì s è tglTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT) ;glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_REPEAT) ;// Íå èñïîëüçîâàòü èíòåðïîëÿöèþ ïðè âûáîðå òî÷êè// íà òåêñòóðåglTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST) ;glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST) ;// Ñîâìåùàòü òåêñòóðó è ìàòåðèàë îáúåêòà}glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE) ;void I n i t ( void ){InitVertexTetr ( ) ;InitNormsTetr ( ) ;MakeTetrList ( ) ;// Îïðåäåëåíèå ñâîéñòâ ìàòåðèàëàg l M a t e r i a l f v (GL_FRONT_AND_BACK, GL_AMBIENT,mat_amb ) ;g l M a t e r i a l f v (GL_FRONT_AND_BACK, GL_SPECULAR,mat_spec ) ;g l M a t e r i a l f (GL_FRONT, GL_SHININESS ,shininess );// Îïðåäåëåíèå ñâîéñòâ îñâåùåíèÿg l L i g h t f v (GL_LIGHT0, GL_DIFFUSE, l i g h t _ c o l ) ;glEnable (GL_LIGHTING ) ;glEnable (GL_LIGHT0 ) ;Á.4.

Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿ// Ïðîâîäèòü óäàëåíèå íåâèäèìûõ ëèíèé è// ïîâåðõíîñòåéglEnable (GL_DEPTH_TEST) ;// Ïðîâîäèòü íîðìèðîâàíèå íîðìàëåéglEnable (GL_NORMALIZE) ;// Ìàòåðèàëû îáúåêòîâ îòëè÷àþòñÿ òîëüêî öâåòîì// äèôôóçíîãî îòðàæåíèÿglEnable (GL_COLOR_MATERIAL) ;g l C o l o r M a t e r i a l (GL_FRONT_AND_BACK,GL_DIFFUSE ) ;// Ñîçäàíèÿ óêàçàòåëÿ íà q u a d r i c −îáúåêò// äëÿ ïîñòðîåíèÿ êîëåöQuadrObj=gluNewQuadric ( ) ;// Îïðåäåëåíèå ñâîéñòâ òåêñòóðûTextureInit ( ) ;// Çàäàíèå ïåðñïåêòèâíîé ïðîåêöèèglMatrixMode (GL_PROJECTION) ;gluPerspective (89.0 , 1.0 , 0.5 , 100.0);// Äàëåå áóäåò ïðîâîäèòüñÿ òîëüêî// ïðåîáðàçîâàíèå îáúåêòîâ ñöåíû}glMatrixMode (GL_MODELVIEW) ;void DrawFigures ( void ){// Âêëþ÷åíèå ðåæèìà íàíåñåíèÿ òåêñòóðûglEnable (GL_TEXTURE_2D) ;// Çàäàåì öâåò äèôôóçíîãî îòðàæåíèÿ äëÿ êîëåög l C o l o r 3 f v ( mat_diff1 ) ;// ×òîáû íå ïðîâîäèòü ïåðåìíîæåíèå ñ ïðåäûäóùåé// ìàòðèöåé çàãðóæàåì åäèíè÷íóþ ìàòðèöóglLoadIdentity ( ) ;// Îïðåäåëÿåì òî÷êó íàáëþäåíèÿ191192Ïðèëîæåíèå Á.

Äåìîíñòðàöèîííûå ïðîãðàììûgluLookAt ( 0 . 0 , 0 . 0 , 2 . 5 ,0.0 , 0.0 , 0.0 ,0.0 , 1.0 , 0.0);// Ñîõðàíÿåì âèäîâóþ ìàòðèöó , òàê êàê äàëüøå// áóäåò ïðîâîäèòüñÿ ïîâîðîò êîëåöglPushMatrix ( ) ;////////Ïðîèçâîäèì íåñêîëüêî ïîâîðîòîâ íà íîâûé óãîë( ýòî áûñòðåå , ÷åì óìíîæàòü ïðåäûäóùóþ âèäîâóþìàòðèöó íà ìàòðèöó ïîâîðîòà ñ ôèêñèðîâàííûìóãëîì ïîâîðîòà )g l R o t a t e f (−CurAng , 1 , 1 , 0 ) ;g l R o t a t e f ( CurAng , 1 , 0 , 0 ) ;// Äëÿ ðèñîâàíèÿ êîëåö êàæäîå èç íèõ íàäî// ïðåîáðàçîâàòü îòäåëüíî , ïîýòîìó ñíà÷àëà// ñîõðàíÿåì âèäîâóþ ìàòðèöó , çàòåì âîññòàíàâëèâàåìglPushMatrix ( ) ;g l T r a n s l a t e f (0 ,0 , − RingHeight / 2 ) ;DrawRing ( ) ;glPopMatrix ( ) ;glPushMatrix ( ) ;g l T r a n s l a t e f ( 0 , RingHeight / 2 , 0 ) ;glRotatef (90 ,1 ,0 ,0);DrawRing ( ) ;glPopMatrix ( ) ;glPushMatrix ( ) ;g l T r a n s l a t e f (− RingHeight / 2 , 0 , 0 ) ;glRotatef (90 ,0 ,1 ,0);DrawRing ( ) ;glPopMatrix ( ) ;// Âîññòàíàâëèâàåì ìàòðèöó äëÿ ïîâîðîòîâ òåðàýäðàglPopMatrix ( ) ;// Âûêëþ÷àåì ðåæèì íàëîæåíèÿ òåêñòóðûg l D i s a b l e (GL_TEXTURE_2D) ;// Ïðîâîäèì ïîâîðîòûg l R o t a t e f ( CurAng , 1 , 0 , 0 ) ;Á.4.

Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿ193g l R o t a t e f ( CurAng / 2 , 1 , 0 , 1 ) ;// ×òîáû òåòðàýäð âðàùàëñÿ âîêðóã öåíòðà , å ã î// íàäî ñäâèíóòü âíèç ïî îñè ozg l T r a n s l a t e f ( 0 , − 0.33 , 0 ) ;// Çàäàåì öâåò äèôôóçíîãî îòðàæåíèÿ äëÿ òåòðàýäðàg l C o l o r 3 f v ( mat_diff2 ) ;// Ïðîâîäèì ïîñòðîåíèå òåòðàýäðà}g l C a l l L i s t (TETR_LIST ) ;void Display ( void ){// Èíèöèàëèçàöèÿ ( î÷èñòêà ) òåêóùåãî áóôåðà// êàäðà è ãëóáèíûg l C l e a r (GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT) ;// Ïîñòðîåíèå îáúåêòîâDrawFigures ( ) ;// Ïåðåñòàíîâêà áóôåðîâ êàäðà}glutSwapBuffers ( ) ;void Redraw ( void ){// Óâåëè÷åíèå òåêóùåãî óãëà ïîâîðîòàCurAng+=1;// Ñèãíàë äëÿ âûçîâà ïðîöåäóðû ñîçäàíèÿ èçîáðàæåíèÿ// ( äëÿ îáíîâëåíèÿ )}glutPostRedisplay ( ) ;int main ( int argc , char{** argv )Ïðèëîæåíèå Á.

Äåìîíñòðàöèîííûå ïðîãðàììû194// Èíèöèàëèçàöèÿ ôóíêöèé áèáëèîòåêè GLUTg l u t I n i t (&argc , argv ) ;// Çàäàíèå ðåæèìà ñ äâîéíîé áóôåðèçàöèåé ,// ïðåäñòàâëåíèå öâåòà â ôîðìàòå RGB,// èñïîëüçîâàíèå áóôåðà ãëóáèíûg l u t I n i t D i s p l a y M o d e (GLUT_DOUBLE |GLUT_RGB |GLUT_DEPTH) ;// Ñîçäàíèå îêíà ïðèëîæåíèÿglutCreateWindow ( "Example o f u s i n g OpenGL" ) ;// Ðåãèñòðàöèÿ ôóíêöèè ïîñòðîåíèÿ èçîáðàæåíèÿglutDisplayFunc ( Display ) ;// Ðåãèñòðàöèÿ ôóíêöèè îáíîâëåíèÿ èçîáðàæåíèÿg l u t I d l e F u n c ( Redraw ) ;// Èíèöèàëèçàöèÿ ôóíêöèé OpenGLInit ();// Öèêë îáðàáîòêè ñîáûòèéglutMainLoop ( ) ;}return 0 ;Ðèñ. Á.3.

Ðåçóëüòàò ðàáîòû ïðîãðàììû Á.5.Á.5. Êëàññ äëÿ ðàáîòû ñ OPENGL â WIN32195Á.5. Êëàññ äëÿ ðàáîòû ñ OpenGL â Win32Ïðîãðàììà Á.6. Ôàéë glrc.h.#ifndef _GLRC_H_#define _GLRC_H_// çàãîëîâêè OpenGL#include <g l / g l . h>#include <g l / gl u . h>class GLRC{public :// ñîçäàíèå èç èäåíòèôèêàòîðà îêíàGLRC( HWND wnd ) ;// äåñòðóêòîð~GLRC( ) ;// óäàëåíèå (òàêæå âûçûâàåòñÿ èç äåñòðóêòîðà )void Destroy ( ) ;// Ñîçäàíèå êîíòåêñòà ðèñîâàíèÿ .// Íåîáõîäèìî âûçâàòü äî èñïîëüçîâàíèÿ OpenGLbool Create ( ) ;// Ñîçäàí ëè êîíòåêñò ðèñîâàíèÿ ?bool I s C r e a t e d ( ) ;// ßâëÿåòñÿ ëè êîíòåêñò ðèñîâàíèÿ òåêóùèì?bool I s C u r r e n t ( ) const ;// Äåëàåò êîíòåêò òåêóùèìbool MakeCurrent ( ) ;196Ïðèëîæåíèå Á.

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5259
Авторов
на СтудИзбе
421
Средний доход
с одного платного файла
Обучение Подробнее