Отображение изменения уровня воды в цилиндрическом сосуде с применением средств графического отображения и компонента класса “TTimer”, страница 3

Описание математического аппарата.

В этой задаче используется довольно сложный математический аппарат. Происходит расчет объема вытекаемой воды, а также изменения объема и высоты водяного столба в сосуде.

Формула, определяющая объем вытекаемой воды в секунду:, где S – площадь сегмента, которая рассчитывается по формуле: , где λ – угол в градусах при вершине сектора, который рассчитывается по формуле: , где a и b –прилежащий и противолежащий катет в прямоугольном треугольнике(). Формула перевода из градусов в радианы: , v – скорость вытекания вода из трубы(формула Герона):, где h – высота столба жидкости, а g – ускорение свободного падения.

Если высота столба выше канала то объем рассчитывается по формуле: .

В программе это представлено так:

          poz:=Kanal.poz/10;

          r:=Kanal.V/20;

          if (h>poz) and (h<(poz+2*r)) then

                begin

                x:=h-Poz;

                y:=abs(r-x);

                z:=sqrt(sqr(r)-sqr(y));

                St:=y*z;

                Ss:=sqr(r)*arctan(z/y);

                if r>x then S:=Ss-St else S:=Ss+St;

                dV:=dV- S*sqrt(2*98.1*(h-poz))

                end

          else if h>=poz+2*r then dV:=dV-Pi*sqr(r)*sqrt(2*98.1*(h-poz));

          end;

Структура диалогов.

                        (1)      

(2)                        (3)

(4)

        (5)

Диалоговые окна добавление/изменений канала физически являются одной формой, поэтому их поведение одинаково. При работе с ней надо ввести требуемые данные. При работе с этой формой могут произойти ошибки, которые обрабатываются следующим способом:

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

var

  V,H,D,k,j:integer;

  i:boolean;

BEGIN

if RadioGroup1.ItemIndex=0 then

  begin

  if ModalResult=mrOk then

  try

    if Trim(Edit1.Text)='' then

    begin

    Edit1.SetFocus;

    raise Exception.Create(‘');

    end;

  V:=StrToInt(Edit1.Text);

  if V<=0 then

    begin

    Edit1.SetFocus;

    raise Exception.Create(');

    end;

  k:=0;

  For j:=1 to 10 do

    if CopyZ[j]=true then inc(k);

    if k=10 then raise Exception.Create(');

    except

  on EConvertError do

    begin

    CanClose:=False;

    Edit1.SetFocus;

    MessageDlg('’);

    end;

  on E:Exception do

    begin

    CanClose:=False;

    MessageDlg(E.Message,mtWarning,[mbCancel],0);

    end;

    end;

    end

else

if RadioGroup1.ItemIndex=1 then

  if ModalResult=mrOk then

  try

  k:=0;

  For j:=StrToInt(Edit2.Text) to StrToInt(Edit2.Text)+StrToInt(Edit1.Text) do

  if CopyZZ[j]=false then inc(k);

  if StrToInt(Edit2.Text)+StrToInt(Edit1.Text)>300 then raise Exception.Create(')

  else if k<>StrToInt(Edit1.Text)+1 then raise Exception.Create(');

  if Trim(Edit1.Text)='' then

    begin

    Edit1.SetFocus;

    raise Exception.Create(');

    end;

  if Trim(Edit2.Text)='' then

    begin

    Edit2.SetFocus;

    raise Exception.Create('Âû ');

    end;

  i:=false;

  D:=StrToint(Edit1.Text);

  i:=true;

  if D<=0 then

    begin

    Edit1.SetFocus;

    raise Exception.Create(');

    end;

  H:=StrToint(Edit2.Text);

  if (H<0) or (H>300) then

    begin

    Edit2.SetFocus;

    raise Exception.Create(');

    end;

  except

  on EConvertError do

    if not(i) then

      begin

      CanClose:=False;

      Edit1.SetFocus;

      MessageDlg(');

      end

    else

      begin

      CanClose:=False;

      Edit2.SetFocus;

      MessageDlg(');

      end;

  on E:Exception do

    begin

    CanClose:=False;

    MessageDlg(E.Message,mterror,[mbCancel],0);

    end;

end;

end;

Инструкция по эксплуатации:

В начале программы отображается пустой сосуд. Чтобы произошло действие нужно добавить хотябы один канал. После добавления подводящего канала уровени воды начнется подниматься. Так же можно добавить отводящий канал, в этом случае прирост высоты столба может остановиться, если сравняются объемы подводимой и отводимой воды. Созданные каналы можно удальть, редактировать, если предварительно их выделить в списке.