Лабораторная работа № 5. Решетки Grid2D и вывод графиков функций Цель работы Изучение свойств плоских решеток Grid2D и возможности вывода графиков функций с помощью XYZGrid из группы объектов Graph-Plotting Objects Задание L5_a 1. Создайте проект L5_a 2. Разместите на форме основные компоненты GLScene 3. Добавьте три решетки плоскостей XY, XZ и YZ типа XYZGrid в редакторе сцены. 4. Добавьте к форме управляющие элементы перемещения плоскостей и отображения осей. 5. Добавьте процедуру вывода графика произвольной функции z = f(x,y); Пояснение Для задания уравнения функции z = f(x,y) используйте событие OnGetHeight для объекта вывода графиков GLHightField, как показано в следующей процедуре: void __fastcall TForm1::GLHeightField1GetHeight(const float x, const float y, float &z, TVector4f &color, TTexPoint &texPoint) { z = pow(x,2)+pow(y,2); // Пример задания графика функции z=f(x,y); } Для данного примера на экран будет выведен следующий график: Задание L5_b 1. Создать проект L5_b 2. Задать случайную траекторию броуновского движения точки внутри куба. 3. Создать случайную траекторию перемещения точки (частицы в случае броуновского движения) на сетке грид2d с отражением от границ решеток 4. Использовать датчик случайных чисел для выбора соседних ячеек как показано на схеме: 8 1 2 7 0 3 6 5 4 Воспользуйтесь следующим фрагментом кода. Фрагмент кода: TForm1 *Form1; int xst,yst,zst,xdl,ydl,zdl,xx,yy,zz; double dx,dy,dz,m,d; //--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {} void __fastcall TForm1::GLDummyCube1Progress(TObject *Sender, const double deltaTime, const double newTime) { xst++; yst++; zst++; if(xst>xdl) { xx=rand()%2; xdl=rand()%1000+100; xst=0; } if(yst>ydl) { yy=rand()%2; ydl=rand()%1000+100; yst=0; } if(zst>zdl) { zz=rand()%2; zdl=rand()%1000+100; zst=0; } if(xx==0){GLSphere1->TurnAngle=GLSphere1>TurnAngle+deltaTime*50;}else{GLSphere1->TurnAngle=GLSphere1>TurnAngle-deltaTime*50;} if(yy==0){GLSphere1->RollAngle=GLSphere1>RollAngle+deltaTime*50;}else{GLSphere1->RollAngle=GLSphere1>RollAngle-deltaTime*50;} if(zz==0){GLSphere1->PitchAngle=GLSphere1>PitchAngle+deltaTime*50;}else{GLSphere1->PitchAngle=GLSphere1>PitchAngle-deltaTime*50;} d=(double)TrackBar1->Position/10; GLSphere1->Position->X=GLSphere1->Position->X+dx; GLSphere1->Position->Y=GLSphere1->Position->Y+dy; GLSphere1->Position->Z=GLSphere1->Position->Z+dz; if(GLSphere1->Position->X>0.5) { dx=m*rand()/RAND_MAX/d; dx=dx*(-1.0); } if(GLSphere1->Position->X<-0.5) { dx=m*rand()/RAND_MAX/d; } if(GLSphere1->Position->Y>0.5) { dy=m*rand()/RAND_MAX/d; dy=dy*(-1.0); } if(GLSphere1->Position->Y<-0.5) { dy=m*rand()/RAND_MAX/d; } if(GLSphere1->Position->Z>0.5) { dz=m*rand()/RAND_MAX/d; dz=dz*(-1.0); } If (GLSphere1->Position->Z<-0.5) { dz=m*rand()/RAND_MAX/d; } GLHeightField1->StructureChanged(); } //--------------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender) { xst=0; yst=0; zst=0; xdl=rand()%1000+100; ydl=rand()%1000+100; zdl=rand()%1000+100; xx=rand()%2; yy=rand()%2; zz=rand()%2; m=1.0; d=(double)TrackBar1->Position/10; dx=m*rand()/RAND_MAX/d; dy=m*rand()/RAND_MAX/d; dz=m*rand()/RAND_MAX/d; } //--------------------------------------------------------------------------void __fastcall TForm1::GLHeightField1GetHeight(const float x, const float y, float &z, TVector4f &color, TTexPoint &texPoint) { z=1/(1+VectorNorm(GLSphere1->Position->X-x, GLSphere1->Position->Yy))*GLSphere1->Position->Z+0.5; } //--------------------------------------------------------------------------void __fastcall TForm1::CheckBox1Click(TObject *Sender) { GLHeightField1->Visible=CheckBox1->Checked; } //---------------------------------------------------------------------------