Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

График функции

Delphi , Синтаксис , Математика

График функции


unit grfunc_;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

// Функция, график которой надо построить

function f(x: real): real;
begin
  f := 2 * Sin(x) * exp(x / 5);
end;

// строит график функции

procedure GrOfFunc;
var
  x1, x2: real; // границы изменения аргумента функции
  y1, y2: real; // границы изменения значения функции
  x: real; // аргумент функции
  y: real; // значение функции в точке x
  dx: real; // приращение аргумента
  l, b: integer; // левый нижний угол области вывода графика
  w, h: integer; // ширина и высота области вывода графика
  mx, my: real; // масштаб по осям X и Y
  x0, y0: integer; // точка - начало координат

begin
 // область вывода графика
  l := 10; // X - координата левого верхнего угла
  b := Form1.ClientHeight - 20; // Y - координата левого верхнего угла
  h := Form1.ClientHeight - 40; // высота
  w := Form1.Width - 40; // ширина

  x1 := 0; // нижняя граница диапазона аргумента
  x2 := 25; // верхняя граница диапазона аргумента
  dx := 0.01; // шаг аргумента

 // найдем максимальное и минимальное значения
 //  функции на отрезке [x1,x2]
  y1 := f(x1); // минимум
  y2 := f(x1); // максимум
  x := x1;
  repeat
    y := f(x);
    if y < y1 then y1 := y;
    if y > y2 then y2 := y;
    x := x + dx;
  until (x >= x2);

 // вычислим масштаб
  my := h / abs(y2 - y1); // масштаб по оси Y
  mx := w / abs(x2 - x1); // масштаб по оси X

 // оси
  x0 := l;
  y0 := b - Abs(Round(y1 * my));

  with form1.Canvas do
  begin
   // оси
    MoveTo(l, b); LineTo(l, b - h);
    MoveTo(x0, y0); LineTo(x0 + w, y0);
    TextOut(l + 5, b - h, FloatToStrF(y2, ffGeneral, 6, 3));
    TextOut(l + 5, b, FloatToStrF(y1, ffGeneral, 6, 3));
   // построение графика
    x := x1;
    repeat
      y := f(x);
      Pixels[x0 + Round(x * mx), y0 - Round(y * my)] := clRed;
      x := x + dx;
    until (x >= x2);

    TextOut(17, 100, 'Delphi World Example');
  end;
end;


procedure TForm1.FormPaint(Sender: TObject);
begin
  GrOfFunc;
end;

// изменился размер окна программы

procedure TForm1.FormResize(Sender: TObject);
begin
  // очистить форму
  form1.Canvas.FillRect(Rect(0, 0, ClientWidth, ClientHeight));
  // построить график
  GrOfFunc;
end;

end.
Скачать весь проект

Перевод контента на русский язык:

Это проект программирования Delphi, который aims to plot the graph of a given function f(x) = 2 * Sin(x) * exp(x/5) within a windowed application.

Вот разбивка кода:

  1. Основная форма TForm1 имеет два процедура: FormPaint и FormResize. FormPaint вызывается, когда форма впервые рисуется, а FormResize - при изменении размера формы.
  2. В процедуре GrOfFunc программа рассчитывает минимальное и максимальное значения функции в заданном диапазоне [x1, x2]. Затем она вычисляет коэффициенты масштабирования для обеих осей (mx и my) для обеспечения того, чтобы график fit within the window.
  3. Программа затем рисует оси (X и Y) с помощью методов MoveTo, LineTo и TextOut объекта Canvas. Ось X рисуется от (l, b) до (x0 + w, y0), а ось Y - от (l, b - h) до (l, b).
  4. Программа затем plots the graph, iteratively calculating the value of the function at each point in the range [x1, x2] with steps of dx. For each step, it calculates the value of the function and sets the corresponding pixel on the canvas to red using the Pixels property.
  5. В процедуре FormPaint программа просто вызывает GrOfFunc, чтобы plot the graph for the first time.
  6. В процедуре FormResize программа очищает форму, заполняя ее solid color, а затем вызывает GrOfFunc снова, чтобы rebuild the graph.

Некоторые предложения по улучшению:

  1. Рассмотрите использование более эффективного алгоритма для расчета минимальных и максимальных значений функции. Текущий подход involves iterating over the entire range, which may be slow.
  2. Вместо hardcoding коэффициентов масштабирования (mx and my) и координат (l, b, x0 and y0), рассмотрите использование более динамического подхода для расчета этих значений на основе размера формы и поведения функции.
  3. Программаcurrently only plots the graph for a specific range of x values. Рассмотрите добавление пользовательского ввода или других механизмов, чтобы позволить пользователям динамически изменять диапазон.

В целом, это хороший старт для создания простого приложения для рисования графиков в Delphi. С некоторыми улучшениями оно может стать еще более мощным и пользовательским!

В статье описывается пример программы на языке Delphi, которая строит график функции y = 2 * Sin(x) * exp(x / 5).


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Математика ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 14:24:18/0.0057008266448975/1