У вас вопросы?
У нас ответы:) SamZan.net

Лабораторная работа 12

Работа добавлена на сайт samzan.net: 2016-06-20

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 6.4.2025

Лабораторная работа № 12.

Тема: Графика.

Теоретические сведения.

Холст

Программа может вывести графику на поверхность формы (или компонента image), которой соответствует свойство canvas (Canvas — холст для рисования). Для того чтобы на поверхности формы или компонента image появилась линия, окружность, прямоугольник или другой графический элемент (примитив), необходимо к свойству canvas применить соответствующий метод (табл. 12.1).

Например, оператор

Forml->Canvas->Rectangle(10,10,50,50);

рисует на поверхности формы прямоугольник.

Таблица 12.1. Методы вычерчивания графических примитивов

Метод

Действие

LineTo (x,y)

Рисует линию из текущей точки в точку с указанными координатами

Rectangle(x1,y1,x2,y2)

Рисует прямоугольник, х , yl и х2, у2 — координаты левого верхнего и правого нижнего углов прямоугольника. Цвет границы и внутренней области прямоугольника могут быть разными

FillRect(xl,yl,х2,у2)

Рисует закрашенный прямоугольник, xl, yl, x2, у2 — определяют координаты диагональных углов

FrameRect(xl,yl,х2,у2)

Рисует контур прямоугольника, xl, yl, х2, у2 — определяют координаты диагональных углов

RounRect(xl,yl,x2,y2,x3,y3)

Рисует прямоугольник со скругленными углами

Ellipse(xl,yl,х2,у2)

Рисует эллипс или окружность (круг), xl, yl, х2, у2 — координаты прямоугольника, внутри которого вычерчивается эллипс или, если прямоугольник является квадратом, окружность

Polyline(points,n)

Рисует ломаную линию, pointsмассив типа TPoint. Каждый элемент массива представляет собой запись, поля х и у которой содержат координаты точки перегиба ломаной; n — количество звеньев ломаной. Метод Polyline вычерчивает ломаную линию, последовательно соединяя прямыми отрезками точки, координаты которых находятся в массиве: первую со второй, вторую с третьей, третью с четвертой и т. д

Методы вывода графических примитивов рассматривают свойство canvas как некоторый абстрактный холст, на котором они могут рисовать (Canvas переводится как "поверхность", "холст для рисования"). Холст состоит из отдельных точек — пикселов. Положение пиксела на поверхности холста характеризуется горизонтальной (X) и вертикальной (Y) координатами. Координаты возрастают сверху вниз и слева направо. Левый верхний пиксел поверхности формы (клиентской области) имеет координаты (О, О), правый нижний — (ClientWidth, ClientHeight). Доступ к отдельному пикселу осуществляется через свойство Pixels, представляющее собой двумерный массив, элементы которого содержат информацию о цвете точек холста.

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

Карандаш и кисть

Методы вычерчивания графических примитивов обеспечивают только вычерчивание. Вид графического элемента определяют свойства Реn (карандаш) и Brush (кисть) той поверхности (Canvas), на которой рисует метод.

Карандаш и кисть, являясь свойствами объекта canvas, в свою очередь представляют собой объекты Реn и Brush. Свойства объекта Реn (табл. 11.2) задают цвет, толщину и тип линии или границы геометрической фигуры. Свойства объекта Brush (табл. 11.3) задают цвет и способ закраски области внутри прямоугольника, круга, сектора или замкнутого контура.

Таблица 11.2. Свойства объекта Реn (карандаш)

Свойство

Определяет

Color

Цвет линии

Width

Толщину линии (задается в пикселах)

Style

Вид линии (psSolid - сплошная; psDash - пунктирная, длинные штрихи; psDot — пунктирная, короткие штрихи; psDashDot — пунктирная, чередование длинного и короткого штрихов; psDashDotDot пунктирная, чередование одного длинного и двух коротких штрихов; psClear— линия не отображается (используется, если не надо изображать границу области — например, прямоугольника)

Таблица 11.3. Свойства объекта Brush (кисть)

Свойство

Определяет

Color

Цвет закрашивания замкнутой области

style

Стиль заполнения области (bsSolidсплошная запивка. Штриховка: bsHorizontalгоризонтальная; bsVerticalвертикальная; bsFDiagonalдиагональная с наклоном линий вперед; bsBDlagonalдиагональная с наклоном линий назад; bsCrossв клетку; bsDiagCrossдиагональная клетка

Ниже приведена функция обработки события onPaint, которая рисует на поверхности формы олимпийский флаг.

void __fastcall TForm1::FormPaint(TObject *Sender)

{

// полотнище флага

Canvas->Pen->Width = 1;

Canvas->Pen->Color = clBlack;

Canvas->Brush->Color = clCream;

Canvas->Rectangle (30,30,150,150) ;

Canvas->Pen->Width = 2; // ширина колец

Canvas->Brush->Style = bsClear; // чтобы круг, нарисованный

//методом Ellipse, не был закрашен

//рисуем кольца

Canvas->Pen->Color = clBlue;

Canvas->Ellipse(40,40,80,80) ;

Canvas->Pen->Color = clBlack;

Canvas->Ellipse (70,40,110,80) ;

Canvas->Pen->Color = clRed;

Canvas->Ellipse (100,40,140,80) ;

Canvas->Pen->Color = clYellow;

Canvas->Ellipse (55,65,95,105) ;

Canvas->Pen->Color = clGreen;

Canvas->Ellipse (85,65,125,105) ;

}

Графические примитивы

Любая картинка, чертеж или схема могут рассматриваться как совокупность графических примитивов: точек, линий, окружностей, дуг и др. Таким образом, для того чтобы на экране появилась нужная картинка, программа должна обеспечить вычерчивание (вывод) графических элементов — примитивов, составляющих эту картинку.

Вычерчивание графических примитивов на поверхности (формы или компонента image — области вывода иллюстрации) осуществляется применением соответствующих методов к свойству Canvas этой поверхности.

Линия

Вычерчивание прямой линии выполняет метод LineTo. Метод рисует линию из той точки, в которой в данный момент находится карандаш (эта точка называется текущей позицией карандаша или просто "текущей"), в точку, координаты которой указаны в инструкции вызова метода.

Например, оператор

Canvas->LineTo(100,200)

рисует линию в точку с координатами (100, 200), после чего текущей становится точка с координатами (100, 200).

Начальную точку линии можно задать, переместив карандаш в нужную точку графической поверхности. Сделать это можно при помощи метода MoveTo, указав в качестве параметров координаты точки начала линии. Например, операторы

CanVas->MoveTo(10,10); // установить карандаш в точку (10,10)

Canvas->LineTo (50,10) ; // линия из точки (10,10) в точку (50,10)

рисуют горизонтальную линию из точки (10, 10) в точку (50, 10).

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

Canvas->MoveTo(10,10);

Canvas->LineTo(50,10);

Canvas->LineTo(10,20) ;

Canvas->LineTo(50,20);

рисуют линию, похожую на букву Z.

Ломанаялиния

Метод Polyline вычерчивает ломаную линию. В качестве параметров методу передается массив типа TPoint, содержащий координаты узловых точек линии, и количество звеньев линии. Метод Polyline вычерчивает ломаную линию, последовательно соединяя точки, координаты которых находятся в массиве: первую со второй, вторую с третьей, третью с четвертой и т. д.

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

 TPoint p[4]; // координаты начала, конца и точек перегиба 

// задать координаты точек ломаной 

 p[0].x = 100; p[0].y = 100; // начало 

p[1].x = 100; p[1].y = 150; // точка перегиба

p[2].x = 150; p[2] .y = 150; // точка перегиба

p[3].x= 150; p[3].y = 100; // конец 

Canvas->Polyline (p, 3) ; // ломаная из трех звеньев 

Метод Polyline можно использовать для вычерчивания замкнутых контуров. Для этого надо, чтобы первый и последний элементы массива содержали координаты одной и той же точки.

Прямоугольник

Метод Rectangle вычерчивает прямоугольник. В инструкции вызова метода надо указать координаты двух точек — углов прямоугольника. Например, оператор

Canvas->Rectangle(10,10,50,50)

рисует квадрат, левый верхний угол которого находится в точке (10, 10), а правый нижний в точке (50, 50).

Цвет, вид и ширину линии контура прямоугольника определяют значения свойства Реn, а цвет и стиль заливки области внутри прямоугольника -значения свойства Brush той поверхности, на которой метод рисует прямоугольник. Например, следующие операторы рисуют флаг Российской Федерации.

Canvas->Brush->Color = clWhite; // цвет кистибелый

Canvas->Rectangle(10,10,90, 30) ;

Canvas->Brush->Color = clBlue; // цвет кисти - синий

Canvas->Rectangle(10,30,90,50);

Canvas->Brush->Color = clRed; // цвет кисти красный

Canvas->Rectangle(10,50,90,70);

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

TRect rct; // прямоугольная область

rct.Top = 10;

rct.Left = 10;

rct.Bottom = 50;

rct.Right = 50;

Canvas->Rectangle(rct); // нарисовать прямоугольник

Есть еще два метода, которые вычерчивают прямоугольник. Метод f вычерчивает закрашенный прямоугольник, используя в качестве инструмента только кисть (Brush), а метод Fram t — только контур и использует только карандаш (Реn). У этих методов только один параметр — структура типа TRect. Поля структуры TRect содержат координаты прямоугольной области Значения полей структуры TRect можно задать при помощи функции Rect.

Например:

TRect rct; // область, которую надо закрасить

rct = Rect (10,10, 30, 50) ; // координаты области

Canvas->Brush->Color= clRed; // цвет закраски

Canvas->FillRect (rct);

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

Canvas->RoundRec(xl,yl,х2,у2,хЗ,уЗ)

Параметры xl, yl, x2, y2 определяют положение углов прямоугольника, а параметры хЗ и уЗ — размер эллипса, одна четверть которого используется для вычерчивания скругленного угла (рис. 11.1).

(х2,у2)

Рис. 11.1. Метод RoundRec вычерчивает прямоугольник со скругленными углами

Многоугольник

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

Canvas->Polygon(p,n);

где р — массив записей типа TPoint, который содержит координаты вершин многоугольника; n — количество вершин.

Метод Polygon чертит многоугольник, соединяя прямыми линиями точки, координаты которых находятся в массиве: первую со второй, вторую с третьей, третью с четвертой и т. д. Вид границы многоугольника определяют значения свойства Реn, а вид заливки области, ограниченной линией границы, — значения свойства Brush той поверхности, на которой метод рисует.

Ниже приведен фрагмент кода, который, используя метод Polygon, рисует ромб.

TPoint p [ 4 ] ; // четыре вершины

// координаты вершин

p[0] .x = 50; p[0].y=100;

p[1].x = 150; p[1].y=75;

p[2] .x = 250; p[2].y =100;

p[3] .x = 150; p[3].y =125;

Canvas->Brush->Color=clRed;

Canvas->Polygon(p,3);

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

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

Canvas->Ellipse(xl,yl,x2,y2)

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

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

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

Canvas->Ellipse(rec);

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

Дуга

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

Canvas->Arc(xl,yl,x2,y2,x3,уЗ,х4,у4)

Параметры xl, yi, x2, y2 определяют эллипс (окружность), частью которого является дуга. Параметры хз и уз задают начальную, а х4 и у4 — конечную точку дуги. Начальная (конечная) точка дуги — это точка пересечения границы эллипса и прямой, проведенной из центра эллипса в точку с координатами хЗ и уЗ (х4, у4). Метод Arc вычерчивает дугу против часовой стрелки от начальной точки к конечной (рис. 3.4).

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

Сектор

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

Canvas->Pie(xl,yl,x2,у2,хЗ,уЗ,х4,у4);

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

Текст

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

Canvas->TextOutA (х,у,Текст);

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

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

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

Свойство

Определяет

Name

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

Size

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

Style

Стиль начертания символов. Может быть: нормальным, полужирным, курсивным, подчеркнутым, перечеркнутым. Стиль задается при помощи следующих констант: fsBold (полужирный), fsIitalic (курсив), fsUnderline (подчеркнутый), fsStrikeOut (перечеркнутый) Свойство Style является множеством, что позволяет комбинировать необходимые стили. Например, инструкция, которая устанавливает стиль "полужирный курсив", выглядит так: Canvas->Font->Style = TFontStyles ()<<fsBold<<fsItalic

Color

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

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

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

void __fastcall TForm1::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 = TFontStyles()<< fsBold << fsItalic;

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

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

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

Canvas->Brush->Style=bsClear;// область вывода текста не закрашивать

Canvas->Font->Color=clBlack;

Canvas->TextOutA(x,y,ms); // вывести текст

}

Точка

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

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

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

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

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

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

void __fastcall TForm1::FormPaint(TObject *Sender)

{

Grafik();

}

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

void __fastcall TForm1::FormResize(TObject *Sender)

{

TRect rct = Rect (0,0,ClientWidth, ClientHeight) ;

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

Grafik ();

}

Вставим в начало модуля формы:

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

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

 float f (float x)

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

}

void TForm1::Grafik()

{

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

float y1, y2; // границы изменения значения функции 

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

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

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

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

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

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

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

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

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

b = Form1->ClientHeight-20;

// Y - координата левого нижнего угла

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

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

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

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

dx = 0.01; // шаг аргумента

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

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

x = x1 ;

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

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

do {

y = f (x);

if ( y < y1) y1 = y;

if ( y > y2 ) y2 = y; x += dx; }

while (x <= x2);

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

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

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

// оси

x0 = l+abs(x1*mx);

y0 = b-abs (y1*my) ;

Canvas->MoveTo(x0,b); Canvas->LineTo(x0,b-h);

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

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

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

// построение графика

x = x1 ;

do {

y = f (x) ;

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

x += dx;

} while (x <=x2) ;

}

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

        Рис. 11.2

После этого вычисляет координату Y горизонтальной оси, координату X вертикальной оси и вычерчивает координатные оси. Затем выполняется непосредственное построение графика (рис. 11.2).

Мультипликация

Под мультипликацией обычно понимается движущийся и меняющийся рисунок. В простейшем случае рисунок может только двигаться или только меняться.

Обеспечить перемещение рисунка довольно просто: надо сначала вывести рисунок на экран, затем через некоторое время стереть его и снова вывести этот же рисунок, но уже на некотором расстоянии от его первоначального положения. Подбором времени между выводом и удалением рисунка, а также расстояния между старым и новым положением рисунка (шага перемещения), можно добиться того, что у наблюдателя будет складываться впечатление, что рисунок равномерно движется по экрану.

Метод базовой точки

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

     Рис. 11.3

На поверхности формы находится один-единственный компонент Timer, который используется для генерации последовательности событий, функция обработки которых обеспечивает вывод и удаление рисунка.

В рассматриваемой программе вывод изображения выполняет функция ship, которая рисует на поверхности формы кораблик. В качестве параметров функция ship получает координаты базовой тонки. Базовая точка (x0,у0) определяет положение графического объекта в целом; от нее отсчитываются координаты графических примитивов, образующих объект (рис. 11.4). Координаты графических примитивов можно отсчитывать от базовой точки не в пикселах, а в относительных единицах. Такой подход позволяет легко выполнить масштабирование изображения. 

Перед тем как нарисовать кораблик на новом месте, функция обработки события от таймера стирает кораблик, нарисованный в процессе обработки предыдущего события OnTimer. Изображение кораблика стирается путем вывода прямоугольника, перекрывающего его.

int x = -68, y = 50; // начальное положение базовой точки

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

void __fastcall TForm1:: Ship (int x,int y)

{

int dx=4,dy=4; // шаг сетки

// корпус и надстройку будем рисовать

// при помощи метода Polygon

TPoint p1[7] ; // координаты точек корпуса

TPoint p2 [8] ; // координаты точек надстройки

TColor pc,bc; // текущий цвет карандаша и кисти

// сохраним текущий цвет карандаша и кисти

pc=Canvas->Pen->Color; bc=Canvas->Brush->Color;

// установим нужный цвет карандаша и кисти

Canvas->Pen->Color = clBlack; Canvas->Brush->Color = clWhite;

// рисуем корпус

p1[0] .x = x; p1[0] .y = y;

p1[1].x=x; p1[1].y = y-2*dy;

p1[2] .x = x+10*dx; p1[2] .y = y-2*dy;

p1[3].x = x+11*dx; p1[3].y = y-3*dy;

p1[4].x = x+17*dx; p1[4].y =y-3*dy;

p1[5].x = x+14*dx; p1[5].y=y;

p1[6].x = x; p1[6].y=y;

Canvas->Polygon(p1, 6) ;

// надстройка

p2[0].x = x+3*dx; p2 [0] .y = y-2*dy;

p2[1] .x = x+4*dx; p2[1].y = y;

p2[2].x = x+4*dx; p2[2].y = y-4*dy;

p2[3].x = x+13*dx; p2[3].y = y-4*dy;

p2[4].x = x+13*dx; p2[4].y = y-3*dy;

p2[5].x = x+11*dx; p2[5].y = y-3*dy;

p2[6].x = x+10*dx; p2[6].y = y-2*dy;

p2[7] .x = x+3*dx; p2[7] .y = y-2*dy;

Canvas->Polygon(p2, 7);

Canvas->MoveTo(x+5*dx,y-3*dy); Canvas->LineTo(x+9*dx,y-3*dy) ;

// капитанский мостик

Canvas->Rectangle (x+8*dx,y-4*dy,x+11*dx,y-5*dy) ;

// труба

Canvas->Rectangle (x+7*dx,y-4*dy,x+8*dx,y-7*dy) ;

// иллюминаторы 

Canvas->Ellipse(x+11*dx,y-2*dy,x+12*dx,y-1*dy);

Canvas->Ellipse(x+13*dx,y-2*dy,x+14*dx,y-1*dy);

// мачта

Canvas->MoveTo(x+10*dx,y-5*dy);

Canvas->LineTo (x+10*dx,y-10*dy) ;

// оснастка

Canvas->Pen->Color = clWhite;

Canvas->MoveTo(x+17*dx,y-3*dy);

Canvas->LineTo (x+10*dx,y-10*dy) ;

Canvas->LineTo(x,y-2*dy) ;

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

Canvas->Pen->Color = pc; Canvas->Brush->Color = bc;

}

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

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

// стереть кораблик — закрасить цветом, совпадающим

// с цветом фона (формы)

Canvas->Brush->Color = Form1->Color;

Canvas->FillRect(Rect(x-1,y+1,x+68,y-40));

// вычислить координаты базовой точки

x+=3;

if (x > ClientWidth)

{

// кораблик "уплыл" за правую границу формы

x= -70; // чтобы кораблик "выплывал" из-за левой границы формы

y=random(Form1->ClientHeight);

}

// нарисовать кораблик на новом месте

Ship (x, y) ;

}

// обработка события OnCreate для формы

void __fastcall TForm1::FormCreate(TObject *Sender)

{

// настройка и запуск таймера

Timer1->Interval = 100; // период события OnTimer -0.1 сек.

Timer1->Enabled = true; // пуск таймера

}




1. ЮЖНОУРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ национальный
2. написане- мистецтво слова
3. Компакт жиындар Тиімділік есебін ~арастырайы~- 1 н~ктесін ж~не шамасын та
4. Первое впечатление больного о враче-1
5. . Основные направления реформ экономической системы России
6. Тема- Створення комп~ютерної моделі із застосуванням шарів
7. Исследование параметрического стабилизатора напряжений
8. Курсовая работа- Бухгалтерский учет расчетов с персоналом по оплате труда
9. курица суповая;4 больших карты с цифрами- 2 0 0 Дети входят в зал под торжественную музыку их встречает Лиса
10. Философия эпохи Возрождения