Рисование графиков функций
Рисование графиков может осуществляться:
• С использованием процедуры LineTo(x,y) рисования отрезков линий.
• С использованием рисования точек.
• С использованием компонента TChart.
При рисовании линиями порядок действий:
• Для точек графика в цикле по координате x вычисляются значения функции y(x).
• Процедурой MoveTo(x,y) указатель размещается в начальной точке.
• В цикле процедурами LineTo(x,y) рисуются отрезки линий, набор которых аппроксимирует график функции.
При рисовании точек порядок действий:
• Для точек графика в цикле по координате x вычисляются значения функции y(x).
• В цикле точки графика рисуются с использованием выражения Pixels[x,y]:=<цвет>.
В обоих случаях при необходимости выполняются сопутствующие операции:
• Анализируется диапазон изменения функции для автомасштабирования.
• Отображаются координатные оси, сетка и поясняющие надписи.
• Осуществляется перерисовка при изменении размеров окна формы.
При крупном шаге изменения аргумента рисование линиями обычно дает график более наглядный.
Рассмотрим проект приложения под Windows с именем graf_function_1_., обеспечивающий рисование точками и линиями графика функции синуса.
unit graf_function_1_;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
procedure TForm1.Button1Click(Sender: TObject);
var i,amp,x01,y01,x02,y02,imax,dt1,dt2,func:integer;
begin
imax:=100; // число точек в периоде
dt1=2; // цена деления X
dt2=2; // шаг во времени
amp:=70; // амплитуда
x01:=20; // начала координат
x02:=20;
y01:=20+amp;
y02:=y01+2*amp+40;
// Рисуем график с Pixels
Canvas.TextOut(0,0,’График функции с Pixels’);
Canvas.MoveTo(x01,y01); //Рисуем ось X
Canvas.LineTo(x01+imax*dt1,y01);
Canvas.MoveTo(x01,y01+amp); //Рисуем ось Y
Canvas.LineTo(x01,y01-amp);
for i:=0 to imax do //Рисуем график
begin
func:=-round(amp*sin(2*pi/imax*i*dt2));
Canvas.Pixels[x01+i*dt1,y01+func]:=clBlack;
end;
// Рисуем график с LineTo
Canvas.TextOut(0,y02-amp-20,’График функции с LineTo’);
Canvas.MoveTo(x02,y02); //Рисуем ось X
Canvas.LineTo(x02+imax*dt1,y02);
Canvas.MoveTo(x0,y0+amp); //Рисуем ось Y
Canvas.LineTo(x02,y02-amp);
for i:=0 to imax do //Рисуем график
begin
func:=-round(amp*sin(2*pi/imax*i*dt2));
Canvas.LineTo[x02+i*dt1,y02+func]:=clBlack;
end;
end;
initialization
{$I graf_function_1.lrs}
end.
Графики зависят от цены деления по оси X dt1 и шага во времени dt2.
При большом шаге в первом графике просматривается точечная структура графика. При большом шаге лучше использовать рисование графика функции линиями.