Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Здравствуйте, Ильгиз. Математика - царица наук (Карл Гаусс). Изучение математики начинается с детского сада, когда нас учат считать и выполнять простые арифметические операции. Любой, даже самый простейший алгоритм будет связан с арифметическими...
Я хотел узнать математика это обязательно в программирование. Пять лет назад просто из любопытства я увлекся HTML потом изучил CSS и JvaScript потом изучил PHP и Java. Как то не задумывался и начал смотреть форумы и узнал что без математики не...
Все верно, но так же необходимо зайти в: Компоновщик -> Ввод -> Дополнительные зависимости Здесь необходимо нажать изменить и в Дополнительные зависимости прописать это: SDL2.lib SDL2main.lib SDL2test.lib Без этого не заработает. (MVS 2015)
Спасибо за реализацию, она действительно быстрая. Но не все линии отрисовывает в нужную сторону... Необходимо добавить проверку для случая X-линии if(y1 "<" y0) grad=-grad; и аналогично для Y-линии if(x1 "<" x0) grad=-grad; P.S. На...
Отличные уроки(учу GL по ним), только в renderScene нужно добавить очистку буфера цвета и буфера глубины. При изменении размеров треугольники размножаются)

Счетчики и рейтинг

Яндекс.Метрика Рейтинг@Mail.ru
Скриншот к примеру
Среда программирования: 
Borland Delphi 7.0
Статья по теме: 

В "окне" программы мы видим сосуд наполненный "жидкостью".В нижней части "окна" расположены задаваемые величины и три кнопки: "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 кб