ЗАДАНИЕ 8. Программирование с отображением графической информации

Использование класса TСanvas

       Для рисования в BUILDER используется класс TСanvas, который является не самостоятельным компонентом, а свойством многих компонентов, и  представляет собой холст (контекст GDI в Windows) с набором инструментов для рисования. Каждая точка точка холста имеет свои координаты. Начало осей координат располагается в верхнем левом углу холста. Данные по оси Х увеличиваются слева-направо, а по оси Y сверху-вних.

Использование класса TСanvas

       Для рисования в BUILDER используется класс TСanvas, который является не самостоятельным компонентом, а свойством многих компонентов, и  представляет собой холст (контекст GDI в Windows) с набором инструментов для рисования. Каждая точка точка холста имеет свои координаты. Начало осей координат располагается в верхнем левом углу холста. Данные по оси Х увеличиваются слева-направо, а по оси Y сверху-вних.

       Основные свойства класса TCanvas:

__property TPen* Pen – карандаш (определяет параметры линий),

__property TBrush* Brush – кисть (определяет фон и заполнение замкнутых фигур),

__property TFont* Font – шрифт (определяет параметры шрифта).

       Некоторые методы класса TCanvas:

void __fastcall Ellipse(int X1, int Y1, int X2, int Y2) – чертит эллипс в охватывающем прямоугольнике (X1, Y1), (Х2, Y2). Заполняет внутреннее пространство эллипса текущей кистью.

void __fastcall LineTo(int X, int Y); – чертит линию от текущего положения пера до точки (X. Y).

void __fastcall MoveTo(int X, int Y) – перемещает карандаш в положение (X, Y) без вычерчивания линий.

void __fastcall Polygon(const TPoint * Points, const int Points_Size) – вычерчивает карандашом многоугольник по точкам, заданным в массиве Роints. Конечная точка соединяется с начальной и многоугольник заполняется кистью. Для вычерчивания без заполнения используйте метод Polyline.

void __fastcall Rectangle(int X1, int Y1, int X2, int Y2) – вычерчивает и заполняет прямоугольник (X1, Y1), (Х2, Y2). Для вычерчивания без заполнения используйте FrameRect или Polyline.

void __fastcall TextOut(int X, int Y, const AnsiString Text) – выводит текстовую строку Техt так, чтобы левый верхний угол прямоугольника, охватывающего текст, располагался в точке (X, Y).

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

       Задание: составить программу, отображающую движение автомобиля с изменяющейся скоростью. Вывести с помощью компонента TChar график скорости.

Настройка формы

Панель диалога программы организуется в виде, представленном на рис.8.1. Причем поле с автомобилем не видно на этапе настройки формы и появляется только как результат выполнения кода программы. Поэтому в том месте формы, где предполагается делать вывод графической информации следует оставить свободное место.

       Компонент TChart вводится в форму путем нажатия пиктограммы  в меню компонентов.

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

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

       Данные по оси X автоматически сортируются, поэтому, если необходимо нарисовать например, окружность, сортировку отключают функцией Order :  Chart1->Series[0]->XValues->Order=loNone.

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

Текст программы имеет вид:

#include <vcl.h>

#pragma hdrstop

#include "lr01.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

  : TForm(Owner)

{

}

//---------------------------------------------------------------------------

void Shar(int xx,int yy, TColor cc)  // Вывод изображения машины

{

  Form1->Canvas->Pen->Color=cc;  // Установка цвета карандаша

  Form1->Canvas->Brush->Color=cc;  // Установка цвета кисти

  TPoint pnt[7];

  pnt[0]=Point(xx+0,yy+20);

  pnt[1]=Point(xx+0,yy+40);

  pnt[2]=Point(xx+110,yy+40);

  pnt[3]=Point(xx+110,yy+20);

  pnt[4]=Point(xx+90,yy+20);

  pnt[5]=Point(xx+70,yy+0);

  pnt[6]=Point(xx+20,yy+0);

  Form1->Canvas->Polygon(pnt,6);  // Кузов машины

  Form1->Canvas->Ellipse(xx+10,yy+30,xx+30,yy+50);  // Колесо

  Form1->Canvas->Ellipse(xx+80,yy+30,xx+100,yy+50); // Колесо 

}  // Конец функции вывода изображения машины

//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn2Click(TObject *Sender)

{

  Canvas->Pen->Color = clBlack;  // Установка цвета карандаша 

  Canvas->Brush->Color = clGreen;  // Установка цвета кисти

  Canvas->Rectangle(10,10,520,90);  // Рисуте прямоугольник

  double hx=1;  double h=0;

  double x=10;  int n=0;

  while (x<410) { 

  h+=0.01;

  hx+=int (h);                // Изменения шага для увеличения скорости

  Shar(x,40,clYellow);                // Рисование машины

  Sleep(10);                        // Задержка

  Shar(x,40,clGreen);                // Стирание нарисованной машины

  x+=hx;

  n++;

  Chart1->Series[0]->AddXY(n,x,"",clTeeColor); // Ввод данных для графика

  }

}

//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn1Click(TObject *Sender)

{

Chart1->Series[0]->Clear();  // Очистка графика

}

//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn3Click(TObject *Sender)

{

Chart1->CopyToClipboardMetafile(True);// Передача графика в буфер

  // обмена для последующей вставки в отчет

}

//---------------------------------------------------------------------------

Варианты заданий

       Решить задачу в соответствии с заданным вариантом и используя компонент TСhar нарисовать соответствующие геометрические фигуры.

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 ) треугольника. Необходимо найти длины его высот.

Контрольные вопросы

  • Как используется класс TСanvas.
  • Как настроить форму для вывода графической информации.
  • Работа с компонентом TChart
  • Как построить график функции
  • Как работать с цветом
  • Вы здесь: