В "окне" программы мы видим сосуд наполненный "жидкостью".В нижней части "окна" расположены задаваемые величины и три кнопки: "Go"(начало), "Restart"(перезапуск программы), "Exit"(выход).Для запуска программы необходимо ввести значения в диапазоне которые указаны над каждым окном и нажать кнопку "Go",что бы поменять значения достаточно их ввести и нажать кнопку "Restart".
Для расчетов нам потребуются:
1) Плотность жидкости
2) Масса и радиус шара
3) Формулы расчета скорости и ускорения шара в жидкости
Используемые формулы: В результате преобразований получаем формулы для ускорения шара и скорости движения:
1) Объем шара:V=4/3пR3
2) Сила Архимеда: Fа = рgV
3) Формула для расчета плотности вещества шара: р=V/m
4) Формула силы земного притяжения F=mg
5) Второй закон Ньютона F=ma
1) dl=g(q*V/m-1)*t
2) V0=g*((q*v/m)-1)*t
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls,OpenGL, Buttons, StdCtrls, GLUT, ComCtrls; type TForm1 = class(TForm) Timer1: TTimer; Timer2: TTimer; Panel1: TPanel; Timer3: TTimer; Timer5: TTimer; Timer6: TTimer; StaticText1: TStaticText; StaticText2: TStaticText; StaticText4: TStaticText; BitBtn1: TBitBtn; Edit2: TEdit; Timer4: TTimer; Edit1: TEdit; Edit3: TEdit; Timer7: TTimer; BitBtn2: TBitBtn; BitBtn3: TBitBtn; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormResize(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure Timer4Timer(Sender: TObject); procedure Timer7Timer(Sender: TObject); procedure BitBtn2Click(Sender: TObject); procedure BitBtn3Click(Sender: TObject); private DC : HDC; hrc: HGLRC; quadObj:GLUquadricObj; public { Public declarations } end; var Alpha:real; position_1 : array[0..3] of GLfloat; local_light: array[0..3] of GLfloat; Form1: TForm1; dvig:boolean; dv:integer; K_Y,K_X:integer; z,z_angle:GLFloat; x_angle:GLFloat; y_angle:GLFloat; razm:GLFloat; K: array [0..4] of GLFloat; c: array [0..23,0..3] of GLFloat; mas: array [0..1,0..3] of extended; TBpos,krugi,kol,i,vert,kof: integer; xpos,ypos:integer; t, V0, m, r, q, V, dL, L, otn,typ: extended; implementation {$R *.dfm} procedure MyInit; const light_specular1 : array[0..3] of GLfloat = (1.0, 1.0, 1.0, 1.0); // no_shininess : array[0..0] of GLfloat = ( 0.0 ); low_shininess : array[0..0] of GLfloat = ( 5.0 ); high_shininess : array[0..0] of GLfloat = ( 100.0 ); light_position:array[0..3] of GLfloat = (0.0, 1.0, 1.0, 0.0); begin position_1[0]:=-2; position_1[1]:=0; position_1[2]:=0; position_1[3]:=1; glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); glDisable(GL_CULL_FACE); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0); glLightfv(GL_LIGHT1,GL_SPECULAR, @light_specular1); glMaterialfv(GL_FRONT, GL_SHININESS, @high_shininess); glLightfv (GL_LIGHT1, GL_POSITION, @position_1); glMaterialf (GL_FRONT, GL_SHININESS, 64.0); end; procedure SetDCPixelFormat (hdc : HDC); var pfd : TPixelFormatDescriptor; nPixelFormat : Integer; begin FillChar(pfd, SizeOf(pfd),1); // заполнение цветом nPixelFormat:=ChoosePixelFormat(hdc, @pfd); SetPixelFormat(hdc, nPixelFormat, @pfd); end; procedure TForm1.FormCreate(Sender: TObject); begin // инициализация переменных , таймера , источников света DC:=GetDC(Handle); SetDCPixelFormat(DC); hrc:=wglCreateContext(DC); wglMakeCurrent(DC,hrc); glPolygonMode (GL_FRONT, GL_FILL); quadObj:=gluNewQuadric; timer2.Enabled:=false; razm:=-3; t:=Timer4.interval/1000; V0:=0; typ:=6; l:=0.1; end; procedure TForm1.FormDestroy(Sender: TObject); begin // перерисовка изображения DC:=GetDC(Handle); SetDCPixelFormat (DC); hrc:=wglCreateContext(DC); DeleteDC (DC); gluDeleteQuadric (quadObj); end; procedure TForm1.FormPaint(Sender: TObject); begin glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); gluQuadricDrawStyle(quadObj, glu_fill); glClearColor(0.3,0.5,0.5,0.5); Kof:=1; glEnable(GL_DEPTH_TEST); glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glPushMatrix; //Сосуд glRotatef(0,0,1,0); glColor3f(1.0,0.7,0); glBegin(GL_LINES); glVertex3f(-5,0,0); glVertex3f(5,0,0); glEnd; glBegin(GL_LINES); glVertex3f(-5,8,0); glVertex3f(5,8,0); glEnd; glBegin(GL_LINES); glVertex3f(-5,0,0); glVertex3f(-5,10,0); glEnd; glBegin(GL_LINES); glVertex3f(5,0,0); glVertex3f(5,10,0); glEnd; // отрисовываем шар glTranslatef(0,l,0); gluSphere(quadobj, r, 30, 30); glPopMatrix; SwapBuffers(DC); MyInit; end; procedure TForm1.FormResize(Sender: TObject); begin glViewport(0, 0, ClientWidth, ClientHeight); glLoadIdentity; otn:=form1.Width/form1.Height; glFrustum (-4*otn, 4*otn, -3, 10, 1, 15); // задаем перспективу видимости glTranslatef(-1,1,razm); glRotatef(x_angle, 1.0, 0.0, 0.0); glRotatef(y_angle, 0.0, 1.0, 0.0); glRotatef(z_angle, 0.0, 0.0, 1.0); InvalidateRect(Handle, nil, False); end; procedure TForm1.BitBtn1Click(Sender: TObject); //старт+ввод данных begin form1.Timer4.Enabled:=true; q:=strtofloat(form1.Edit1.text); r:=strtofloat(form1.Edit2.text); m:=strtofloat(form1.Edit3.text); if r>0.5 then ShowMessage('error, incorrect size, '+#13#10+' please insert new number <=0,5'); if r>0.5 then r:=0.5; Edit2.text:=floattostr(r); if m<=0 then ShowMessage('Mass cant be negative'); if m<=0 then m:=5; Edit3.text:=floattostr(m); if q<=0 then ShowMessage('Cant be negative or equval 0'); if q<=0 then q:=1000; Edit1.text:=floattostr(q); end; procedure TForm1.Timer4Timer(Sender: TObject); begin v:=4/3*3.14*r*r*r; //вычисляем объем шара L:=l+dl; dl:=V0*t-9.8*((q*v/m)-1)*t*t/2; //изменение положения шара с учетом ускорения V0:=V0+9.8*((q*v/m)-1)*t; //изменение скорости движения if L>8 then dl:=V0*t-9.8*((q*v/m)-1)*t*t/2; //ускорение шара вне среды if L>8 then V0:=V0-9.8*2*((3*q*v/m)-1)*t; //исзменение скорости вне среды if L>9 then Form1.Timer7.Enabled:=true; if L<0 then L:=0; //дно end; procedure TForm1.Timer7Timer(Sender: TObject); begin if l<typ then l:=typ+dl; if l<typ then dl:=V0*t-9.8*((q*v/m)-1)*t*t/2; //движение после вылета из среды if L<typ then V0:=V0+9.8*((q*v/m)-1)*t; if l>typ then typ:=typ+0.01; end; procedure TForm1.BitBtn2Click(Sender: TObject); //рестарт begin Form1.Timer7.Enabled:=false; Form1.Timer4.Enabled:=false; V0:=0; l:=0.1; typ:=6; end; procedure TForm1.BitBtn3Click(Sender: TObject); begin Close; end; end.
Прикрепленный файл | Размер |
---|---|
Исполняемый файл | 175.52 кб |
Исходные коды | 527.26 кб |