Как сделать график в лазарусе
Перейти к содержимому

Как сделать график в лазарусе

  • автор:

Как сделать график в лазарусе

Название исследовательской работы: «Графики функций (лабораторный практикум)»
Место проведения: Мордовия, г. Ковылкино, ул. Есенина, д.10
Автор работы : Королёв Михаил , ученик 11 класса
Руководитель: Честнова Светлана Николаевна, учитель информатики
Скачать работу

Что такое Lazarus? Среда для объектно-ориентированного программирования на языке Free Pascal. Визуально очень напоминает Delphi, но в отличии от нее Lazarus – свободная программа, используя ее вы не нарушаете ни чьих прав. Существует версия для Windows-систем, а также версии для MacOS и Linux. Как у любого программного средства имеет свои недостатки, в частности достаточно большой размер получаемых файлов, нестабильная работа на некоторых системах. Но в целом, для изучения ООП Lazarus подходит замечательно. Изучение объектно-ориентированного программирования мы в информационном профиле проходим в третий четверти одиннадцатого класса. Изучая данную тему, меня заинтересовал вопрос: «что создать полезного, как для меня, так и для других?». Это и послужило выбором темы моего проекта.

  1. изучить теоретические сведения;
  2. описать этапы работы;
  3. разработать программу в визуальной среде программирования «Lazarus»;
  4. произвести отладку программы;
  5. сделать общий вывод о применении программы.

Актуальность работы состоит в том, что лабораторный практикум «Графики функций» можно применять в учебном процессе в средней школе. Он, безусловно, вызовет интерес учителей, будет способствовать закреплению умений и навыков учащихся, повысит познавательный интерес к изучению математики.
В работе использованы следующие методы:

  1. анализ научных статей и публикаций по изучаемой теме;
  2. разработка программы в визуальной среде программирования «Lazarus»;
  3. апробация полученных результатов.

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

Программирование – это научная дисциплина. Если бы процессы программирования разных задач не имели между собой ничего общего, то программирование, как таковое, не было бы научной дисциплиной. Но дело обстоит не так. Существуют общие методы, которые позволяют, постепенно расчленяя задачи на подзадачи, сводить их решение, в конечном счете, к некоторым элементарным, подобно тому, как разбирая совершенно непохожие сложные механизмы, мы обнаруживаем, что они состоят из одинаковых деталей и узлов, только по-разному соединенных. Из этого, конечно, не следует, что процесс программирования не содержит в себе элементов творчества. Составление программы, такой же творческий процесс, что и разработка сложного механизма из заданных наборов деталей.
Процесс решения задачи на компьютере состоит из ряда этапов, включающих как подготовку задачи к решению, так и собственно решение.
Эти этапы включают:
1. постановку задачи;
2. построение модели изучаемого процесса или явления;
3. выбор метода решения;
4. разработка алгоритма решения задачи;
5. составление программы (кодирование);
6. отладка и тестирование программы;
7. собственно вычисления;
8. анализ полученных результатов.
Если первые три этапа были описаны во введении работы, то остановимся на последующих. Под составлением программы подразумевается непосредственная запись полученных ранее алгоритмов на выбранном языке программирования. Современные системы программирования позволяют значительно облегчить этот процесс, хотя этот этап по-прежнему остается одним из самых трудоемких. Разумеется, этот этап предполагает хорошее знание того языка программирования, на котором ведутся работы.
Программирование данной работы выполнено в визуальной среде программирования «Lazarus».
В лабораторном практикуме построены шесть графиков функций.

В качестве примера рассмотрим алгоритм построения графика квадратичной функции

  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 + b*x + c;
// экранные координаты первой точки
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);
// Построение точки от точки до точки непрерывного графика строится отрезок с помощью встроенной процедуры moveto()
Form1.image1.Canvas.pen.width:= 2;
Form1.image1.Canvas.moveto(x1, y1);
while x begin
// получение очередной декартовой точки
y := a*x*x + b*x + c;
// переводим декартову в экранную координату
x1 := x0 + round(x*dd);
y1 := y0 — round(y*dd);
// строим отрезок до очередной экранной точки
Form1.image1.Canvas.lineto(x1, y1);
// шаг дакартовой точки с которым мы делаем построение графика
x := x+0.1;
end;
end;
TrackBar

Масштабирование графика
Масштабирование графика функции сводится к изменению значения текстового поля m и перерисовки экрана. Для этого используется визуальный компонент TrackBar. Утановите компонент на форме, задайте его свойства min, max, position (минимальное, максимальное значение, которое может принять компонент, а также текущее значение масштаба). Создайте событийную процедуру, что должно происходить при изменении позиции ползунка:
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
// помещаем новое значение ползунка в текстовое поле
m.Text:= IntToStr(TrackBar1.Position);
// перерисовывем экран и график (вызываем соответствующие процедуры
decart;
graph;
end;
Изменение параметров функции
Значения параметров a, b. c определяют вид графика функции. Для изменения текстовых полей, в которых хранятся значения используем визуальные компоненты UpDown их можно привязать к текстовому полю (свойство Associate). При этом само текстовое поле можно закрыть для редактирования (свойство ReadOnly — true).

При нажатии на кнопки вверх-вниз значение текстового поля изменяется на единицу и срабатывает событийная процедура:
procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);
begin
// перерисовка плоскости и графика
decart;
graph;
end;
Подобно можно построить любой график функции.
Вот и все. Проект необходимо отладить, собрать (получить запускаемый файл). С файлами проекта и с компилированным файлом вы можете ознакомиться во вложении к этому материалу.

Подводя итог работы, хотелось бы сделать вывод: цель, поставленная в начале выполнения проекта, была достигнута. Мною разработанный лабораторный практикум «Графики функций» можно применять в учебном процессе в средней школе. Гипотеза поставленная мною, верна. В этом я убедился, когда предложил учителям нашей школы применять мою программу при изучении графиков функции. Желающим написать подобную программу, нужно придерживаться алгоритма, описанного мною в практической части данной работы.

Как сделать график в лазарусе

Доброго времени суток! Возник вопрос по созданию графика функции.
Имеется функция: N20 = f(time), time = 0..20

Для моментов времени time = 0..10, аргумент N20 = (25 + Xenon*(1-exp(time/chrome));

Для моментов времени time = 11..20, аргумент определяется по условию:
N20 = if ((N20_для_time=10) * exp (- ((time = 11)-(time=10))/chrome))

(т.е если получается число меньше 25, то принимается число равным 25), если число больше 25,
то N20 = ((N20_для_time=10) * exp (- ((time = 11)-(time=10))/chrome))

Помогите, пожалуйста, построить данную зависимость. Знаю, что для графика нужна функция TChart, поместил её на форму. А как дальше быть? Хотелось бы, чтобы после задания параметров в ComboBox1 и Edit 1-2, при нажатии на кнопку строился этот график.

Последний раз редактировалось Daniel_Riccardo; 29.09.2016 в 18:28 .

Daniel_Riccardo
Посмотреть профиль
Найти ещё сообщения от Daniel_Riccardo

Регистрация: 30.04.2016
Сообщений: 3
Небольшая поправочка в задании

Функция прежняя: N20 = f(time), time = 0..2k

Но изначально, задаемся значением k (в объект Edit)

Для моментов времени time = 0..k, аргумент N20 = (25 + Xenon*(1-exp(-time/chrome));

Для моментов времени time = 1.1k..2k, аргумент определяется по условию:
N20 = if ((N20_для_time=10) * exp (- ((time = 11)-(time=10))/chrome))
Последний раз редактировалось Daniel_Riccardo; 02.10.2016 в 21:47 . Причина: Изменил задание

Daniel_Riccardo
Посмотреть профиль
Найти ещё сообщения от Daniel_Riccardo
Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение графика функции y=ax^2+bx+c Timka4296 Общие вопросы Delphi 8 31.07.2016 05:45
Построение графика функции, мигание(затухание) шарика в минимумах функции kas1m_rus Паскаль, Turbo Pascal, PascalABC.NET 0 27.05.2012 20:28
построение графика функции Никита. Visual C++ 0 24.05.2012 21:46
Построение графика функции Bounty Hunter Общие вопросы C/C++ 1 18.05.2012 19:54
Построение графика функции. TP sysfa1l Помощь студентам 8 15.11.2009 13:01

Графические примитивы класса TCanvas в Lazarus

Класс TCanvas — сердцевина графической подсистемы Delphi (Lazarus). Он объединяет в себе и «холст» (контекст конкретного устройства GDI), и «рабочие инструменты» (перо, кисть, шрифт) и даже «подмастерьев» (набор функций по рисованию типовых геометрических фигур).

Канва не является компонентом, но она входит в качестве свойства во многие другие компоненты, которые должны уметь нарисовать себя и отобразить какую-либо информацию.

Для рисования канва включает в себя шрифт, перо и кисть:

(рb) property Font: TFont ; (Pt) property Pen: TPen; (Рb) property Brush: TBrush;

Кроме того, можно рисовать и поточечно, получив доступ к каждому пикселу. Значение свойства

property Pixels [ X , Y : Integer ] : TColor;

соответствует цвету точки с координатами (X,Y).

Класс TCanvas

procedure Arc ( X1 , Y1 , X2 , Y2 , XЗ , Y3 , X4 , Y4 : Integer ) ; Метод рисует сегмент эллипса. Эллипс определяется описывающим прямоугольником (X1,Y1) — (X2,Y2). Начальная точка сегмента лежит на пересечении эллипса и луча, проведенного из его центра через точку (X3,Y3). Конечная точка сегмента лежит на пересечении эллипса и луча, проведенного из его центра через точку (X4,Y4). Сегмент рисуется против часовой стрелки.
procedure Chord ( X1 , Y1 , X2 , Y2 , XЗ , Y3 , X4 , Y4 : Integer ) ; Рисует хорду и заливает отсекаемую ею часть эллипса. Эллипс, начальная и конечная точки определяются, как в методе Arc.
procedure Ellipse ( X1 , Y1 , X2 , Y2 : Integer ) ; Рисует и закрашивает эллипс, вписанный в прямоугольник (X1,Y1) — (X2,Y2).
procedure MoveTo ( X , Y : Integer ) ; Перемещает текущее положение пера (свойство PenPos) в точку (X,Y).
procedure LineTo ( X , Y : Integer ) ; Проводит линию текущим пером из текущей точки в (X,Y).
procedure BrushCopy ( const Dest : TRect; Bitmap : TBitmap; const Source : TRect; Color : TColor ) ; Производит специальное копирование. Прямоугольник Source из битовой карты Bitmap копируется в прямоугольник Dest на канве; при этом цвет Color заменяется на цвет текущей кисти (Brush.Color).
procedure CopyRect ( const Dest : TRect; Canvas : TCanvas; const Source : TRect ) ; Производит копирование прямоугольника Source из канвы Canvas в прямоугольник Dest в области самого объекта.
procedure FillRect ( const Rect : TRect ) ; Производит заливку прямоугольника (текущей кистью).
procedure Draw ( X , Y : Integer ; Graphic : TGraphic ) ; Осуществляет рисование графического объекта Graphic
procedure StretchDraw ( const Rect : TRect; Graphic : TGraphic ) ; Осуществляет рисование объекта Graphic в заданном прямоугольнике Rect. Если размеры их не совпадают, Graphic масштабируется.
procedure FloodFill ( X , Y : Integer ; Color : TColor; FillStyle : TFillStyle ) ; TFillStyle = ( fsSurface , fsBorder ) ; Производит заливку области текущей кистью. Процесс начинается с точки (X,Y). Если режим FillStyle равен fsSurface, то он продолжается до тех пор, пока есть соседние точки с цветом Color. В режиме fsBorder закрашивание, наоборот, прекращается при выходе на границу с цветом Color.
procedure Pie ( X1 , Y1 , X2 , Y2 , XЗ , Y3 , X4 , Y4 : Integer ) ; Рисует сектор эллипса, описываемого прямоугольником (X1,Y1) — (X2,Y2). Стороны сектора лежат на лучах, проходящих из центра эллипса через точки (X3.Y3) и (X4,Y4).
procedure Polygon ( const Points : array of TPoint ) ; Строит многоугольник, используя массив координат точек Points. При этом последняя точка соединяется с первой и внутренняя область закрашивается.
Polygon ([Point(10,10), Point(30,30),Point(20,40)])
procedure Polyline ( const Points : array of TPoint ) ; Строит ломаную линию, используя массив координат точек Points.
procedure Rectangle ( X1 , Y1 , X2 , Y2 : Integer ) ; Рисует прямоугольник с диагональю заданной координатами (X1,Y1) и (X2,Y2).
procedure RoundRect ( X1 , Yl , X2 , Y2 , ХW , YH : Integer ) ; Рисует прямоугольник с закругленными углами. Координаты вершин — те же, что и в методе Rectangle. Закругления рисуются как сегменты эллипса с размерами осей по горизонтали и вертикали ХW и YH.
function TextHeight ( const Text : string ) : Integer ; Возвращает высоту строки Text в пикселах.
function TextWidth ( const Text : string ) : Integer ; Возвращает ширину строки Text в пикселах.
procedure TextOut ( X , Y : Integer ; const Text : string ) ; Производит вывод строки Text. Левый верхний угол помещается в точку канвы (X,Y).
procedure TextRect ( Rect : TRect; X , Y : Integer ; const Text : string ) ; Производит вывод текста с отсечением. Как и в TextOut, строка Text выводится с позиции (X,Y); при этом часть текста, лежащая вне пределов прямоугольника Rect, отсекается и не будет видна.
property PenPos : TPoint; Содержит текущую позицию пера канвы (изменяется посредством метода MoveTo).
procedure TForm1.Button1Click(Sender: TObject); begin with Paintbox1.Canvas do begin Brush.Color := clGray; Rectangle(10,100,250,300); // корпус Polygon([Point(0,100),Point(130,20),Point(260,100)]); // крыша Brush.Color := clWhite; Ellipse(110,40,150,80); // чердак Rectangle(30,150,110,230); // окно MoveTo(70,150); LineTo(70,230); Rectangle(150,300,230,150); // дверь Brush.Color := clGray; Polygon([Point(150,300),Point(150,150),Point(210,160),Point(210,300)]); end; end;

Построение графика в Lazarus

На 1 фото задание, на 2 сама функция. Мне нужно понять саму идею, как это можно реализовать. Подскажите пожалуйста)

Голосование за лучший ответ

Проще всего воспользоваться TChart.
Как пример — заходите во вкладку Chart, на форму вытаскиваете TChart
Правая кнопка на элементе Chart, Edit Series, Add Line Series

Появится элемент Chart1LineSeries1

В обработчике на кнопку:
procedure TForm1.Button1Click(Sender: TObject);
var x:integer;
begin
Chart1LineSeries1.Clear;
for x:=-10 to 10 do
Chart1LineSeries1.AddXY(x, x*x);
end;

Ессно вместо параболы x*x ставите свою функцию. Ну и есс-но надо будет проверять на область допустимых значений, т. к. н-р при x = 0 будет 1/sin(0) => деление на ноль.

Получаем:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *