Изначально оси находились слева и внизу Image.для моей программы они должны быть по центру.Сделано.но черточки идут криво(от старых центров) график чертится внизу тоже.как график привязать к новому центру координат?
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Label1: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure GetDataForArea;
procedure DrawArea;
procedure DrawOsX;
procedure DrawOsY;
procedure DrawFunc;
private
{ Private declarations }
public
{ Public declarations }
end;
type
os = record //запись оси
x0,y0,xk,yk:integer; //х,у нач и конеч
argMin,argMax:real;
kSh,dSh,hSh:integer; //кол штрихов,длина шагов, высота штрихов
raz:integer;
StL,Stxk,Styk:integer; Stalf:real;
end;
func = record //
gMASxy:array[0..100] of Tpoint; // массив точек
MASy,MASx:array[0..100] of real; // массивы значений для х и у
yMax,yMin,xMax,xMin:real; //
kt:real; //кол точек
ki:integer; //кол точек для цикла
Mx,My:real;
sh:real; //шаг
end;
oblast = record //область
x0,y0,xk,yk:integer;
otstup:integer;
end;
var
Form1: TForm1;
osX,osY:os;
F:func;
Area:oblast;
implementation
{$R *.dfm}
function ff(x:real):real; //график
begin
ff:=x*cos(x)+sin(x);
end;
procedure GetDataForOsX;
begin
OsX.x0:=Area.x0;
OsX.xk:=Area.xk; OsX.yk:=Area.yk div 2; OsX.y0:=Area.yk div 2;
OsX.raz:=OsX.xk-OsX.x0;
end;
procedure GetDataForOsY;
begin
OsY.x0:=Area.xk div 2;
OsY.xk:=Area.xk div 2; OsY.yk:=Area.y0; OsY.y0:=Area.yk;
OsY.raz:=OsY.y0-OsY.yk;
end;
procedure TForm1.GetDataForArea;
begin
with Area do begin
x0:=Area.otstup;
y0:=Area.otstup;
xk:=Image1.Width-otstup;
yk:=Image1.Height-otstup;
end;
end;
procedure TForm1.DrawArea;
begin
GetDataForArea;
Image1.Canvas.Pen.Color:=clYellow;
Image1.Canvas.Rectangle(area.x0,area.y0,area.xk,area.yk);
end;
procedure TForm1.DrawOsX;
Var i,x,dx:integer;
begin
GetDataForOsX;
Image1.Canvas.Pen.Color:=clBlack;
Image1.Canvas.MoveTo(OsX.x0,OsX.y0);
Image1.Canvas.LineTo(OsX.xk,OsX.yk);
x:=OsX.x0; dx:=(OsX.xk-OsX.x0)div OsX.kSh;
For i:=1 to OsX.ksh do begin
Image1.Canvas.MoveTo(x,OsX.y0+OsX.hSh div 2);
Image1.Canvas.LineTo(x,OsX.y0-OsX.hSh div 2);
x:=x+dx;
end;
end;
procedure TForm1.DrawOsY;
Var i,y,dy:integer;
begin
GetDataForOsY;
Image1.Canvas.Pen.Color:=clBlack;
Image1.Canvas.MoveTo(OsY.x0,OsY.y0);
Image1.Canvas.LineTo(OsY.xk,OsY.yk);
y:=OsY.y0; dy:=(OsY.yk-OsY.y0)div OsY.kSh;
For i:=1 to OsY.ksh do begin
Image1.Canvas.MoveTo(OsY.x0-OsY.hSh div 2,y);
Image1.Canvas.LineTo(OsY.x0+OsY.hSh div 2,y);
y:=y+dy;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i:integer; dx,x:real;
begin
F.sh:= strToint(Edit1.Text);
F.xMin:=StrToInt(Edit2.Text);
F.xMax:=StrToInt(Edit3.Text);
F.kt:=(F.xMax-F.xMin)*f.sh +1;
x:=F.xMin;dx:=(F.xMax-F.xMin)/(F.kt - 1);
F.yMin:=1e+38;
F.yMax:=-1e+38;
f.ki:=trunc(f.kt);
For i:=1 to F.ki do begin
F.MASy[i]:=ff(x); F.MASx[i]:=x;
if f.MasY[i]<f.yMin then F.yMin:=F.MasY[i];
if f.MasY[i]>f.yMax then F.yMax:=F.MasY[i];
x:=x+dx;
end;
end;
procedure GetMxMy;
begin
F.Mx:=(Osx.xk-Osx.x0)/(F.xMax-F.xMin);
F.My:=(Osy.y0-Osy.yk)/(F.yMax-F.yMin);
end;
procedure TForm1.DrawFunc;
var x,y,i:integer;
begin
x:=area.otstup+round(F.Mx*F.masx[1]);
y:=area.otstup+osY.raz-round(F.My*(F.masy[1]-f.yMin));
Image1.Canvas.MoveTo(x,y);
for i:=2 to f.ki do begin
x:=area.otstup+round(F.Mx*F.masx[i]);
y:=area.otstup+osY.raz-round(F.My*(F.masy[i]-f.yMin));
Image1.Canvas.lineTo(x,y);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DrawArea;
DrawOsX;
DrawOsY;
GetMxMy;
DrawFunc;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Area.otstup:=15;
osX.hSh:=9; osX.kSh:=9;
osY.hSh:=9; osY.kSh:=9;
end;
end.