Методичні вказівки до обов’язкового домашнього завдання з дисципліни «Організація баз даних та знань», страница 13

         inc(Result) ;

         i := qu.Fields[0].AsInteger ; // Номер точки

         isP[i] := true; // Точка определена

  //ShowMessage('Точка:'+IntToStr(i)+'Fields:'+IntToStr(nf));

           for j := 1 to (nf-1) do

              if (j <= nf) then

                  iP[j][i]  := qu.Fields[j].AsFloat ;

         qu.Next ; // Следующая запись набора данных

      end;

   // ShowMessage('Прочитали выборку!');

   if Result < 3 then

       MessageDlg('Не могу рассчитать параметры хладагента '+

       'в указанной точке (давление (Па) '+FloatTostr(x)+

  ', температура '+FloatToStr(y)+' °С). Действие отклонено.',

       mtWarning, [mbOk], 0)

   else begin // Определим ближайшие границы точки:

      If isP[1] then begin

         Xmin:= iP[1][1] ; Ymin := iP[2][1]; End;

      If isP[2] then begin

         Xmin:= iP[1][2] ; Ymax := iP[2][2]; End;

      If isP[3] then begin

         Xmax:= iP[1][3] ; Ymax := iP[2][3]; End;

      If isP[4] then begin

         Xmax:= iP[1][4] ; Ymin := iP[2][4]; End;

   end;

   qu.Close ;

end;

Procedure TfmCalcNH3sh.CalcProperties ;

// Расчет свойств в интервале между 4-мя точками методом

// кусочно-триангулярной интерполяции:

Var NumP, i :Integer; yz :Extended;

  Procedure Flat;

  var i :Integer;

  begin

     SqueezeA ; // упакуем точки одна за одной

     // вычислим по уравнению плоскости

     For i := 3 to NN do iR[i] := Flatness(i, x, y) ;

  end;

begin

   // Введем исходные данные:

    p := GetReal(edp.Text) * 1.0e6 ; // Переводим из МПа в Па

    t := GetReal(edT.Text) ;  x := p ; y := t ;

   DM.qu4P.ParamByName('id1').AsInteger := DM.Num_Substance ;

    DM.qu4P.ParamByName('x1').AsFloat    := p ;

    DM.qu4P.ParamByName('y1').AsFloat    := t ;

   DM.qu4P.ParamByName('id2').AsInteger := DM.Num_Substance ;

    DM.qu4P.ParamByName('x2').AsFloat    := p ;

    DM.qu4P.ParamByName('y2').AsFloat    := t ;

   DM.qu4P.ParamByName('id3').AsInteger := DM.Num_Substance ;

    DM.qu4P.ParamByName('x3').AsFloat    := p ;

    DM.qu4P.ParamByName('y3').AsFloat    := t ;

   DM.qu4P.ParamByName('id4').AsInteger := DM.Num_Substance ;

    DM.qu4P.ParamByName('x4').AsFloat    := p ;

    DM.qu4P.ParamByName('y4').AsFloat    := t ;

    NumP := GetVars(DM.qu4P) ; // Прочитаем соседние точки

       // Если получено хотя бы 3 точки, обрабатываем

       IF ( NumP > 2 ) THEN BEGIN

         iR[1] := x ; iR[2] := y;

         If (Xmin=Xmax) then Begin

            if (Ymin=Ymax) then {узловая точка} begin

               For i := 1 to NN do iR[i] := ip[i][1] ;

            end else { Ymin # Ymax } begin

                {точка на вертикали}

               For i := 3 to NN do

                { линейная интерполяция по вертикали}

                  iR[i] := ip[i][1] + (ip[i][2] - ip[i][1])

                      /(ip[2][2] - ip[2][1])*(y - ip[2][1]) ;

            end;

         End Else { Xmin # Xmax } begin

            if ( Ymin=Ymax ) then begin

                  {точка на горизонтали}

               For i := 3 to NN do

                  {лин. интерп. по горизонтали}

                  iR[i] := ip[i][1] + (ip[i][4] - ip[i][1])

                      /(ip[1][4] - ip[1][1])*(x - ip[1][1]) ;

            end else begin { Ymin # Ymax }

            // не горизонталь, а произвольная точка в области

               if NumP = 3 then begin // точек 3

                  Flat; // Плоская интерполяция

               end else begin { точек 4 }

                  // определим треугольник:

                  yz := ip[2][1] + (ip[2][3] - ip[2][1])

                       /(ip[1][3]-ip[1][1])*(x-ip[1][1]) ;

                  if (y > yz) then begin { верхний левый }

                      isP[4] := false;  Flat;

                  end else begin         { нижний правый }

                      isP[2] := false;   Flat;

                  end;

               end;

            end;

         End;

       END;

end;

procedure TfmCalcNH3sh.edTExit(Sender: TObject);

begin CheckReal(Sender as TEdit) ; end;

Procedure TfmCalcNH3sh.SqueezeA ;

{ ***********************************************