Тема 9. Программирование с отображением графической информации

9.2. Как строится график с помощью компонента TChart

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

9.2. Как строится график с помощью компонента TChart

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

Построение графика (диаграммы) производится после вычисления таблицы значений функции y=f(x). Полученная таблица передается в специальный двумерный массив ChartI.SeriesList[k] (k – номер графика (0,1,2,...)) компонента TСhart с помощью метода AddXY. Компонент TChart осуществляет всю работу по отображению графиков, переданных в объект ChartI.SeriesList[k]: строит и размечает оси, рисует координатную сетку, подписывает название осей и самого графика, отображает переданную таблицу в виде всевозможных графиков или диаграмм. При необходимости, с помощью встроенного редактора EditingChart компоненту TСhart передаются данные о толщине, стиле и цвете линий, параметрах шрифта подписей, шагах разметки координатной сетки и другие настройки. В процессе работы программы изменение параметров возможно через обращение к соответствующим свойствам компонента TChart. Так, например, свойство Chart1.BottomAxis содержит значение максимального предела нижней оси графика. Перенести график в отчет можно через буфер обмена используя процедуру ChartI.CopyToClipboardMetafile(True).

9.3. Пример написания программы

Задание: составить программу, выводящую график функции sin(x) двумя способами. В первом случае использовать компонент Timage, во втором – компонент TChar. Для размещения исходных данных и двух графиков использовать три панели компонента TPageControl.

9.3.1. Работа с компонентом TPageControl

Если на одной форме необходимо разместить большое количество информации или необходимо разделить эту информацию, удобно использовать компонент TPageControl (страница Win32). Этот компонент может содержать несколько перекрывающих друг друга пнелей, доступ к которым осуществляется с помощью закладок. Для добавления новой панели необходимо щелкнуть по компоненту правой кнопкой мыши и выбрать пункт NewPage. Размещение элементов на нужной панели производится точто также как и на форме.

Расположите на форме компонент PageControl1, создайте три панели и расположите на них компоненты в соответствии с рис. 9.1.— 9.3.

Рис. 9.1.

Рис. 9.2.

Рис. 9.3.

9.3.2. Работа с компонентом TChart

Для изменения параметров компонента TChart необходимо дважды щелкнуть по нему мышью в окне формы. Появится окно редактирования EditingChat1  (рис. 9.4). Для создания нового объекта Series1 щелкнуть по кнопке Add на странице Series. В появившемся диалоговом окне TeeChart Gallery выбрать пиктограмму с надписью Line (график выводится в виде линий). Если нет необходимости представления графика в трехмерном виде, отключить независимый переключатель 3D. После нажатия на кнопку OK появится новая серия с название Series1. Для изменения названия нажать кнопку Title. Закладка Legend задает список обозначений даиграммы (можно убирать с экрана). Название графика вводится на странице Titles. Разметка осей меняется на странице Axis. Страница Series задает характеристики (цвет, толщина линий) для определенного графика.

Нажимая различные кнопки меню, познакомтесь с другими возможностями EditingChat.

Рис. 9.4.

Текст программы приведен на Листинге 9.1

Листинг 9.1.

unit Unit9;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, TeeProcs, TeEngine, Chart, StdCtrls, ComCtrls, Series, Clipbrd;

type

  TForm1 = class(TForm)

  PageControl1: TPageControl;

  TabSheet1: TTabSheet;

  TabSheet2: TTabSheet;

  TabSheet3: TTabSheet;

  Label1: TLabel;

  Label2: TLabel;

  Edit1: TEdit;

  Edit2: TEdit;

  Edit3: TEdit;

  Label4: TLabel;

  Label5: TLabel;

  Label6: TLabel;

  Label7: TLabel;

  Label3: TLabel;

  Label8: TLabel;

  Edit4: TEdit;

  Edit5: TEdit;

  Edit6: TEdit;

  Edit7: TEdit;

  Button1: TButton;

  Button2: TButton;

  Image1: TImage;

  Button3: TButton;

  Button4: TButton;

  Chart1: TChart;

  Series1: TLineSeries;

  procedure Button1Click(Sender: TObject);

  procedure Button2Click(Sender: TObject);

  procedure Button3Click(Sender: TObject);

  procedure Button4Click(Sender: TObject);

  procedure FormCreate(Sender: TObject);

  private

  { Private declarations }

  public

  { Public declarations }

  end;

var

  Form1: TForm1;

  xn, xk, x, y, h : extended;

  xomin, xomax, yomin, yomax : extended;

  m, i, delt : integer;

implementation

{$R *.dfm}

Function f(x: extended):extended;

begin

  Result:=sin(x); // Функция

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Edit1.Text:='0,1';  Edit2.Text:='6';  Edit3.Text:='50';  Edit4.Text:='0';

Edit5.Text:='6';  Edit6.Text:='-1';  Edit7.Text:='1';

end;

procedure TForm1.Button1Click(Sender: TObject);  // Рисование в Image1

var xmax, ymax, xt,  yt, yo : integer;

  hx, hy : extended;

begin

  xn:=StrToFloat(Edit1.Text);

  xk:=StrToFloat(Edit2.Text);

  m:=StrToInt(Edit3.Text);

  xomin:=StrToFloat(Edit4.Text);

  xomax:=StrToFloat(Edit5.Text);

  yomin:=StrToFloat(Edit6.Text);

  yomax:=StrToFloat(Edit7.Text);

  with Image1.Canvas do begin

  Pen.Color:=clBlack;  // Установка цвета карандаша

  Brush.Color:=clGreen;  // Уставнока цвета кисти

  xmax:=Image1.Width;  // Чтение максимальной координаты по x

  ymax:=Image1.Height;  // Чтение максимальной координаты по y

  {Строим оси координат}

  yo:=ymax div 2;

  MoveTo(0,yo);  LineTo(xmax,yo);

  MoveTo(0,0);  LineTo(0,ymax);

  Pen.Color:=clRed;  // Установка цвета карандаша

  Pen.Width:=2;  // Установка толщины карандаша

  hx:=(xomax-xomin)/xmax;  // Масштабные коэффициенты устанавли-

  hy:=(yomax-yomin)/ymax;  // вающие шаг (в пикселах) по X и по Y

{Вывод графика}

  h:=(xk-xn)/(m-1);

  x:=xn;

  y:=f(x);  // Первая точка

  MoveTo(Round(x/hx),Round(yo-y/hy));

  for i:=1 to m do begin

  x:=x+h;

  y:=f(x);

  LineTo(Round(x/hx),Round(yo-y/hy));

  end;

  end;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

ClipBoard.Assign(Image1.Picture);  // Копировать в буфер обмена

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

  xn:=StrToFloat(Edit1.Text);

  xk:=StrToFloat(Edit2.Text);

  m:=StrToInt(Edit3.Text);

  xomin:=StrToFloat(Edit4.Text);

  xomax:=StrToFloat(Edit5.Text);

  yomin:=StrToFloat(Edit6.Text);

  yomax:=StrToFloat(Edit7.Text);

  {Установка осей}

  with Chart1 do begin

  LeftAxis.Automatic:=False;

  LeftAxis.Minimum:=yomin;

  LeftAxis.Maximum:=yomax;

  BottomAxis.Automatic:=False;

  BottomAxis.Minimum:=xomin;

  BottomAxis.Maximum:=xomax;

  SeriesList[0].Clear;

  h:=(xk-xn)/(m-1);  x:=xn;

  for i:=1 to m do begin

  y:=f(x);

  SeriesList[0].AddXY(x,y);

  x:=x+h;

  end;

  end;

end;

procedure TForm1.Button4Click(Sender: TObject);

begin

Chart1.CopyToClipboardMetafile(True);  // Копировать в буфер обмена

end;

end.

9.4. Выполнение индивидуального задания

Постройте график соответствующей функции от x для вариантов из темы 3. Таблицу данных получить изменяя параметр x с шагом h. Ввод исходных данных организовать через окна TEdit. Самостоятельно выбрать удобные параметры настройки.

По указанию преподавателя выберите вариант задачи. Решите задачу, и используя функции класса TCanvas нарисуйте соответствующие геометрические фигуры. Расположите все рисунки в центре TImage, так чтобы они занимали 2/3 области окна. Все исходные данные имеют действительный тип. Используйте масштабирование.

1. Даны три числа а, b, с. Необходимо определить, существует ли треугольник с такими длинами сторон.

2. Даны четыре числа а, b, с, d. Необходимо определить, существует ли четырехугольник с такими длинами сторон.

3. Отобразить взаимное расположение двух окружностей радиусов R1и R2 с центрами в точках (x1 , y1 ), (х2 , у2 ) соответственно.

4. Отобразить взаимное расположение окружности радиуса R с центром в точке (x0 , у0 ) и прямой, проходящей через точки с координатами (x1 , y1 ) и  (х2 , у2 ) (пересекаются, касаются, не пересекаются).

5. Определить количество точек с целочисленными координатами, лежащих внутри окружности радиуса R с центром в точке (х0 , у0 ).

6. Найти координаты точек пересечения двух окружностей радиуса R1 и R2 с центрами в точках (х1 , у1 ) и (х2 , у2 ) соответственно.

7. Найти координаты точки, симметричной данной точке М с координатами   (х1 , у1)Ах+Ву+С=0. относительно прямой

8. Даны две точки М1 (х1 , у1 ), М2(х2 , у2 ) и прямая Ах+By+С=0. Необходимо найти на этой прямой такую точку М0 (х0 , у0 ), чтобы суммарное расстояние от нее до двух данных точек было минимально.

9. Даны три точки с координатами (х1 , у1 ), (х2 , у2 ), (х3 , у3 ), которые являются вершинами некоторого прямоугольника со сторонами, параллельными осям координат. Найти координаты четвертой точки.

10. Даны координаты четырех точек (х1 , у1 ), (х2 , у2 ), (х3 , у3 ), (х4 , у4 ). Необходимо определить, образуют ли они выпуклый четырехугольник.

11. Даны координаты четырех точек (х1 , у1 ),  (х2 , у2 ),  (х3 , у3 ),  (х4 , у4 ). Необходимо определить, образуют ли они: а) ромб; б) квадрат; в) трапецию.

12. Даны координаты двух вершин (х1 , у1 ) и (х2 , у2 ). некоторого квадрата. Необходимо найти возможные координаты других его вершин.

13. Даны координаты двух вершин (х1 , у1 ) и (х2 , у2 ) некоторого квадрата, которые расположены на диагонали, и точка (х3, у3 ). Необходимо определить, лежит или не лежит точка внутри квадрата.

14. Даны координаты трех вершин (х1 , у1 ), (x2 , y2 ), (х3 , у3 ) треугольника. Необходимо найти координаты точки пересечения его медиан.

15. Даны координаты трех вершин (х1, у1 ), (x2 , y2 ), (х3 , у3 ) треугольника. Необходимо найти длины его высот.

Вы здесь: