Построение графика функции в Lasarus
Создание: 15.03.2013
Этот материал посвящен построению графика функции в «Lasarus». Он показывает принцип перевода декартовых координат в экранные, а также способ построения приложения, программирования в визуальной среде.

Программирование выполнено в визуальной среде программирования «Lazarus».
В качестве примера взята кубическая функция вида y = a·x3 + b·x2 + c·x + d


окно программы, строящей график кубической функции

Работа над проектом

Работа над проектом включает следующие шаги:

  1. создание и настройка визуальных компонентов
  2. создание процедуры для рисования координатной плоскости
  3. создание процедуры для рисования точек на плоскости
  4. добавление возможности изменять параметры и масштабировать график

Для построения изображения использовались следующие компоненты:

  1. TImage (на нем строится график)
  2. текстовые поля TEdit для ввода параметров кубической функции и масштаба координатной плосткости
  3. надписи на форме Label
  4. визуальный компонент для масштабирования графика TrackBar
  5. визуальные компоненты для изменения параметров текстовых полей UpDown

Построение координатных осей

Так как построение осей происходит в программе многократно, например при изменении параметров функции или при масштабировании, то имеет смысл вынести это действие в отдельную процедуру.

 procedure decart;
begin
  //задаем цвет карандаша: черный
  Form1.image1.Canvas.pen.color:= clBlack; 
  // определяем ширину и высоту поля изображения
  w := Form1.image1.Width;
  h := Form1.image1.Height;
  // Находим координату нулевой точки
  x0 := w div 2; 
  y0 := h div 2;
  // извлекаем из текстового поля m его значение, 
  // это масштаб - длина единичного отрезка на плоскости (в px)
  dd:= StrToInt(Form1.m.Text);
  // так как дальнейшие операции совершаются со свойством Canvas объекта Image1, 
  // эта команда упрощает обращение к свойству
  with Form1.image1.Canvas do 
    begin
    Clear;
     pen.width:= 1;
     // строим координатную плоскость
     moveto(x0, 10);
     lineto(x0, h - 10);
     moveto(10, y0);
     lineto(w - 10, y0);
     n := x0 div dd;
     // строим деления плоскости
     for i := 0 to n do
       begin
       moveto(x0 + i * dd, y0 - 3);
       lineto(x0 + i * dd, y0 + 3);
       moveto(x0 - i * dd, y0 - 3);
       lineto(x0 - i * dd, y0 + 3);

       moveto(x0 - 3, y0 + i * dd);
       lineto(x0 + 3, y0 + i * dd);
       moveto(x0 - 3, y0 - i * dd);
       lineto(x0 + 3, y0 - i * dd);
       end;
   end;
end; 

Для построение точек на экране компьютера нам многократно нужно совершать перевод декартовых координат в экранные. Напомню, что на экране координатные оси располагаются иначе, ось y «смотрит» вниз, к тому же экранная координата, это всегда целое положительное число, а декартовая координата может быть произвольным числом.


Перевод декартовых координат в «экранные». Значение координат точки взяты произвольные.

Преобразование выполняется следующим образом:

xэ := x0 + round(xд*dd);
yэ := y0 - round(yд*dd);

x0, y0 - экранная координата нулевой точки
dd - количество точек на экране, которое соответствует единичному отрезку (длина единичного отрезка).

Процедура рисования точек на экране

procedure graph;
begin
   //задаем цвет карандаша: красный
   Form1.image1.Canvas.pen.color:= clRed; 
   // минимальное и максимальное значение x на экране в текущем масштабе
   x := -(x0/dd);
   x_max := x0/dd;
   // декартова координата начальной точки графика 
   y := a*x*x*x + b*x*x + c*x + d;
   // экранные координаты первой точки
   x1 := x0 + round(x*dd);
   y1 := y0 - round(y*dd);
   // параметры кубической функции
   a:= strtofloat(Form1.Edit1.Text);
   b:= strtofloat(Form1.Edit2.Text);
   c:= strtofloat(Form1.Edit3.Text);
   d:= strtofloat(Form1.Edit4.Text);
   // Построение точки от точки до точки непрерывного графика строится отрезок с помощью встроенной процедуры moveto()
   Form1.image1.Canvas.pen.width:= 2;
   Form1.image1.Canvas.moveto(x1, y1);
   while x

TrackBar

масштабирование графика

масштабирование графика функции сводится к изменению значения текстового поля m и перерисовки экрана. Для этого используется визуальный компонент TrackBar. Утановите компонент на форме, задайте его свойства min, max, position (минимальное, максимальное значение, которое может принять компонент, а также текущее значение масштаба). Создайте событийную процедуру, что должно происходить при изменении позиции ползунка:

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  // помещаем новое значение ползунка в текстовое поле
  m.Text:= IntToStr(TrackBar1.Position);
    // перерисовывем экран и график (вызываем соответствующие процедуры
  decart;
  graph;
end;   

Изменение параметров функции

Значения параметров a, b. c и d определяют вид графика функции. Для изменения текстовых полей, в которых хранятся значения используем визуальные компоненты UpDown их можно привязать к текстовому полю (свойство Associate). При этом само текстовое поле можно закрыть для редактирования (свойство ReadOnly - true).

 
Привязка компонента UpDown к текстовому полю

При нажатии на кнопки вверх-вниз значение текстового поля изменяется на единицу и срабатывает событийная процедура:

procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);
begin
  // перерисовка плоскости и графика
  decart;
  graph;
end;

Вот и все. Проект необходимо отладить, собрать (получить запускаемый файл). С файлами проекта и с компилированным файлом вы можете ознакомиться во вложении к этому материалу.

Скачать материалы:

Рабочий проект
формат: zip, 0.47 МБ