- •Введение
- •Лабораторная работа №1. Создание простого приложения
- •1 ) Последовательность действий по созданию интерфейса пользователя
- •2) Последовательность действий по программированию щелчка по командным кнопкам (программирование событий):
- •3) Компиляция и выполнение приложения
- •1) Последовательность действий по созданию интерфейса пользователя
- •2) Последовательность действий по программированию событий
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Лабораторная работа №2. Циклические программы. Многострочное поле memo
- •1) Последовательность действий по созданию интерфейса пользователя
- •2) Последовательность действий по программированию щелчка по командным кнопкам (программирование событий)
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Лабораторная работа №3. Работа с одномерными массивами
- •1) Последовательность действий по созданию интерфейса пользователя
- •2) Последовательность действий по программированию событий
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Лабораторная работа № 4. Работа с двумерными массивами
- •Контрольные вопросы
- •Лабораторная работа № 5. Процедуры и функции в delphi
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Лабораторная работа № 6. Рекурсивные процедуры и функции
- •Контрольные вопросы
- •Лабораторная работа №7. Разработка приложения с несколькими модулями
- •2) Последовательность действий по программированию событий
- •Лабораторная работа №8. Работа со строками
- •1) Последовательность действий по созданию интерфейса пользователя
- •2) Последовательность действий по программированию событий
- •3) Откомпилируйте приложение и проверьте его работу задания для самостоятельной работы
- •Контрольные вопросы
- •Лабораторная работа №9. Создание текстового редактора
- •Задание для самостоятельной работы
- •Контрольные вопросы
- •Лабораторная работа № 10. Методы простой сортировки
- •Задание для самостоятельной работы
- •Контрольные вопросы
- •Лабораторная работа № 11. Поиск данных в массиве
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Лабораторная работа №12. Работа с файлами
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Лабораторная работа №13. Работа с типизированными файлами (файлы записей)
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Лабораторная работа № 14. Динамические структуры данных . Стек и очередь
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Лабораторная работа № 15. Практическое применение стека и очереди
- •Лабораторная работа №16. Линейные списки
- •Лабораторная работа №17. Работа с бинарными деревьями поиска
- •Задание для самостоятельной работы
- •Лабораторная работа №18. Основы объектно-ориентированного программирования
- •Задание для самостоятельной работы
- •Лабораторная работа №19. Графика в delphi. Компоненты shape и chart
- •Контрольные вопросы
- •Лабораторная работа №20. Графика в delphi. Рисование по пикселам и пером
- •Контрольные вопросы
- •Лабораторная работа № 21. Вычисление суммы ряда
- •Литература
- •Содержание
- •214013 Г. Смоленск, Энергетический проезд, 1
Контрольные вопросы
Графические возможности Delphi
Компонент Shape, свойства и методы
Компонент Chart, свойства и методы.
Лабораторная работа №20. Графика в delphi. Рисование по пикселам и пером
ЦЕЛЬ РАБОТЫ: Освоение графических возможностей Delphi: рисование по пикселам и с помощью пера Pen.
ПОДГОТОВКА К РАБОТЕ:
Изучить возможности свойства Canvas компонентов Form, Image и т.д.
Изучить методы рисования графиков пером и по пикселам.
ЗАДАНИЕ 1. Построить график функции y=sin(x) по пикселам, Xmin = 0, Хmах = 4π (2 периода в радианах), Ymin = -1, Ymax = 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;
Откомпилируйте приложение и проверьте его работу. Результат представлен на рис. 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;
Откомпилируйте приложение и проверьте его работу