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

Вход на сайт

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

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

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

dobryj den, popytalas otkryt prikreplionnyj fail ctoby posmotret kak rabotaet, no mne ego ne pokazyvaet vydajet osibku. Pochemu?
Очень интересно! ии сайт крутой жалко что умирает(
У Вас число превысит максимальное число int. Можно использовать в Вашем случае uint, но лучше все переписать на double.
Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.

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

Рейтинг@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 кб