Лабораторная работа №9. Построение графиков функций
Цель работы: изучить некоторые возможности построения графиков функций с помощью компонент Сhart и Image; научиться работать с графическими объектами; написать и отладить программу с использованием функций отображения графической информации.
Краткие теоретические сведения
Построение графиков с помощью компоненты Chart
Обычно результаты расчетов представляются в виде графиков и диаграмм. Система Builder имеет мощный пакет стандартных программ вывода на экран и редактирования графической информации, который реализуется с помощью компоненты Chart, находящейся на панеле компонет Additional - .
Построение графика (диаграммы) производится по вычисленным значениям координат точек х и y = f(x), которые с помощью метода AddXY передаются в специальный двухмерный массив Series[k] компоненты Сhart (k = 0,1,2,... – номер используемого графика).
Компонента Chart строит и размечает оси, рисует координатную сетку, подписывает название осей и самого графика, отображает переданные точки в виде графиков или диаграмм.
Установив компоненту Chart1 на форму, для изменения ее параметров двойным щелчком кнопкой мыши вызываем окно редактирования EditingChat1 (рис. 9.1). Для создания Series1 нажимаем кнопку Add на странице Series.
Рис. 9.1
В появившемся после этого окне TeeChart Gallery выбираем пиктограмму с надписью Line (график выводится в виде линий). Если нет необходимости представления графика в трехмерном виде, отключается независимый переключатель 3D. Для изменения названия нажимаем кнопку Title. Название графика вводится на странице Titles.
Данные по оси X автоматически сортируются, поэтому, если необходимо нарисовать, например, окружность, сортировку отключают функцией Order: Chart1->Series[0]->XValues->Order = loNone.
Нажимая различные кнопки меню, познакомьтесь с другими возможностями редактора EditingChat.
Использование класса Сanvas
Для рисования используется класс типа TСanvas, который является не самостоятельной компонентой, а свойством многих компонент, таких как Image, PaintBox, и представляет собой холст (контекст GDI в Windows) с набором инструментов для рисования. Каждая точка холста имеет свои координаты. Начало осей координат располагается в верхнем левом углу холста. Данные по оси Х увеличиваются слева направо, а по оси Y сверху вниз.
Компонента Image находится на странице Additional, а PaintBox – System.
Основные свойства класса Canvas:
Pen – перо (определяет параметры линий),
Brush – кисть (определяет фон и заполнение замкнутых фигур),
Font – шрифт (определяет параметры шрифта).
Некоторые методы класса Canvas:
Ellipse(х1,у1, х2,у2) – чертит эллипс в охватывающем прямоугольнике (х1, у1), (х2, у2) и заполняет внутреннее пространство эллипса текущей кистью;
MoveTo(х,y) – перемещает карандаш в положение (х,y);
LineTo(х,y) – чертит линию от текущего положения пера до точки (х,y);
Rectangle(х1,у1, х2,у2) – вычерчивает и заполняет прямоугольник (х1,у1), (х2, у2). Для вычерчивания без заполнения используйте FrameRect или Polyline;
Polygon(const TPoint* Points, const int Points_Size) – вычерчивает многоугольник по точкам, заданным в массиве Роints размера Points_Size. Конечная точка соединяется с начальной и многоугольник заполняется текущей кистью. Для вычерчивания без заполнения используется метод Polyline.
TextOut(х, у, const AnsiString Text)– выводит строку Техt так, чтобы левый верхний угол прямоугольника, охватывающего текст, располагался в точке (х, у).
Пример создания оконного приложения
Написать программу отображения графика выбранной функции с помощью компонент Сhart и Image.
Настройка формы
Панель диалога программы с получеными результатами представлена на рис. 9.2.
Рис. 9.2
Текст программы, реализующий поставленную задачу, может иметь следующий вид:
. . .
//---------------------------------------------------------------------------
double a,b,h,y_min,y_max;
int n;
typedef double (*Tfun)(double);
Tfun f;
double fun0(double);
double fun1(double);
double fun2(double);
//----------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1->Text="-3,1416"; // a
Edit2->Text="3,1416"; // b
Edit3->Text="50"; // n
RadioGroup1->ItemIndex = 0;
}
//----------------- Задать начальные значения ------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double x, r;
a=StrToFloat(Edit1->Text);
b=StrToFloat(Edit2->Text);
n=StrToInt(Edit3->Text);
h = (b-a)/n;
switch(RadioGroup1->ItemIndex) {
case 0: f = fun0; break;
case 1: f = fun1; break;
case 2: f = fun2; break;
}
y_min = y_max = f(a);
for (x = a+h; x<=b; x+=h) {
r = f(x);
if(y_min>r)
y_min = r;
if(y_max<r)
y_max = r;
}
}
//------------------------ Построить график в Chart ----------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Chart1->Series[0]->Clear(); // Очистка графика
for(double x=a; x<=b; x+=h)
Chart1->Series[0]->AddXY(x,f(x));
}
//--------------------- Копировать в буфер ----------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Chart1->CopyToClipboardMetafile(True);
}
//--------------------- Построить график в Image ---------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
int xmax, ymax, xt, yt, y0, x0;
double hx,hy,x;
Image1->Canvas->Pen->Color=clBlack; // Установка цвета пера
// Поиск координат правого нижнего угла холста Image
xmax = Image1->Width;
ymax = Image1->Height;
// Закрашивание холста Image текущей белой кистью
Image1->Canvas->Rectangle(0,0,xmax,ymax);
// Поиск середины холста
y0=ymax/2;
x0=xmax/2;
// Вычерчивание координатных линий
Image1->Canvas->MoveTo(0,y0);
Image1->Canvas->LineTo(xmax,y0);
Image1->Canvas->MoveTo(x0,0);
Image1->Canvas->LineTo(x0,ymax);
Image1->Canvas->Pen->Color=clRed; // Установка цвета пера
Image1->Canvas->Pen->Width=2; // Установка ширины пера
// Поиск шагов по х и у с масштабированием
hx=(b-a)/xmax;
hy=(y_max-y_min)/ymax;
Image1->Canvas->MoveTo(ceil(x0+a/hx),ceil(y0-f(a)/hy));
for(x=a; x<=b; x+=h)
Image1->Canvas->LineTo(ceil(x0+x/hx),ceil(y0-f(x)/hy));
}
//------------------------------------------------------------
double fun0(double r)
{
return sin(r);
}
//------------------------------------------------------------
double fun1(double r)
{
return r*r;
}
//------------------------------------------------------------
double fun2(double r)
{
return r*r*r;
}
9.3. Индивидуальные задания
Написать программу вывода графиков функции (лабораторная работа №3) Y(x) и ее разложения в ряд S(x) для аргумента x, изменяющегося от a до b с шагом h (вводятся с клавиатуры) с использованием компоненты Сhart и графика функции Y(x) с использованием компоненты Image.
Приложение 1
Приложение 1. Операции и основные математические функции
1. Операции приведены в порядке убывания приоритета, операции с разными приоритетами разделены чертой.
Операция | Краткое описание | Использование | Выполне-ние |
Первичные (унарные) операции | |||
. | Доступ к члену | объект . член | Слева направо |
-> | Доступ по указателю | указатель -> член | |
[ ] | Индексирование | переменная [выражение] | |
( ) | Вызов функции | ID(список) | |
Унарные операции | |||
++ | Постфиксный инкремент | lvalue++ | Справа налево |
-- | Постфиксный декремент | lvalue-- | |
sizeof | Размер объекта (типа) | sizeof(ID или тип) | |
++ | Префиксный инкремент | ++lvalue | |
-- | Префиксный декремент | --lvalue | |
~ | Побитовое НЕ | ~выражение | |
! | Логическое НЕ | !выражение | |
- (+) | Унарный минус (плюс) | - (+)выражение | |
* | Разадресация указателя | *выражение | |
& | Адрес | &выражение | |
() | Приведение типа | (тип)выражение | |
Бинарные и тернарная операции | |||
* | Умножение | выражение * выражение | Слева направо |
/ | Деление | выражение / выражение | |
% | Получение остатка | выражение % выражение | |
+ ( - ) | Сложение (вычитание) | выражение + (-) выражение | |
<< | Сдвиг влево | выражение << выражение | |
>> | Сдвиг вправо | выражение >> выражение | |
< | Меньше | выражение < выражение | |
<= | Меньше или равно | выражение <= выражение | |
> | Больше | выражение > выражение | |
>= | Больше или равно | выражение >= выражение | |
== | Равно | выражение == выражение | |
!= | Не равно | выражение != выражение | |
& | Побитовое И | выражение & выражение | |
^ | Побитовое исключ. ИЛИ | выражение ^ выражение | |
| | Побитовое ИЛИ | выражение | выражение | |
&& | Логическое И | выражение && выражение | |
|| | Логическое ИЛИ | выражение || выражение |
Окончание прил. 1
Операция | Краткое описание | Использование | Выполне-ние |
?: | Условная операция (тернарная) | выражение ? выражение : выражение | Справа налево |
= | Присваивание | lvalue = выражение | |
*= | Умножение с присваиванием | lvalue *= выражение | |
/= | Деление с присваиванием | lvalue /= выражение | |
%= | Остаток от деления с присв-м | lvalue %= выражение | |
+= | Сложение с присваиванием | lvalue += выражение | |
- = | Вычитание с присваиванием | lvalue -= выражение | |
<<= | Сдвиг влево с присваиванием | lvalue <<= выражение | |
>>= | Сдвиг вправо с присваиванием | lvalue >>= выражение | |
&= | Поразрядное И с присваив-м | lvalue &= выражение | |
|= | Поразрядное ИЛИ с присв-м | lvalue |= выражение | |
^= | Поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ с присваиванием | lvalue ^= выражение | |
, | Последовательное вычисление | выражение, выражение | Слева направо |