Лабораторная работа № 5. Решетки Grid2D и вывод графиков функций

advertisement
Лабораторная работа № 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;
}
//---------------------------------------------------------------------------
Download