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