Лабник по СПО
.pdfWoEd.Text:=FloatToStrF(Wo,ffGeneral,5,3);
fo:=Wo/2/Pi;
foEd.Text:=FloatToStrF(fo,ffGeneral,5,3);
tp:=1/fo;
tpEd.Text:=FloatToStrF(tp,ffGeneral,5,3)
End;
Procedure TfmHt.ToEdChange(Sender: TObject);
Begin
If ToEd.Focused Then
Begin
T0:=Vvod(ToEd.Text); If T0>100 Then T0:=100;
If T0<0.001 Then T0:=0.001; a:=-Kci/T0;
Wo:=Kci1/T0;
WoEd.Text:=FloatToStrF(Wo,ffGeneral,5,3);
fo:=Wo/2/Pi;
foEd.Text:=FloatToStrF(fo,ffGeneral,5,3);
tp:=1/fo;
tpEd.Text:=FloatToStrF(tp,ffGeneral,5,3)
End
End;
Procedure TfmHt.WoEdChange(Sender: TObject);
Begin
If WoEd.Focused Then
Begin
Wo:=Vvod(WoEd.Text);
If Wo>1000 Then Wo:=1000;
If Wo<0.01 Then Wo:=0.01; T0:=Kci1/Wo; fo:=Wo/2/Pi;
tp:=1/fo;
ToEd.Text:=FloatToStrF(T0,ffGeneral,5,3);
foEd.Text:=FloatToStrF(fo,ffGeneral,5,3);
tpEd.Text:=FloatToStrF(tp,ffGeneral,5,3)
161
PDF created with pdfFactory Pro trial version www.pdffactory.com
End
End;
Procedure TfmHt.foEdChange(Sender: TObject);
Begin
If foEd.Focused Then
Begin fo:=Vvod(foEd.Text);
If fo>1000 Then fo:=1000; If fo<0.01 Then fo:=0.01; Wo:=fo*2*Pi;
tp:=1/fo;
T0:=Kci1/Wo;
ToEd.Text:=FloatToStrF(T0,ffGeneral,5,3);
WoEd.Text:=FloatToStrF(Wo,ffGeneral,5,3);
tpEd.Text:=FloatToStrF(tp,ffGeneral,5,3)
End
End;
Procedure TfmHt.tpEdChange(Sender: TObject);
Begin
If tpEd.Focused Then
Begin tp:=Vvod(tpEd.Text);
If tp<0.001 Then tp:=0.001; If tp>100 Then tp:=100; fo:=1/tp;
foEd.Text:=FloatToStrF(fo,ffGeneral,5,3);
Wo:=fo*2*Pi;
WoEd.Text:=FloatToStrF(Wo,ffGeneral,5,3);
T0:=Kci1/Wo;
ToEd.Text:=FloatToStrF(T0,ffGeneral,5,3)
End
End;
Создаём процедуру рисования координат с учётом заданного значения максимального времени, реализующую блок 20 из рис.6.2.
Procedure TfmHt.Scale;
162
PDF created with pdfFactory Pro trial version www.pdffactory.com
Var
J :Byte;
Begin
With ImageGraf.Canvas Do
Begin
Font.Color:=clBlack;
Pen.Color:=clBlack;
Pen.Width:=1;
MoveTo(3,275);
LineTo(590,275);
MoveTo(30,280);
LineTo(30,10); TextOut(27, 280,'0'); MoveTo(25,150); LineTo(590,150); TextOut(10, 145,'1'); TextOut(580, 258,'t'); TextOut(15, 10,'h');
MoveTo(30,10); LineTo(33,20);
MoveTo(30,10); LineTo(27,20); MoveTo(590,275); LineTo(580,272); MoveTo(590,275); LineTo(580,278)
End;
For J:=1 To tmax Do
With ImageGraf.Canvas Do
Begin
MoveTo(30+CnSc*J,280);
LineTo(30+CnSc*J,15); TextOut(28+CnSc*J, 285,IntToStr(J))
End End;
Пишем процедуру удаления графиков и восстановления осей координат (реализация блоков 21, 22 из рис.6.2).
Procedure TfmHt.BitBtCleareClick(Sender: TObject);
Begin
163
PDF created with pdfFactory Pro trial version www.pdffactory.com
ImageGraf.Canvas.Brush.Color:=clWhite;
ImageGraf.Canvas.FillRect(ClientRect);
Scale;
Ngr:=0
End;
Создаём процедуру изменения масштаба по оси времени (реализация блока 20 из рис.6.2).
Procedure TfmHt.ScrollBar1Change(Sender: TObject);
Begin tmax:=ScrollBar1.Position; CnSc:=Trunc(540/tmax); BitBtCleareClick(BitBtCleare); Scale;
End;
Создаём процедуру задания цвета графика.
Procedure TfmHt.ColorBitBtClick(Sender: TObject);
Begin
With ColorDialog1 Do
If Execute Then PenCol:=Color
End;
Инаконец, приступаем к написанию процедуры построения графика. Аргументом
ввыражении (6.1) является время. При рисовании кривой на экране аргументом будет смещение по горизонтальной оси. Расчётную кривую разбиваем на отдельные участки. Чем больше будет участков, тем плавнее кривая. Выбираем ширину объекта ImageGraf равной 600 пикселей, отступаем справа на 30 пикселей. Получаем длину графика 570 пикселей. Принимаем шаг приращения по оси времени равным трём пикселям и получаем 190 расчётных точек.
Procedure TfmHt.GrafBitBtClick(Sender: TObject); Var J :Byte;
Begin tpEd.Text:=FloatToStrF(tp,ffGeneral,5,3); foEd.Text:=FloatToStrF(fo,ffGeneral,5,3); WoEd.Text:=FloatToStrF(Wo,ffGeneral,5,3); ToEd.Text:=FloatToStrF(T0,ffGeneral,5,3); KciEd.Text:=FloatToStrF(Kci,ffGeneral,5,3); Ngr:=Ngr+1;
164
PDF created with pdfFactory Pro trial version www.pdffactory.com
ImageGraf.Canvas.MoveTo(30,275);
ImageGraf.Canvas.Pen.Color:=PenCol;
ImageGraf.Canvas.Pen.Width:=3;
For J:=1 To 190 Do
ImageGraf.Canvas.LineTo(3*J+30,Round(275-(1-Sin (Wo*3*J/CnSc+fi)*Exp(a*3*J/CnSc)/Kci1)*125)); ImageGraf.Canvas.Font.Color:=PenCol; ImageGraf.Canvas.TextOut(45*Ngr, 10,FloatToStrF (Kci,ffGeneral,2,1)+'-'+FloatToStrF(T0,ffGeneral,2,1))
End;
Текст программы на языке С++
Последовательность написания текста выбираем так, чтобы работу каждого оператора можно было проверить сразу после написания каждого оператора.
Объявляем переменные, обозначив их такими же именами, как и в программе на языке
Delphi.
public: // User declarations
__fastcall TfmHt(TComponent* Owner); double a,fi,Kci,Kci1,Wo,fo,T0,tp; unsigned tmax,CnSc,Ngr;
TColor PenCol;
Задаём начальные значения параметров в функции, реализующей блок 2 из схемы, показанной на рис.6.2:
void __fastcall TfmHt::FormCreate(TObject *Sender) {T0=0.2; Kci=0.1; Wo=4.9749; fi=1.471;
tmax=5; CnSc=108; fo=0.79179; tp=1.263; Kci1=sqrt(1-Kci*Kci);
a=-Kci/T0; // Scale();
Application->HintHidePause = -1;
}
Вызов функции рисования координат Scale; пока закомментирован, после создания этой функции комментарии нужно убрать. Функцию преобразования строки в число заимствуем из работы № 3 (распечатка 3.6).
165
PDF created with pdfFactory Pro trial version www.pdffactory.com
Создаём функцию ввода параметров, т.е. реализуем блоки с 7-го по 14-й из схемы, показанной на рис.6.2. Во всех функциях, кроме функции ввода коэффициента затухания, должно проверяться наличие фокуса.
void __fastcall TfmHt::KciEdChange(TObject *Sender) {Kci=Vvod(KciEd->Text);
if (Kci>0.91) Kci=0.91; if (Kci<0.01) Kci=0.01; a = -Kci/T0; Kci1=sqrt(1-Kci*Kci); fi=atan(Kci1/Kci); Wo=Kci1/T0;
WoEd->Text=FloatToStrF(Wo,ffGeneral,5,3); fo=Wo/2/M_PI; foEd->Text=FloatToStrF(fo,ffGeneral,5,3); tp=1/fo; tpEd->Text=FloatToStrF(tp,ffGeneral,5,3);
}
void __fastcall TfmHt::ToEdChange(TObject *Sender) {if (ToEd->Focused())
{T0=Vvod(ToEd->Text); if (T0>100) T0=100;
if (T0<0.001) T0=0.001;
a = -Kci/T0; Wo=Kci1/T0; WoEd->Text=FloatToStrF(Wo,ffGeneral,5,3); fo=Wo/2/M_PI; foEd->Text=FloatToStrF(fo,ffGeneral,5,3); tp=1/fo; tpEd->Text=FloatToStrF(tp,ffGeneral,5,3); ToEd->Text=FloatToStrF(T0,ffGeneral,5,3);
}
}
void __fastcall TfmHt::WoEdChange(TObject *Sender) {if (WoEd->Focused())
{Wo=Vvod(WoEd->Text); if (Wo>1000) Wo=1000;
166
PDF created with pdfFactory Pro trial version www.pdffactory.com
if (Wo<0.01) Wo=0.01; T0=Kci1/Wo;
ToEd->Text=FloatToStrF(T0,ffGeneral,5,3); fo=Wo/2/M_PI; foEd->Text=FloatToStrF(fo,ffGeneral,5,3); tp=1/fo; tpEd->Text=FloatToStrF(tp,ffGeneral,5,3);
}
}
void __fastcall TfmHt::foEdChange(TObject *Sender) {if (foEd->Focused())
{fo=Vvod(foEd->Text); if (fo>1000) fo=1000; if (fo<0.01) fo=0.01; Wo=fo*2*M_PI; T0=Kci1/Wo; tp=1/fo;
ToEd->Text=FloatToStrF(T0,ffGeneral,5,3); WoEd->Text=FloatToStrF(Wo,ffGeneral,5,3); tpEd->Text=FloatToStrF(tp,ffGeneral,5,3);
}
}
void __fastcall TfmHt::tpEdChange(TObject *Sender)
{
if (tpEd->Focused())
{
tp=Vvod(tpEd->Text); if (tp>100) tp=100;
if (tp<0.001) tp=0.001; fo=1/tp;
foEd->Text=FloatToStrF(fo,ffGeneral,5,3); Wo=fo*2*M_PI; WoEd->Text=FloatToStrF(Wo,ffGeneral,5,3); T0=Kci1/Wo; ToEd->Text=FloatToStrF(T0,ffGeneral,5,3);
}
167
PDF created with pdfFactory Pro trial version www.pdffactory.com
}
Реализуем блок 22 из рис.6.2 созданием функции рисования координат с учётом заданного значения максимального времени.
void __fastcall TfmHt::Scale()
{
ImageGraf->Canvas->Font->Color=clBlack;
ImageGraf->Canvas->Pen->Color=clBlack; ImageGraf->Canvas->Pen->Width=1; ImageGraf->Canvas->MoveTo(3,275); ImageGraf->Canvas->LineTo(590,275); ImageGraf->Canvas->MoveTo(30,280); ImageGraf->Canvas->LineTo(30,10); ImageGraf->Canvas->TextOut(27, 280,'0'); ImageGraf->Canvas->MoveTo(25,150); ImageGraf->Canvas->LineTo(590,150); ImageGraf->Canvas->TextOut(10, 145,'1'); ImageGraf->Canvas->TextOut(580, 258,'t'); ImageGraf->Canvas->TextOut(15, 10,'h'); ImageGraf->Canvas->MoveTo(30,10); ImageGraf->Canvas->LineTo(33,20); ImageGraf->Canvas->MoveTo(30,10); ImageGraf->Canvas->LineTo(27,20); ImageGraf->Canvas->MoveTo(590,275); ImageGraf->Canvas->LineTo(580,272); ImageGraf->Canvas->MoveTo(590,275); ImageGraf->Canvas->LineTo(580,278); for ( Word i=1; i<=tmax; i++ )
{
ImageGraf->Canvas->MoveTo(30+CnSc*i,280);
ImageGraf->Canvas->LineTo(30+CnSc*i,15); ImageGraf->Canvas->TextOut
(28+CnSc*i, 285,IntToStr(i));
}
}
168
PDF created with pdfFactory Pro trial version www.pdffactory.com
Создаём функцию удаления графиков и восстановления осей координат, реализующую блок 19 из рис.6.2.
void __fastcall TfmHt::BitBtCleareClick (TObject *Sender)
{
ImageGraf->Canvas->Brush->Color = clWhite; ImageGraf->Canvas->FillRect(ClientRect); Scale();
Ngr = 0;
}
Создаём функцию изменения масштаба по оси времени. void __fastcall TfmHt::ScrollBar1Change
(TObject *Sender)
{
tmax = ScrollBar1->Position; CnSc = ceil(540/tmax); BitBtCleareClick(BitBtCleare); Scale();
}
Помещаем на форму объект типа TColorDialog и создаём функцию задания цвета графика. void __fastcall TfmHt::ColorBitBtClick(TObject *Sender)
{
if (ColorDialog1->Execute()) PenCol = ColorDialog1->Color;
}
Пишем функцию построения графика. Принимаем шаг приращения по оси времени 3 пикселя и получаем 190 расчётных точек.
void __fastcall TfmHt::GrafBitBtClick (TObject *Sender) {tpEd->Text=FloatToStrF(tp,ffGeneral,5,3); foEd->Text=FloatToStrF(fo,ffGeneral,5,3); WoEd->Text=FloatToStrF(Wo,ffGeneral,5,3); ToEd->Text=FloatToStrF(T0,ffGeneral,5,3); KciEd->Text=FloatToStrF(Kci,ffGeneral,5,3); unsigned x,y;
169
PDF created with pdfFactory Pro trial version www.pdffactory.com
Ngr = Ngr+1; ImageGraf->Canvas->MoveTo(30,275); ImageGraf->Canvas->Pen->Color=PenCol; ImageGraf->Canvas->Pen->Width=3;
for ( x = 0; x < 570; x = x+3 ) {y = 275-floor((1-
sin(Wo*x/CnSc+fi)*exp(a*x/CnSc)/Kci1)*125); ImageGraf->Canvas->LineTo(x+30,y);
}
ImageGraf->Canvas->Font->Color = PenCol; ImageGraf->Canvas->TextOut
(45*Ngr, 10,FloatToStrF(Kci,ffGeneral,2,1)+ '-'+FloatToStrF(T0,ffGeneral,2,1));
}
Контрольные вопросы
1.Как происходит отсчёт координат на рисунках?
2.Когда происходит событие OnCreate?
3.Какими способами можно создавать рисунки на экране?
4.Как проверить наличие файла при его открытии?
5.В чём состоит разница между рисованием и отображением?
6.Как отсчитываются координаты точки по вертикали?
7.Что называется диалоговым окном? Для чего используются диалоговые окна?
8.На что влияет свойство Stretch объекта типа TImage? Какие значения может принимать свойство Stretch объекта типа TImage?
9.Расскажите о методах удаления изображения.
170
PDF created with pdfFactory Pro trial version www.pdffactory.com