Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2011, 00:04   #1
Vitalina69
Пользователь
 
Регистрация: 16.11.2010
Сообщений: 16
По умолчанию Построение графиков в Делфи (комппонент TImage).

Программа должна строить график решения дифференциального уравнения третьего порядка. График строится, но только на отрезке от -10 до 9. Затем выдает ошибку в процедуре построения графика Graph.
Вот фрагмент текста программы. Подскажите, пожалуйста, что можно сделать, чтобы график строился на любом отрезке, даже от -100 до 100.

Код:

Procedure Rechenie1;
var i: Integer;
begin
Shag;
  s[0,0]:=p;
  s[1,0]:=q;
  s[2,0]:=r;
  t[0,0]:=a;
  t[1,0]:=p;
  x:=a;
  For i:=0 to 99 do
    begin
 s[2,i+1]:=s[2,i]+m*(((exp(-3*x)*(13*x-7))-4*s[1,i])/n);
 s[1,i+1]:=s[1,i]+m*s[2,i];
 s[0,i+1]:=s[0,i]+m*s[1,i];
 x:=x+m;
 t[0,i+1]:=x;
 t[1,i+1]:=s[0,i+1];
 end;
end;

Procedure Rechenie2;
  var i: Integer;
begin
  Shag;
  s1[0,0]:=p;
  s1[1,0]:=q;
  s1[2,0]:=r;
  t1[0,0]:=a;
  t1[1,0]:=p;
  x:=a;
  For i:=0 to 9 do
begin
s1[2,i+1]:=s1[2,i]+k*(((13*x-7)*exp(-3*x)-4*s[1,i])/n);
s1[1,i+1]:=s1[1,i]+k*s1[2,i];
s1[0,i+1]:=s1[0,i]+k*s1[1,i];
x:=x+k;
t1[0,i+1]:=x;
 t1[1,i+1]:=s1[2,i+1];
end;
end;

Procedure RisOs;
  var  x,y,PX,PY: Real;
begin
  // Ïîäïèøåì îñè
  Form1.Image1.Canvas.TextOut(20, Form1.Image1.Height-20,FloatToStr(Round(a*100)/100));
  Form1.Image1.Canvas.TextOut(Form1.Image1.Width-20, Form1.Image1.Height-20,FloatToStr(Round(b*100)/100));
  Form1.Image1.Canvas.TextOut(10, Form1.Image1.Height-10,FloatToStr(Round(ymin*100)/100));
  Form1.Image1.Canvas.TextOut(20, 20,FloatToStr(Round(ymax*100)/100));
  //Íàðèñóåì îñè
  Form1.Image1.Canvas.Pen.Color:=clpurple;
  Form1.Image1.Canvas.Pen.Width:=2;
  Reset (g);
  While Not(Eof(g)) do
    begin
      Read (g,x);
      Read (g,y);
      PX:=(x-a)/(b-a)*(Form1.Image1.Width);
      PY:=trunc(Form1.Image1.Height-((y-ymin)/(ymax-ymin))*(Form1.Image1.Height));
      Form1.Image1.Canvas.MoveTo(Round(PX),(Form1.Image1.Height));
      If Round(x)=0 then
        begin
          Form1.Image1.Canvas.LineTo(Round(PX),0);
          Form1.Image1.Canvas.TextOut(Round(PX)-10,5,'Y');
          Form1.Image1.Canvas.TextOut(Round(PX)+25,5,FloatToStr(Round(ymax)));
          Form1.Image1.Canvas.TextOut(Round(PX)+25,Form1.Image1.Height-15,FloatToStr(Round(ymin)));
          Form1.Image1.Canvas.TextOut(Round(PX)+10,5,'Y');
          Form1.Image1.Canvas.TextOut(Round(PX)-45,5,FloatToStr(Round(ymax)));
          Form1.Image1.Canvas.TextOut(Round(PX)-45,Form1.Image1.Height-15,FloatToStr(Round(ymin)));
          break;
        end;
    end;
  Closefile(g);
  Reset (g);
  While Not(Eof(g)) do
    begin
      Read (g,x);
      Read (g,y);
      PX:=(x-a)/(b-a)*Form1.Image1.Width;
      PY:=trunc(Form1.Image1.Height-((y-ymin)/(ymax-ymin))*Form1.Image1.Height);
      Form1.Image1.Canvas.MoveTo(0,Round(PY));
      If Round(y)=0 then
        begin
          Form1.Image1.Canvas.LineTo(Form1.Image1.Width,Round(PY));
          Form1.Image1.Canvas.TextOut(Form1.Image1.Width-15,Round(PY)-15,'X');
          Form1.Image1.Canvas.TextOut(5,Round(PY)+15,FloatToStr(a));
          Form1.Image1.Canvas.TextOut(Form1.Image1.Width-35,Round(PY)-15,FloatToStr(b));
          Form1.Image1.Canvas.TextOut(Form1.Image1.Width-15,Round(PY)+15,'X');
          Form1.Image1.Canvas.TextOut(5,Round(PY)-15,FloatToStr(Round(a)));
          Form1.Image1.Canvas.TextOut(Form1.Image1.Width-35,Round(PY)+15,FloatToStr(b));
          break;
        end;
    end;
  Closefile (g);
  // Íàçâàíèå ãðàôèêà
  Form1.Image1.Canvas.TextOut(300,50,'ãðàôèê ðåøåíèÿ');
end;

Procedure Graph;
  var PX,PY: extended;
begin
  //Ïîñòðîåíèå ãðàôèêà
  Reset (g);
  Form1.Image1.Canvas.Pen.Color:=clblack;
  Form1.Image1.Canvas.MoveTo(0,Round(t[1,0]));
  While Not(Eof(g)) do
    begin
      Read (g,x);
      Read (g,y);
      PX:=(x-a)/(b-a)*(Form1.Image1.Width);
PY:=Form1.Image1.Height-((y-ymin)/(ymax-ymin))*(Form1.Image1.Height);
      Form1.Image1.Canvas.LineTo(Round(PX),Round (PY));
    end;
  Closefile (g);
end;

Procedure Tablica;
begin
  Shapka;
  SozdTablica;
end;

Procedure Grafic;
begin
  Shag;
  Maximin;
  RisKoord;
  RisOs;
  Graph;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  vvod;
  Proverka;
  If Proverka then
    begin
      Rechenie1; //Ðåàëèçàöèÿ àëãîðèòìà ðåøåíèÿ
      Tablica; //Âûâîä òàáëèöû çíà÷åíèé ôóíêöèè
      Sozdfaila; //Ñîçäàíèå ôàéëà
      Grafic; //Ïîñòðîåíèå ãðàôèêà
    end;
end;

end.
Vitalina69 вне форума Ответить с цитированием
Старый 28.11.2011, 05:47   #2
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

а вы уверены что в точке 10 функция вообще определена? (в код пока не вдавался)
Если это в самом деле так, то можно либо условную проверку перед отрисовкой поставить (if x<>10 then {рисовать}) либо оформить в try...except(finally)
благодарность - сюда (не забываем писать от кого)
Zer0 вне форума Ответить с цитированием
Старый 04.12.2011, 21:03   #3
Vitalina69
Пользователь
 
Регистрация: 16.11.2010
Сообщений: 16
По умолчанию

Я сделала, не вышло, все равно та же ошибка.
Vitalina69 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
построение графиков Алёна Microsoft Office Excel 9 27.02.2016 10:00
Построение графиков fen1ksss Общие вопросы C/C++ 0 12.11.2011 19:08
построение графиков в Делфи Kat. Помощь студентам 2 30.06.2011 14:48
построение графиков на ВБ Kracozebr Помощь студентам 1 17.07.2010 13:27
Построение графиков <3myworld Microsoft Office Excel 2 18.03.2010 07:48