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 ;
{ ***********************************************
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.