DC
Dinaria Cozma

Delphi построение граффика функции

Помогите, почему программа не правильно строит граффик? Где в тексте нужно описать точку разрыва

procedure TForm1.Button1Click(Sender: TObject);
const
n=5000;
var
u,v,x0,y0,x1,x2,y1,y2, k2, k1, k01, k02:integer;
max1,max2,kx,ky,x,h,a,b:extended;
i,j,xs,ys1,ys2,ys,xs1,xs2:integer; str_1:string;

function f(x:extended):extended;
begin
f:=1/x;
end;

begin
a:=strtofloat(edit1.text);
b:=strtofloat(edit2.text);
k1:=strtoint(labelededit1.text);
k2:=strtoint(labelededit2.text);
x1:=30; x2:=Image1.width-30; y1:=30; y2:=Image1.height-30;

h:=(b-a)/n;
if abs(a)>=abs(b) then max1:=abs(a);
if abs(b)>=abs(a) then max1:=abs(b);
x:=a; max2:=abs(f(x));
repeat
x:=x+h;
if abs(f(x))>max2 then max2:=abs(f(x));
until x>=b;

kx:=abs((x2-x1)*2*k1)/((2*k1+2)*2*max1); {ось ох рисует график по мах+ отрезок для красоты}
ky:=abs((y2-y1)*2*k2)/((2*k2+2)*2*max2);

Image1.Canvas.pen.Color:=clblack;
Image1.Canvas.pen.width:=1;

x0:=round((x1+x2)/2); y0:=round((y1+y2)/2);

Image1.Canvas.moveto(x1,y0); Image1.Canvas.lineto(x2,y0);
Image1.Canvas.textout(x2-5,y0-15,'X');
Image1.Canvas.moveto(x0,y1); Image1.Canvas.lineto(x0,y2);
Image1.Canvas.textout(x0+10,y1,'Y');
Image1.Canvas.textout(x0+5,y0+5,'O');

Image1.Canvas.moveto(x2-10,y0-5); Image1.Canvas.lineto(x2,y0);
Image1.Canvas.moveto(x2-10,y0+5); Image1.Canvas.lineto(x2,y0);

Image1.Canvas.moveto(x0-5,y1+10); Image1.Canvas.lineto(x0,y1);
Image1.Canvas.moveto(x0+5,y1+10); Image1.Canvas.lineto(x0,y1);

for i:=1 to (2*k1+1) do
begin
xs:=round(x1+(i*(x2-x1))/(2*k1+2));
ys1:=y0-5; ys2:=y0+5;
Image1.Canvas.moveto(xs,ys1);
Image1.Canvas.lineto(xs,ys2);
str( (-max1+(i*max1/(k1+1)) ):4:2,str_1);

if abs(-max1+(i*max1/(k1+1)) )>(max1/12) then
Image1.Canvas.textout(xs-14,y0+10,str_1);

{ if round(-max1+(i*max1/6) )<>0 then
Image1.Canvas.textout(xs-14,y0+15,str_1); }
end;

for i:=1 to (2*k2+1) do
begin
ys:=round(y2+(i*(y1-y2))/(2*k2+2));
xs1:=x0-5; xs2:=x0+5;
Image1.Canvas.moveto(xs1,ys);
Image1.Canvas.lineto(xs2,ys);
str( (-max2+(i*max2/(k2+1)) ):4:2,str_1);

if abs(-max2+(i*max2/(k2+1)) )>(max2/12) then
Image1.Canvas.textout(x0-35,ys-5,str_1);

{ if round(-max2+(i*max2/6) )<>0 then
Image1.Canvas.textout(x0-35,ys-5,str_1); }
end;

k01:=4; k02:=4; {точки на графике}
for i:= 1*k01 to (2*k1+1)*k01 do
begin
xs:=round(x1+(i*(x2-x1))/((2*k1+2)*k01));
for j:= 1*k02 to (2*k2+1)*k02 do
begin
ys:=round(y2+(j*(y1-y2))/((2*k2+2)*k02));
image1.Canvas.Pixels[xs,ys]:=0;
end;
end;

Image1.Canvas.pen.Color:=clblue;
Image1.Canvas.pen.width:=2;

x:=a;
u:=round(x0+kx*x);
v:=round(y0-ky*f(x));
Image1.Canvas.moveto(u,v);
repeat
x:=x+h;
u:=round(x0+kx*x);
v:=round(y0-ky*f(x));
Image1.Canvas.lineto(u,v);
until x>=b;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
edit1.Text:=' ';
edit2.Text:=' ';
Image1.Canvas.CopyMode:=cmWhiteness;
Image1.Canvas.CopyRect(Rect(0,0,Image1.width,Image1.height),
Image1.Canvas,rect(0,0,Image1.width,Image1.height));

{ Image1.Canvas.Brush.color:=clmoneygreen;
Image1.Canvas.fillrect(rect(0,0,Image1.width,Image1.height)); }
end;

ЮМ
Юрий М

не забывайте, и учитесь искать, частный случай это и есть точка разрыва

Похожие вопросы
Delphi. Как сделать чтобы при нажатии мыши вылазил график функции?
Delphi. Как ограничить fps в функции формы Idle до константы?
построение графика функции
Знатоки Delphi, помогите пожалуйста расписать код этой функции (она маленькая)
Построение графиков функций
помогите пожалуйста с заданием по excel, построение графика функции
Delphi Какие функции есть в delphi для чтения дорожек/секторов?
[Delphi] Помощь по функции TaskKill (Завершения процесса)
помогите составить программу вычисления функции в Delphi
Delphi функция проверки вводимого EMail доделать (+)