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

Функция построения графика

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

Функция построения графика

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

private
   FPoints: array [0..144] of TPoint;

 {...}

 procedure TForm1.CalculateGraph;
 var
   xRangePixels, yRangePixels: Integer;
   origin: TPoint;
   radian, interval: Double;
   i: Integer;
 begin
   { 
    We calculate the sinus curve in the interval -2Pi..+2Pi, 
    with a resolution of 4Pi/144, as a series of points that 
    will be connected by a polyline. The graph is scaled to fit into 
    the paintbox. The origin of the coordinate system is the center 
    of the paintbox. The default windows coordinate system is inverted, 
    the Y axis points downward! 
  }
   xRangePixels := (paintbox1.Width - 2) div 4; { pixels in Pi }
   yRangePixels := (paintbox1.Height - 2) div 2; { pixels in 1 }
   origin       := Point(paintbox1.Width div 2, paintbox1.Height div 2);
   radian       := -2.0 * Pi;
   interval     := 4.0 * Pi / 144.0;
   for i := 0 to High(FPoints) do
    begin
     FPoints[i].X := origin.x + Round(radian * xRangePixels / Pi);
     FPoints[i].Y := origin.y - Round(sin(radian) * yRangePixels);
     radian       := radian + interval;
   end;
 end;

 procedure TForm1.PaintBox1Paint(Sender: TObject);
 var
   origin: TPoint;
   xRangePixels, yRangePixels: Integer;
 begin
   with PaintBox1.Canvas do
    begin
     { Fill background in white }
     Brush.Color := clBtnFace;
     Brush.Style := bsSolid;
     Fillrect(paintbox1.BoundsRect);

     { Paint a coordinate cross }
     origin    := Point(paintbox1.Width div 2, paintbox1.Height div 2);
     Pen.Color := clBlack;
     Pen.Style := psSolid;
     Pen.Width := 1;
     MoveTo(1, origin.Y);
     LineTo(paintbox1.Width - 1, origin.y);
     MoveTo(origin.x, 1);
     LineTo(origin.x, paintbox1.Height - 1);

     { Paint some tickmarks and label the axis }
     Font.Name    := 'Symbol';
     Font.Size    := 8;
     Font.Color   := clBlack;
     xRangePixels := (paintbox1.Width - 2) div 4; { pixels in Pi }
     yRangePixels := (paintbox1.Height - 2) div 2; { pixels in 1 }

     { X axis }
     MoveTo(origin.x - 2 * xRangePixels, origin.y - 4);
     LineTo(origin.x - 2 * xRangePixels, origin.y + 4);
     TextOut(origin.x - 2 * xRangePixels + 2, origin.y + 2, '-2p');
     MoveTo(origin.x - xRangePixels, origin.y - 4);
     LineTo(origin.x - xRangePixels, origin.y + 4);
     TextOut(origin.x - xRangePixels + 2, origin.y + 2, '-p');
     MoveTo(origin.x + xRangePixels, origin.y - 4);
     LineTo(origin.x + xRangePixels, origin.y + 4);
     TextOut(origin.x + xRangePixels - 2 - TextWidth('p'), origin.y + 2, 'p');
     MoveTo(origin.x + 2 * xRangePixels, origin.y - 4);
     LineTo(origin.x + 2 * xRangePixels, origin.y + 4);
     TextOut(origin.x + 2 * xRangePixels - 2 - TextWidth('2p'), origin.y + 2, '2p');


     { Y axis }
     MoveTo(origin.x - 4, origin.y - yRangePixels);
     LineTo(origin.x + 4, origin.y - yRangePixels);
     TextOut(origin.x + 4, origin.y - yRangePixels, '1.0');
     MoveTo(origin.x - 4, origin.y - yRangePixels div 2);
     LineTo(origin.x + 4, origin.y - yRangePixels div 2);
     TextOut(origin.x + 4, origin.y - (yRangePixels + TextHeight('1')) div 2, '0.5');
     MoveTo(origin.x - 2, origin.y + yRangePixels div 2);
     LineTo(origin.x + 2, origin.y + yRangePixels div 2);
     TextOut(origin.x + 3, origin.y + (yRangePixels - TextHeight('1')) div 2, '-0.5');
     MoveTo(origin.x - 2, origin.y + yRangePixels);
     LineTo(origin.x + 2, origin.y + yRangePixels);
     TextOut(origin.x + 3, origin.y + yRangePixels - TextHeight('1'), '-1.0');

     {Paint the graph }
     Pen.Color := clBlue;
     Polyline(FPoints);
   end;
 end;

 procedure TForm1.FormResize(Sender: TObject);
 begin
   CalculateGraph;
 end;

 procedure TForm1.FormCreate(Sender: TObject);
 begin
   CalculateGraph;
 end;

Here's the translation of the provided text into Russian:

Программа на Delphi строит график функции синусоидальной в интервале -2π до +2π с разрешением 4π/144. Пunkt начала координатной системы установлен в центре контрола paintbox, который является основным графическим компонентом формы.

Процедура CalculateGraph вычисляет точки, которые будут использоваться для рисования графика, и хранит их в массиве TPoints, представляющем собой точку с координатами x и y. Точки рассчитываются по формуле функции синусоидальной: sin(x) * yRangePixels, где x - угол в радианах, а yRangePixels - максимальное значение y в пикселях.

Процедура PaintBox1Paint рисует график на контроле paintbox. Она сначала заливает фон белым цветом, затем рисует координатную ось (оси), добавляет метки и надписи к осям, а finally рисует синусоидальную кривую используя точки, рассчитанные в процедуре CalculateGraph.

Процедуры FormResize и FormCreate - обработчики событий изменения размера и создания формы соответственно. Они вызывают процедуру CalculateGraph, когда форма создается или изменяется размер, что обеспечивает обновление графика соответствующим образом.

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

В этом альтернативном решении я добавил переменные Paintbox1OldWidth и Paintbox1OldHeight, чтобы отслеживать предыдущий ширина и высота контрола paintbox. В обработчике события изменения размера формы, он проверяет, изменилась ли ширина или высота, и обновляет только те части, которые изменились, а затем инвалидирует контрол paintbox для принудительного перерисовки. Это более эффективно, чем перерасчитывать весь график при изменении размера формы.

Также я добавил проверку на null для FPoints в процедуре CalculateGraph, чтобы предотвратить потенциальные доступные нарушения, если FPoints еще не инициализирован.

Функция построения графика с использованием Pascal Delphi для отображения синусоидальной кривой в интервале -2π..+2π.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-04-26 16:51:39/0.0033650398254395/0