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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2012, 23:04   #1
ScareCroW12
 
Регистрация: 01.05.2011
Сообщений: 8
Восклицание Построить график произвольной таблично-заданной функции

Нужно построить график таблично-заданной функции без использования компонента TChart! Также в программе должны быть использованы следующие возможности:
1) Произвольный интервал исследования (числовым или графическим способом);
2) Изменение размеров окна вывода графика функции;
3) Задание шага изменения аргумента

Есть некоторые задумки..вот код:

Код:
procedure TForm1.FormPaint(Sender: TObject);
begin
StringGrid1.Cells[0,0]:='x';
StringGrid1.Cells[0,1]:='y';
end;


// Описали функцию
Function f(x: real): real;

begin
  Result := x*(sin(x)/cos(x))-1/3;
end;
procedure TForm1.FormResize(Sender: TObject);
var from,togo:real;
begin
  if StringGrid1.Cells[1,0] = '' then
    begin
  if Edit1.Text='' then from:=-1
    else from := StrToFloat(Edit1.Text);
  if Edit2.Text='' then togo:=1
    else togo := StrToFloat(Edit2.Text);
DrawGraph (f, from, togo, Form1.Canvas);
end
  else
   DrawGraph2 (f, StrToFloat(StringGrid1.Cells[1,0]), StrToFloat(StringGrid1.Cells[3,0]), Form1.Canvas);
end;

// Производим ввод и расчет координат
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
  const Value: string);
  var x:real;
begin
     if Value <> '' then
      begin
       x:=f(StrToFloat(Value));
         StringGrid1.Cells[ACol, ARow+1]:=FloatToStr(x);
      end
      else
         StringGrid1.Cells[ACol, ARow+1]:='';
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
    DrawGraph (f, StrToFloat(Edit1.Text), StrToFloat(Edit2.Text), Form1.Canvas);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   DrawGraph2 (f, StrToFloat(StringGrid1.Cells[1,0]), StrToFloat(StringGrid1.Cells[3,0]), Form1.Canvas);
end;

procedure TForm1.DrawGraph (f: TFunc; a: real; b: real; C: TCanvas);
var x, y, h: real;
    max, min: real;
    sx, sy: real;
    xmid, ymid: integer;

begin
  sx := (c.ClipRect.Right)/(b-a);
    h := 1/sx;
      xmid := c.ClipRect.Right div 2;
        ymid := c.ClipRect.Bottom div 2;
  x := a;
    max := f( x);
      min := max;
  while x<=b do
    begin
      y := f( x);
        if y<min then min := y;
          if y>max then max := y;
            x := x + h;

    end;
  sy := c.ClipRect.Bottom/ (max-min);
    c.Brush.Color := clWhite;
      c.FillRect(Rect(0, 0, c.ClipRect.Right, c.ClipRect.Bottom));
        c.Pen.Color := clBlack;
          c.MoveTo(0, ymid);
            c.LineTo(c.ClipRect.Right, ymid);
              c.MoveTo(xmid, 0);
                c.LineTo(xmid, c.ClipRect.Bottom);
  x := a;
    y := f(x);
      c.Pen.Color := clBlack;
        c.MoveTo(xmid+round(sx*x), ymid-round(sy*y));
  while x<=b do
    begin
      y := f(x);
        c.LineTo(xmid+round(sx*x), ymid-round(sy*y));
          x := x + h;
    end;

end;



procedure TForm1.DrawGraph2 (f: TFunc; a: real; b: real; C: TCanvas);
var x, y, h: real;
    max, min: real;
    sx, sy: real;
    xmid, ymid,i: integer;
begin
  sx := (c.ClipRect.Right)/(b-a);
    h := 1/sx;
      xmid := c.ClipRect.Right div 2;
        ymid := c.ClipRect.Bottom div 2;
  x := a;
    max := f( x);
      min := max;
  while x<=b do
    begin
      y := f( x);
        if y<min then min := y;
          if y>max then max := y;
            x := x + h;
    end;
  sy := c.ClipRect.Bottom/ (max-min);
    c.Brush.Color := clWhite;
      c.FillRect(Rect(0, 0, c.ClipRect.Right, c.ClipRect.Bottom));
        c.Pen.Color := clBlack;
          c.MoveTo(0, ymid);
            c.LineTo(c.ClipRect.Right, ymid);
              c.MoveTo(xmid, 0);
                c.LineTo(xmid, c.ClipRect.Bottom);
  x := a;
    y := f(x);
      c.Pen.Color := clBlack;
        c.MoveTo(xmid+round(sx*x), ymid-round(sy*y));
  for i := 1 to StringGrid1.ColCount - 1 do
    begin
      y := StrToFloat(StringGrid1.Cells[i,1]);
        x := StrToFloat(StringGrid1.Cells[i,0]);
          c.LineTo(xmid+round(sx*x), ymid-round(sy*y));
            x := x + h;
    end;

    end;

end.
ScareCroW12 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построить график в декартовой системе функции, заданной в полярной Zalmancheg Паскаль, Turbo Pascal, PascalABC.NET 1 09.12.2010 22:18
построить график функции Катюшка_92 Microsoft Office Excel 2 19.09.2010 10:17
Построить график произвольной функции HECTOR.A. Паскаль, Turbo Pascal, PascalABC.NET 3 05.06.2009 23:55
Построить график произвольной функции HECTOR.A. Помощь студентам 0 05.06.2009 22:27
Как нарисовать на Tchart график функции, заданной таблично(используя метод наименьших квадратов) Legion2008 Мультимедиа в Delphi 0 11.05.2009 16:00