Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЯВУ.doc
Скачиваний:
6
Добавлен:
12.11.2019
Размер:
1.51 Mб
Скачать

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

  1. Графические возможности Delphi

  2. Компонент Shape, свойства и методы

  3. Компонент Chart, свойства и методы.

Лабораторная работа №20. Графика в delphi. Рисование по пикселам и пером

ЦЕЛЬ РАБОТЫ: Освоение графических возможностей Delphi: рисование по пикселам и с помощью пера Pen.

ПОДГОТОВКА К РАБОТЕ:

  1. Изучить возможности свойства Canvas компонентов Form, Image и т.д.

  2. Изучить методы рисования графиков пером и по пикселам.

ЗАДАНИЕ 1. Построить график функции y=sin(x) по пикселам, Xmin = 0, Хmах = 4π (2 периода в радианах), Ymin = -1, Ymax = 1.

ПОРЯДОК ВЫПОЛНЕНИЯ:

  1. Начните новый проект, поместите на него компонент Image и кнопку «Нарисовать», в обработчик события OnClick запишите программный код:

var X,Y:real; PX,PY:longint;

begin

for PX:=0 to Image1.Width do

begin

//x - координата, соответствующаяпикселю с координатой РХ

X:=PX*4*Pi /Image2.Width; Y:=Sin(X);

//PY - координата пикселя, соответствующая координате Y

PY:=trunc(Image1.Height-(Y+1)*Image1.Height/2);

{Устанавливается черный цвет выбранного пикселя (0 яркости)}

Image1.Canvas.Pixels[PX,PY] := 0;

end;

end;

  1. Откомпилируйте приложение и проверьте его работу. Результат представлен на рис. 20.1 в его левой части.

ЗАДАНИЕ 2. Построить тот же график функции y=sin(x) пером, Xmin = 0, Хmах = 4π (2 периода в радианах), Ymin = -1, Ymax = 1.

Порядок выполнения:

Откройте прежний проект, добавьте на него еще один компонент Image и размес­тите компоненты так, как показано выше на рис. 20.1. Размеры обоих компонентов Image должны быть абсолютно одинаковы, так как на этом для экономии размера кода основана программа, которую мы напишем. Сделать размеры компонентов абсолютно одинаковыми легко, выделив их оба и воспользовавшись командой всплывающего меню Size.

Затем в уже написанный обработчик щелчка на кнопке добавьте перед началом цикла оператор Image2.Canvas.MoveTo(0,Image2.Height div 2);

который переводит перо в начало координат второго графика - на левый край кан­вы в середину ее высоты. А перед заключительным end цикла добавьте оператор Image2.Canvas.LineTo(PX,PY);

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

var

X,Y:real;

PX,PY:longint;

begin

Image2.Canvas.MoveTo(0,Image2.Height div 2);

for PX:=0 to Image2.Width do

begin

X:=PX * 4 *Pi/Image2.Width;

Y:=Sin(X);

PY:=trunc(Image2.Height- (Y +1)*Image2.Height/2);

Image2.Canvas.Pixels[PX,PY]:=0;

//Проводится линия на втором графике

Image2.Canvas.LineTo(PX,PY);

end;

end;

З АДАНИЕ 3. Используя перо (Pen) нарисовать фигуры, приведенные на рисунке 20..2.

Параметры основных методов для изображения графических примитивов, приведены в таблице 20.1.

Таблица 20.1 Параметры методов для изображения графических примитивов

Метод

Описание

procedure Arc(X1, Yl, X2, Y2, ХЗ, Y3, Х4, Y4 : Integer);

Чертит дугу эллипса в охватывающем прямоугольнике (X1,Yl) - (X2.Y2). Начало дуги лежит на пересечении эллипса и луча, проведенного из его центра в точку (X3,Y3), а конец — на пересечении с лучом из центра в точку (X4,Y4). Дуга чертится против часовой стрелки (см. ниже)

Продолжение таблицы 20.1

Метод

Описание

procedure Chord(XI, Yl, X2, Y2, ХЗ, Y3, X4, Y4: Integer);

Чертит сегмент эллипса в охватывающем прямоугольнике (XI,Yl) - (X2.Y2). Начало дуги сегмента лежит на пересечении эллипса и луча, проведенного из его центра в точку (X3.Y3), а конец — на пересечении с лучом из центра в точку (Х4 ,Y4). Дуга сегмента чертится против часовой стрелки, а начальная и конечная точки дуги соединяются прямой (см. ниже)

procedure

DrawFocusRect (const Rect: TRect);

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

procedure Ellipse

(XI, Yl, X2, Y2: Integer);

Чертит эллипс в охватывающем прямоугольнике (XI,Y1) -(X2.Y2). Заполняет внутреннее пространство эллипса текущей кистью

procedure FillRect (const Rect: TRect);

Заполняет текущей кистью прямоугольную область Rect, включая ее левую и верхнюю границы, но не затрагивая правую и нижнюю границы

procedure FloodFill (X, Y: Integer; Color: TColor; FillStyle: TFillstyle);

Производит заливку канвы текущей кистью. Заливка начинается с точки (X,Y) и распространяется во все стороны от нее. Если FillStyle=fsSurf асе, заливка распространяется на все соседние точки с цветом Color. Если FillStyle=fsBorder, наоборот, заливка прекращается на точках с этим цветом

procedure FrameRect (const Rect: TRect);

Очерчивает границы прямоугольника Rect текущей

кистью толщиной в 1 пиксел без заполнения внутренней части прямоугольника

procedure LineTo(X, Y: Integer);

Чертит линию от текущего положения пера до точки (X,Y)

procedure MoveTo(X, Y: Integer);

Перемещает перо в положение (X,Y) без вычерчивания линий

Продолжение таблицы 20.1

procedure Pie (X1,

Yl, X2, Y2, X3, Y3, X4, Y4: LongInt);

Рисует сектор эллипса в охватывающем прямоугольнике (X1,Y1) - (X2,Y2). Начало дуги лежит на пересечении эллипса и луча, проведенного из его центра в точку (X3,Y3), а конец — на пересечении с лучом из центра в точку (X4,Y4), Дуга чертится против часовой стрелки. Начало и конец дуги соединяются прямыми с ее центром (см. ниже)

procedure Polygon (Points: array of TPoint);

Вычерчивает пером многоугольник по точкам, заданным в массиве Points. Конечная точка соединяется с начальной, и многоугольник заполняется кистью. Для вычерчивания без заполнения используйте метод Polyline

procedure Polyline (Points: array of TPoint);

Вычерчивает пером ломаную прямую по точкам, заданным в массиве Points

procedure Rectangle (X1, Yl, X2, Y2: Integer);

Вычерчивает и заполняет прямоугольник (X1,Y1) -(X2,Y2). Для вычерчивания без заполнения используйте метод FrameRect или Polyline

procedure Refresh;

Устанавливает в канве умалчиваемые шрифт, перо и кисть

procedure RoundRect (X1, Yl, X2, Y2, X3, Y3: Integer);

Вычерчивает и заполняет прямоугольник (X1,Yl) - (X2.Y2) со скругленными углами. Прямоугольник (X1,Y1) -(X3,Y3) определяет дугу эллипса для скругления углов (см. ниже)

procedure TextOut(X, Y: Integer; const Text: String);

Выводит текстовую строку Text так, чтобы левый верхний угол прямоугольника, охватывающего текст, располагался в точке (X,Y)

procedure TextRect (Rect: TRect; X, Y: Integer; const Text: String);

Выводит текстовую строку Text так, чтобы левый верхний угол прямоугольника, охватывающего текст, располагался в точке (X,Y). Если при этом какая-либо часть надписи выходит из границ прямоугольника Rect, она отсекается и не будет видна

На рисунке 20.3 показаны параметры обращения к методам Arc, Chord, Pie и RoundRect.

Текст программного кода, который поможет понять методы, осуществляющие рисование фи­гур:

with Image1.Canvas do

begin

Font.Style:=[fsBold]; Arc (10, 10, 90, 90, 90,50, 10,50) ; TextOut (40,60, 'Arc');

Chord (110,10,190,90,190,50,110,50); TextOut (135,60,'Chord');

Ellipse (210,10,290,50); TextOut (230,60,'Ellipse');

Pie (310,10,390,90,390,30,310,30); TextOut (340,60,'Pie');

PolyGon ([Point(30,150), Point (40,130),Point (50,140), Point (60,130),Point(70,150)]);

TextOut (30,170,'PolyGon');

PolyLine ([Point (130,150), Point (140,130), Point (150,140), Point (160,130),

Point (170,150)]); TextOut (130,170,'PolyLine');

Rectangle (230,120,280,160); TextOut (230,170,'Rectangle');

RoundRect (330,120,380,160,20,20) ; TextOut (325, 170, 'RoundRect');

end;

Откомпилируйте приложение и проверьте его работу