Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ООП / 1 / 1 / Unit1

.pas
Скачиваний:
24
Добавлен:
01.06.2015
Размер:
5.81 Кб
Скачать
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls;

type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
UpDown1: TUpDown;
UpDown2: TUpDown;
UpDown3: TUpDown;
UpDown4: TUpDown;
UpDown5: TUpDown;
UpDown6: TUpDown;
GroupBox3: TGroupBox;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Edit11: TEdit;
Edit12: TEdit;
UpDown8: TUpDown;
UpDown9: TUpDown;
UpDown10: TUpDown;
UpDown11: TUpDown;
UpDown12: TUpDown;
Label1: TLabel;
GroupBox2: TGroupBox;
Label8: TLabel;
Edit7: TEdit;
UpDown7: TUpDown;
Button1: TButton;
PaintBox1: TPaintBox;
procedure EditClick(Sender: TObject);
procedure PaintBoxPaint(Sender: TObject);
procedure ButtonClick(Sender: TObject);



private
{ Private declarations }
public
{ Public declarations }
end;

Var
Form1: Tform1;
// параметры гармоник
M: array[0..5] of real; // амплидуда
Q: array[1..5] of real; // фаза
f1: real; // частота первой гармоники

implementation

{$R *.DFM}
// сумма гармоник
function SumHarm(t: real): real;
var
k: integer;
y: real;
begin y:=M[0]/2;
for k:=1 to 5 do
y:=y+M[k]*cos(2*pi*k*f1*t+Q[k]);
SumHarm:=y;
end;

// гармонический синтез
procedure HarmSynt;
const
tmax=1; // верхняя граница времени
dt=0.001; // приращение

var
l,b: integer; // координаты левого нижнего угла области вывода
w,h: integer; // ширина и высота области вывода
t: real; // время
Harm1,Harm2: array[0..5] of real; // значения гармоник
SumHarm1,SumHarm2: real; // значения суммы гармоник
Mmax: array[0..5] of integer; // верхние значения амплитуд гармоник
SumMmax: integer; // и суммы гармоник
cx0,cy0: integer; // координаты начала координат графиков
chy0: array[0..5] of integer; // гармоник и суммы гармоник
cy: integer; // текущая Y-координата
mt,mv: real; // масштабы
k: integer; // вспомогательная переменная

begin
// область вывода графиков
with Form1.PaintBox1 do
begin
Canvas.Pen.Color:=clBlack;
Canvas.Brush.Color:=clWhite;
Canvas.Rectangle(0,0,Width,Height);
l:=50; // X-координата левого верхнего угла
b:=Height-20; // Y-координата левого верхнего угла
h:=Height-40; // высота
w:=Width-70; // ширина
end;

Mmax[0]:=Form1.UpDown1.Max;
Mmax[1]:=Form1.UpDown2.Max;
Mmax[2]:=Form1.UpDown3.Max;
Mmax[3]:=Form1.UpDown4.Max;
Mmax[4]:=Form1.UpDown5.Max;
Mmax[5]:=Form1.UpDown6.Max;
SumMmax:=0;
for k:=1 to 5 do
SumMmax:=SumMmax+Mmax[k];
// масштабы
mv:=(h-50)/(Mmax[0]+Mmax[0]/2+4*SumMmax); // переменных по Y-координате
mt:=(w-20)/tmax; // времени по X-координате

with Form1.PaintBox1.Canvas do
begin
// разметка осей для графиков гармоник
cx0:=l;
TextOut(cx0+w div 4,3,'Гармоники');
cy:=b-h;
for k:=0 to 5 do
begin
MoveTo(cx0-3,cy); LineTo(cx0+3,cy);
chy0[k]:=cy+Round(Mmax[k]*mv);
TextOut(cx0-35,chy0[k]-7,'Y'+IntToStr(k)+'(t)');
MoveTo(cx0,chy0[k]); LineTo(cx0+w,chy0[k]);
MoveTo(cx0+Round(tmax*mt),chy0[k]-3);
LineTo(cx0+Round(tmax*mt),chy0[k]+3);
TextOut(w+50,chy0[k]+2,'t');
cy:=chy0[k]+Round(Mmax[k]*mv);
end;
MoveTo(cx0-3,cy); LineTo(cx0+3,cy);
MoveTo(cx0,b-h); LineTo(cx0,cy);

// разметка осей для графика суммы гармоник
TextOut(cx0+w div 4,cy+3,'Сумма гармоник');
cy:=cy+20;
MoveTo(cx0,cy); LineTo(cx0,b-5);
MoveTo(cx0-3,cy); LineTo(cx0+3,cy);
cy0:=cy+Round((Mmax[0]/2+SumMmax)*mv);
TextOut(cx0-35,cy0-7,'Y(t)');
MoveTo(cx0,cy0); LineTo(cx0+w,cy0);
MoveTo(cx0+Round(tmax*mt),cy0-3);
LineTo(cx0+Round(tmax*mt),cy0+3);
TextOut(w+50,cy0+2,'t');
cy:=cy0+Round((Mmax[0]/2+SumMmax)*mv);
MoveTo(cx0-3,cy+3); LineTo(cx0+3,cy+3);
TextOut(cx0+w div 8,b,'Интервал 1 секунда');

// графики гармоник и суммы гармоник
Pen.Color:=clRed;
Harm2[0]:=M[0]/2;
MoveTo(cx0,chy0[0]-Round(Harm2[0]*mv));
LineTo(cx0+Round(tmax*mt),chy0[0]-Round(Harm2[0]*mv));
t:=0;
repeat
for k:=1 to 5 do
begin
Harm2[k]:=M[k]*cos(2*pi*k*f1*t+Q[k]);
if t=0 then MoveTo(cx0,chy0[k]-Round(Harm2[k]*mv)) else
MoveTo(cx0+Round((t-dt)*mt),chy0[k]-Round(Harm1[k]*mv));
LineTo(cx0+Round(t*mt),chy0[k]-Round(Harm2[k]*mv));
Harm1[k]:=Harm2[k];
end;
SumHarm2:=SumHarm(t);
if t=0 then MoveTo(cx0,cy0-Round(SumHarm2*mv)) else
MoveTo(cx0+Round((t-dt)*mt),cy0-Round(SumHarm1*mv));
LineTo(cx0+Round(t*mt),cy0-Round(SumHarm2*mv));
SumHarm1:=SumHarm2;
t:=t+dt;
until (t>=tmax);
end;
end;


procedure Tform1.EditClick(Sender: Tobject);
var
k: integer;
s: real;
begin
k:=(Sender as Tedit).Tag;
s:=StrToFloat((Sender as Tedit).Text);
// обновление параметров гармоники
if k<=5 then M[k]:=s;
if k=6 then f1:=s;
if k>=7 then Q[k-6]:=s*Pi/180; // фаза в радианах
HarmSynt;
end;

procedure Tform1.PaintBoxPaint(Sender: Tobject);
begin
HarmSynt;
end;

procedure Tform1.ButtonClick(Sender: Tobject);
begin
Application.Terminate;
end;

end.











Соседние файлы в папке 1
  • #
    01.06.2015876 б24Project1.res
  • #
    01.06.2015201 б24Project1.~dpr
  • #
    01.06.20159.48 Кб24Unit1.dcu
  • #
    01.06.201551 б24Unit1.ddp
  • #
    01.06.20156.99 Кб24Unit1.dfm
  • #
    01.06.20155.81 Кб24Unit1.pas
  • #
    01.06.201551 б25Unit1.~ddp
  • #
    01.06.20156.99 Кб24Unit1.~dfm
  • #
    01.06.20155.81 Кб25Unit1.~pas