logo search
Курсовые / Лабораторная работа20-25

Окружность и эллипс

Нарисовать эллипс или окружность (частный случай эллипса) можно при помощи метода Ellipse. Инструкция вызова метода в общем виде выглядит следующим образом:

Canvas->Ellipse(xl,yl,x2,у2)

Параметры x1, y1, x2, y2 определяют координаты прямоугольника, внутри которого вычерчивается эллипс или, если прямоугольник является квадратом, — окружность (рис. 22.3).

Рис. 22.3. Значения параметров метода Ellipse определяют вид геометрической фигуры

Вместо четырех параметров — координат диагональных углов прямоугольника - методу Ellipse можно передать один - объект типа TRect. Следующий фрагмент кода демонстрирует использование объекта TRect в качестве параметра метода Ellipse.

TRect rec = Rect(10,10,50,50);

Canvas->Ellipse(rec);

Как и в случае вычерчивания других примитивов, вид контура эллипса (цвет, толщину и стиль линии) определяют значения свойства Реn, а цвет и стиль заливки области внутри эллипса — значения свойства Brush той поверхности (Сanvas), на которой метод чертит.

Дуга

Метод Arc рисует дугу — часть эллипса (окружности). Инструкция вызова метода в общем виде выглядит так:

Canvas->Arc(xl,yl,х2,у 2,х3,у3, х4,у4);

Параметры x1, y1, х2, у2 определяют эллипс (окружность), частью которого является дуга. Параметры х3 и у3 задают начальную, а х4 и у4 — конечную точку дуги. Начальная (конечная) точка дуги — это точка пересечения границы эллипса и прямой, проведенной из центра эллипса в точку с координатами х3 и у3(х4, у4). Метод Arc вычерчивает дугу против часовой стрелки от начальной точки к конечной (рис. 22.4).

Цвет, толщина и стиль линии, которой вычерчивается дуга, определяются значениями свойства Реn поверхности (Canvas), на которую выполняется вывод.

Рис. 22.4. Значения параметров метода Arc определяют дугу как часть эллипса (окружности)

Сектор

Метод pie вычерчивает сектор эллипса или круга. Инструкция вызова метода в общем виде выглядит следующим образом:

Canvas->Pie(x1,y1,х2,у2,х3,у3,х4,у4);

Параметры x1, y1, x2, y2 определяют эллипс (круг), частью которого является сектор; х3, у3, х4 и у4 — прямые — границы сектора. Начальная точка границ совпадает с центром эллипса. Сектор вырезается против часовой стрелки от прямой, заданной точкой с координатами (х3, у3), к прямой, заданной точкой с координатами (х4, у4) (рис. 22.5).

Рис. 22.5. Значения параметров метода Pie определяют сектор как часть эллипса (окружности)

Текст

Вывод текста (строк типа Ansistring) на поверхность графического объекта обеспечивает метод TextOutA. Инструкция вызова метода TextoutA в общем виде выглядит следующим образом:

Canvas->TextOutA(x,y,TeKCT);

Параметр текст задает выводимый текст. Параметры х и у определяют координаты точки графической поверхности, от которой выполняется вывод текста (рис. 22.6).

Рис. 22.6. Координаты области вывода текста

Шрифт, который используется для вывода текста, определяется значением свойства Font соответствующего объекта canvas. Свойство Font представляет собой объект типа TFont. В табл. 22.4 перечислены свойства объекта TFont, определяющие характеристики шрифта, используемого методом TextoutA для вывода текста.

Таблица 22.4. Свойства объекта TFont

Свойство

Определяет

Name

Используемый шрифт. В качестве значения следует использовать название шрифта (например, Arial)

Size

Размер шрифта в пунктах (points). Пункт— это единица измерения размера шрифта, используемая в полиграфии. Один пункт равен 1/72 дюйма

Style

Стиль начертания символов. Может быть: нормальным, полужирным, курсивным, подчеркнутым, перечеркнутым. Стиль задается при помощи следующих констант: fsBold (полужирный), fsltalic (курсив), fsUnderline (подчеркнутый), fsStrikeOut (перечеркнутый)

Свойство style является множеством, что позволяет комбинировать необходимые стили. Например, инструкция, которая устанавливает стиль "полужирный курсив", выглядит так:

Canvas->Font->Style = TFontStyles ( ) <<fsBold<<f sUnderline

Color

Цвет символов. В качестве значения можно использовать константу типа TColor

При выводе текста весьма полезны методы Textwidth и TextHeight, значениями которых являются соответственно ширина и высота области вывода текста, которые, очевидно, зависят от характеристик используемого шрифта. Обоим этим методам в качестве параметра передается строка, которую предполагается вывести на поверхность методом TextoutA.

Следующий фрагмент кода демонстрирует использование методов, обеспечивающих вывод текста на поверхность формы. Приведенная функция обработки события OnPaint закрашивает верхнюю половину окна белым, нижнюю — голубым цветом, затем в центре окна, по границе закрашенных областей, выводит текст (рис. 22.7).

void _fastcall TForml::FormPaint(TObject *Sender)

{

AnsiString ms = "Borland C++Builder";

TRect aRect;

int x,y;//точка, от которой будет выведен текст

// в верхнюю половину окна красим белым

aRect = Rect(0,0,ClientWidth,ClientHeight/2);

Canvas->Brush->Color = clWhite;

Canvas->FillRect(aRect);

// нижнюю половину окна красим голубым

aRect = Rect(0,ClientHeight/2,ClientWidth,ClientHeight);

Canvas->Brush->Color = clSkyBlue;

Canvas->FillRect(aRect);

Canvas->Font->Name = "Times New Roman";

Canvas->Font->Size = 24;

//Canvas->Font->Style=FontStyles()<<fsBold<< fsItalic;

// текст разместим в центре окна

х = (ClientWidth - Canvas->TextWidth(ms)) /2;

у = ClientHeight/2 - Canvas->TextHeight(ms) /2;

Canvas->Brush->Style=bsClear;//область вывода

// текста не закрашивать

Canvas->Font->Color = clBlack;

Canvas->TextOutA(x,y,ms);

// вывести текст

}

Рис. 22.7. Вывод текста

Иногда требуется вывести какой-либо текст после сообщения, длина которого во время разработки программы неизвестна. В этом случае необходимо знать координаты правой границы области выведенного текста. Координаты правой границы текста, выведенного методом TextOutA, можно получить, обратившись к свойству penPos.

Следующий фрагмент кода демонстрирует возможность вывода строки текста при помощи двух инструкций TextOutA:

Canvas->TextOutA(10,10,"Borland ");

Canvas->TextOutA(Canvas->PenPos.x, Canvas->PenPos.y, "C++Builder");

Точка

Поверхности, на которую программа может осуществлять вывод графики, соответствует объект Canvas. Свойство Pixels, представляющее собой двумерный массив типа TColor, содержит информацию о цвете каждой точки графической поверхности. Используя свойство pixels, можно задать цвет любой точки графической поверхности, т. е. "нарисовать" точку. Например, инструкция

Canvas->Pixels[10][10] = clRed;

окрашивает точку поверхности формы в красный цвет.

Размерность массива pixels определяется реальным размером графической поверхности. Размер графической поверхности формы (рабочей области, которую также называют клиентской) определяют свойства clientwidth и clientHeight, а размер графической поверхности компонента image — свойства Width и Height. Левой верхней точке рабочей области формы соответствует элемент pixels[0][0], а правой нижней —

Pixels[Ciientwidth - 1][CliientHeight -1].

Следующая программа (листинг 22.1), используя свойство Pixels, строит график функции у=2 sin(x) e*/5. Границы диапазона изменения аргумента функции являются исходными данными. Диапазон изменения значения функции вычисляется во время работы программы. На основании этих данных программа вычисляет масштаб, позволяющий построить график таким образом, чтобы он занимал всю область формы, предназначенную для вывода графика. Для построения графика используется вся доступная область формы, причем если во время работы программы пользователь изменит размер окна, то график будет выведен заново с учетом реальных размеров окна.

Листинг 22.1. График функции

// обработка события OnPaint

void__fastoall TForml::FormPaint(TObject *Sender)

{

Grafik();

}

// обработка события OnResize

void __fastcall TForml::FormResize(TObject *Sender)

{

TRect ret = Rect(0,0,Ciientwidth,CiientHeight);

Canvas->FillRect(ret); // стереть Grafik();

}

#include "math.h" // для доступа к sin и exp

// функция, график которой надо построить

float f(float х)

{

return 2*sin(x)*exp(x/5);

}

void TForml::Grafik()

{

float xl,x2;//границы изменения аргумента

// функции

float yl, y2; // границы изменения значения

// функции

float x;

// аргумент функции

float у; // значение функции в точке х

float dx; // приращение аргумента

int l,b;// левый нижний угол области

//вывода графика

int w,h;//ширина и высота области вывода графика

float mx, my; // масштаб по осям X и Y

int x0, у0; // начало координат

// область вывода графика

l-10; // X - координата левого верхнего угла

b = Form1->ClientHeight-20; // Y — координата

//левого нижнего угла

h = Form1->ClientHeight-40; // высота

w = Form1->Wldth - 20; // ширина

x1 = 0; // нижняя граница диапазона аргумента

х2 = 25; // верхняя граница диапазона аргумента dx = 0.01;

//шаг аргумента

// найдем максимальное и минимальное значение

// функции на отрезке [x1,x2]

x = x1;

y1 = f(х); // минимум

у2 = f(x); // максимум

do

{

у = f(х);

if ( у < y1) y1 = у;

if ( у > у2) у2 = у;

х += dx;

} while (x <= х2);

// вычислим масштаб

my = (float)h/abs(y2-y1); // масштаб по оси Y

mx = w/abs(x2-x1); // масштаб по оси X

// оси

х0 = 1+abs(x1*mx);

у0 = b-abs(y1*my);

Canvas->MoveTo(x0,b);

Canvas->LineTo(xO,b-h);

Canvas->MoveTo(l,y0);

Canvas->LineTo(l+w,y0);

Canvas->TextOutA(x0+5,b-h,FloatToStrF(y2,ffGeneral,6,3));

Canvas->TextOutA(xO+5,b,FloatToStrF(yl,ffGeneral, 6,3));

// построение графика x = xl; do {

У = f (x);

Canvas->Pixels[x0+x*mx][y0-y*my] = clRed;

x += dx;

}

while (x <= x2);

}

Основную работу выполняет функция Grafik (ее объявление надо поместить в раздел private объявления формы в заголовочном файле программы). Функция Grafik сначала вычисляет максимальное (у2) и минимальное (yi) значение функции на отрезке [x1, x2]. Затем, используя информацию о ширине и высоте области вывода графика, она вычисляет коэффициенты масштабирования по осям X и Y. После этого вычисляет координату Y горизонтальной оси, координату X вертикальной оси и вычерчивает координатные оси. Затем выполняется непосредственное построение графика (рис. 22.8).

Рис. 3.8. График, построенный по точкам

Вызов функции Grafik выполняют функции Обработки событий OnPaint и OnResize. Функция TForm1:: Formpaint обеспечивает вычерчивание графика после появления формы на экране в результате запуска программы, а также после появления формы во время работы программы — например, в результате удаления или перемещения других окон, полностью или частично перекрывающих окно программы. Функция TForm1: :FormResize обеспечивает вычерчивание графика после изменения размера формы.

Приведенная программа универсальна. Заменив инструкции в теле функции f (х), можно получить график другой функции. Причем независимо от вида функции ее график будет занимать всю область, предназначенную для вывода. Следует обратить внимание на то, что приведенная программа работает корректно, если функция, график которой надо построить, принимает как положительные, так и отрицательные значения. Если функция во всем диапазоне только положительная или только отрицательная, то в программу необходимо внести изменения. Какие — пусть это будет упражнением для читателя.