|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Построить график функции с помощью TCanvas
Помогите разобраться с некоторыми моментами в коде
Код:
unit graph_unit; interface uses SysUtils, Graphics, Forms, Classes, Controls, StdCtrls, Buttons, ExtCtrls, Windows; type TForm1 = class(TForm) Panel1: TPanel; Image1: TImage; Edit1: TEdit; Edit2: TEdit; BitBtn1: TBitBtn; Label1: TLabel; Label2: TLabel; Label3: TLabel; BitBtn2: TBitBtn; procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} const k = 100; XN = 60; YN = 20; NX = 10; NY = 10; var a,b,dx,dy,ymax,ymin : Real; x,y : Array[1..K] of Real; xe,ye : Array[1..K] of Integer; lx,ly,xk,yk : Integer; st : String; procedure Line(x1,y1,x2,y2:Integer); Begin with Form1.Image1.Canvas do begin MoveTo(x1,y1); LineTo(x2,y2); end; End; function getY(x:real):real; begin result:=sin(x)*sin(x)-cos(x)*cos(x); end; procedure TForm1.BitBtn1Click(Sender: TObject); var i:Integer; begin with Form1.Image1.Canvas do begin Pen.Color:=clWhite; Rectangle(0,0,Image1.ClientWidth,Image1.ClientHeight); Pen.Color:=clBlack; Font.Color:=clBlack; end; xk:=Image1.ClientWidth-25; yk:=Image1.ClientHeight-50; try a:=StrToFloat(edit1.Text); b:=StrToFloat(edit2.Text); except MessageBox(0,'Неверный ввод!','Ошибка!',MB_ICONSTOP); exit; end; dx:=(b-a)/(K-1); ymax:=getY(a); ymin:=ymax; for i := 1 to K do Begin x[i]:=a+dx*(i-1); y[i]:=getY(x[i]); if ymax<y[i] then ymax:=y[i]; if ymin>y[i] then ymin:=y[i]; End; if abs(ymax-ymin)<1E-3 then begin ymax:=ymax+1; ymin:=ymin-1; end; for i:=1 to K do begin xe[i]:=XN+round((x[i]-a)*(XK-XN)/(b-a)); ye[i]:=YN+round((ymax-y[i])*(YK-YN)/(ymax-ymin)) end; lx:=(XK-XN) div NX; dx:=(b-a)/NX; for i:=1 to (NX+1) do begin line(XN+lx*(i-1),YN,XN+lx*(i-1),YK); str((a+dx*(i-1)):5:2,st); form1.Image1.Canvas.TextOut(XN-20+lx*(i-1),YK+10,st); end; ly:=(YK-YN) div NY; dy:=(ymax-ymin)/NY; for i:=1 to NY+1 do begin line(XN,YN+ly*(i-1),XK,YN+ly*(i-1)); str((ymax-DY*(i-1)):5:2,st); form1.Image1.Canvas.TextOut(XN-50,YN-4+ly*(i-1),st); end; with Form1.Image1.Canvas do begin Pen.Color:=clBlue; Pen.Width:=2; for i:=1 to K-1 do line(xe[i],ye[i],xe[i+1],ye[i+1]); Pen.Color:=clWhite; Pen.Width:=100; end; end; procedure TForm1.BitBtn2Click(Sender: TObject); begin Form1.Close; end; А именно этот момент xe[i]:=XN+round((x[i]-a)*(XK-XN)/(b-a)); ye[i]:=YN+round((ymax-y[i])*(YK-YN)/(ymax-ymin)) почему именно так и для чего это нужно в дальнейшем?? Последний раз редактировалось Admin, 23.01.2012 в 09:58. |
#2
|
|||
|
|||
Cудя по всему тут высчитывается отклонение от предыдущей точки и округляется
|