Здавалка
Главная | Обратная связь

Лабораторная работа № 1



А. Д. Шишкин, Е.А.Чернецова

 

 

ПРАКТИКУМ

по учебной дисциплине

“Компьютерная графика”

 

 

САНКТ-ПЕТЕРБУРГ

УДК 681.327:327

 

Шишкин А.Д., Чернецова Е.А. Практикум по учебной дисциплине “Компьютерная графика”.Изд.2, переработанное- Санкт-Петербург, РГГМУ, 2007.-60 с.

 

В лабораторный практикум по дисциплине ”Компьютерная графика” включены лабораторные работы по основным разделам этой дисциплины, читаемой на кафедре “Морские информационные технологии”. Лабораторные работы ориентированы на приобретение навыков студентами построения геометрических двух – и трехмерных объектов, сложных полигонов, позволяющим создавать реалистические изображения на экране персонального компьютера. Работы ориентированы на использование языка Си, графического пакета Borland C++ и Borland C++ Builder 6.

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

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

 

 

ã Российский государственный гидрометеорологический университет (РГГМУ)

 

Содержание

 

 

Предисловие
Введение в графику Borland С++
Работа № 1. Растровая графика линейных объектов
Работа № 2.Растровая графика объектов в среде Borland С++ Builder 6
Работа № 3. Растровая графика двухмерных графических объектов
Работа № 4. Применение рекурсии для построения графических объектов
Работа № 5. Формирование перспективных изображений
Работа № 6. Построение полигонов сложной формы
Литература
Приложение
   

 

 

Предисловие

 

Практикум содержит семь лабораторных работ и подготовлен в соответствии с программой дисциплины “Основы компьютерной графики”. Его цель - закрепить у студентов теоретические знания, полученные в лекционном курсе, путем создания и реализации программ построения двухмерных и более сложных трехмерных объектов. Каждая лабораторная работа включает в себя описание работы, необходимые для ее выполнения теоретические сведения, краткие методические указания и фрагменты программ. Расположение лабораторных работ идет по мере нарастания сложности изображаемых геометрических картинок. На этих примерах студент может найти описание реализаций принципов программирования, которые могут оказаться полезными при решении реальных задач.

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

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

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

Компьютер может выполнить любые рисованные картинки, если мы можем проинструктировать компьютер, как их сделать. К сожалению, последнее утверждение является не исключением, а правилом. Большинство компьютерных пользователей не могут заставить программу вычертить ту картинку, которую они хотят иметь, даже, если они затратили массу денег на приобретение сложного программного обеспечения. Необходимо примириться с тем обстоятельством, что пользователь должен иметь навыки программирования на каком - либо языке.

Для сознательного и достаточно эффективного овладения необходимым набором базовых рецептов машинной графики необходимы два условия[1]:

-определенные навыки работы с каким-нибудь языком программирования достаточно высокого уровня и

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

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

Некоторых пояснений требует выбор используемого в лабораторных работах языка программирования. В принципе для написания программ может использоваться любой язык программирования. Лабораторные работы ориентированы на применение языка Си не только по тому, что он достаточно распространен и на нем написано достаточно большое количество программ по машинной графике, но главным образом из-за его высокого качества и компактности. (Одна строка программы на языке Си может соответствовать десяти строкам на языке Бейсик).

Программирование на языке Си требует аккуратности. Логические ошибки на языке Си приводят к синтаксическим ошибкам значительно реже, чем, например, на языке Паскаль. Но логические ошибки в программе на языке Си могут привести к неправильным результатам или к выводу сообщений о технических ошибках, которые могут оказаться совершенно непонятными. Другими словами, ошибки могут привести к непредсказуемым результатам.

В компиляторе Турбо Си фирмы Borland International имеется широкий набор графических подпрограмм, позволяющих создавать двух и трехмерные графические изображения. Поэтому, прежде, чем приступить к описанию лабораторных работ, далее приводится краткое описание графики Borland C++[2].

Для помощи студентам при выполнении некоторых работ в Приложении приведен ряд отлаженных программ на языке Си, работающих в пакетах Turbo C, в Borland C++ for Windows и С++ Builder 6.

 

Введение в графику Borland C++

 

На экране IBM-совместимого компьютера может устанавливаться как текстовый режим, так и графический. Управление экраном в графическом режиме производится с помощью набора функций, прототипы которых находятся в заголовочном файле GRAPHICS.H[2]. Там же объявлены константы и макросы. Файл GRAPHICS.H должен быть подключен с помощью директивы #include препроцессора языка Си ко всем модулям, использующим графические подпрограммы.

Так же как и в текстовом режиме, все графические функции оперируют окнами. В терминологии Borland C++ окно называется viewport. Отличие графического окна от текстового состоит в том, что левый верхний угол окна имеет координаты (0,0),а не (1,1). По умолчанию графическое окно занимает весь экран.

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

void far initgraph( int far *driver, int far *mode,char far *path);

В состав графического пакета входят заголовочный файл GRAPHICS.H,

библиотечный файл GRAPHICS.LIB, драйверы графических устройств (*.BGI) и символьные шрифты (*.CHR).

Функция initgraph() считывает в память соответствующий драйвер, устанавливает видеорежим, соответствующий аргументу mode, и определяет маршрут к директории, в которой находится соответствующий драйвер *.BGI.

Если маршрут не указан, то предполагается, что этот файл располагается в текущей директории.

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

 

DETECT Автоматическая установка режима наибольшего графического разрешения
CGA  
MCGA  
EGA  
EGA64  
EGAMONO  
IBM8514  
HERCMONO  
ATT400  
VGA  
PC3270  
CURRENT_DRIVER -1  

 

При использовании initgraph() можно указать или конкретный драйвер, или задать автоматическое определение (детектирование) типа видеоадаптера и выбора соответствующего драйвера уже во время выполнения программы (макрос DETECT). Это позволяет переносить без изменения программы на компьютеры с другими видеоадаптерами. Значение mode должно быть одним из перечисленных в табл.1.

Чтобы выйти из графического режима и вернуться в текстовый режим необходимо использовать функции

void far closegraph(void);

и void restorecrtmode(void);

Функция closegraph() используется, если программа дальше будет работать в текстовом режиме. Эта функция освобождает память, используемую графическими функциями, и устанавливает текстовый режим, который был до вызова функции initgraph(). Если программа завершает работу, то можно использовать функцию

restorecrtmode(), которая устанавливает видеоадаптер в текстовый режим, который предшествовал первому вызову функции initgraph().

 

Таблица 1

 

Драйвер Значение Разрешение Палитра Количество страниц
CGACO 320х200
CGAC1 320х200
CGAC2 320х200
CGAC3 320х200
CGAHI 640х200  
MCGAC0 320х200
MCGAC1 320х200
MCGAC2 320х200
MCGAC3 320х200
MCGAMED 640х320  
MCGAHI 320х350  
EGALO 640х200 16 цветов
EGAHI 640х350 16 цветов
EGA64LO 640х200 16 цветов
EGA64HI 640х350 4 цвета
EGAMONOHI 640х200
HERCMONOHI 720х348  
ATT400C0 320х200
ATT400C1 320х200
ATT400C2 320х200
ATT400C3 320х200
ATT400MED 640х400  
ATT400H1 640х200  
VGALO 640х200 16 цветов
VGAMED 640х350 16 цветов
VGAHI 640х480 16 цветов
PC3270HI 720х350  
IBM8514LO 640х480 256 цветов  
IBM8514HI 1024х768 256 цветов  

 

Тип видеоадаптера определяет, какое количество цветов и какие цвета могут быть использованы в графическом режиме. Наибольшая разница существует между адаптерами СGA и EGA. Количество цветов приведено так же в табл.1.

Видеоадаптер CGA имеет четыре цвета в палитре и четыре палитры. Это значит, что на экране одновременно может быть четыре разных цвета. Цвета нумеруются от 0 до 3. Чтобы выбрать палитру, установите режим CGACx, где х-номер палитры. Цвет с номером 0 всегда совпадает с цветом фона. В качестве фона могут использоваться шестнадцать цветов с номерами от 0 до 15. Соответствие цвета и номера показано в табл.2. В режиме CGAHI может быть только два цвета, один из которых черный цвет фона. Для цветов, так же как и в текстовом режиме, определены макросы, приведенные в табл.2.

В режиме EGA одновременно могут использоваться 16 цветов из 64 цветов, причем каждый из элементов палитры может быть задан пользователем. Палитра CGA по умолчанию соответствует цветам CGA, однако в файле GRAPHICS.H определены константы, которые содержат соответствующие цветам аппаратные значения.

 

Таблица 2

CGA Номер EGA/VGA Номер
BLACK EGA _BLACK
BLUE EGA _BLUE
GREEN EGA _GREEN
CYAN EGA _CYAN
RED EGA _RED
MAGENTA EGA _MAGENTA
BROWN EGA _BROWN
LIGHTGRAY EGA _LIGHTGRAY
DARK BLACK EGA _DARK BLACK
LIGHTBLUE EGA _LIGHTBLUE
LIGHTGREEN EGA _LIGHTGREEN
LIGHTCYAN EGA _LIGHTCYAN
LIGHTRED EGA _LIGHTRED
LIGHTMAGENTA EGA _LIGHTMAGENTA
YELLOW EGA _ YELLOW
WHITE EGA _ WHITE

 

Что касается цветов, то драйвер VGA работает так же, как и драйвер EGA, но только имеет более высокое разрешение.

Установка цвета фона производится функцией

void far setbkcolor(int color);

а изменение палитры - функцией

void far setpalette(int index,int color);

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

Напомним, что графический экран представляет собой массив пикселей.

Каждый пиксель соответствует одной точке на экране и может иметь свой цвет. Установить цвет пикселя в точке экрана с координатами (x, y)можно с помощью функции

void far putpixel(int x,int y, int color);

Основными “рисующими “ функциями являются line() и circle(). Их прототипы-

void far line(int x,int y,int x1,int y1);

void far circle(int x,int y,int radius);

Функция line() чертит на экране прямую линию от точки с координатами (x, y) до точки с координатами (x1,y1) текущим цветом.

Функция circle() рисует на экране окружность с центром в точке с координатами (x, y) и радиусом radius (единица измерения - пиксель) так же текущим цветом. По умолчанию текущий цвет устанавливается WHITE. (Обратите внимание, что все макросы пишутся прописными буквами). Изменить текущий цвет, т.е. цвет, которым рисуются линии, можно обратившись к функции setcolor() с прототипом

void far setcolor(int color);

К другим “рисующим “функциям относятся:

arc() - рисует дугу окружности;

drawpoly() -рисует контур многоугольника;

ellipse() -рисует эллипс;

linerel() -рисует линию из текущей точки в точку, задаваемую относительным расстоянием;

lineto() -рисует линию из текущей точки в точку с координатами (x, y);

moveto() - перемещает текущую точку в точку с координатами (x, y);

rectangle() - рисует прямоугольник;

setaspectratio() -изменяет коэффициент сжатия, установленный по умолчанию;

setlinestyle() - устанавливает ширину и стиль линии.

В качестве примера описания прототипа приведем прототип функции rectangle()

void far rectangle( int left, int top, int right, int bottom);

Для закрашивания (заполнения) замкнутого контура служит функция floodfill(), которая закрашивает область заданным цветом по заданному шаблону. Ее прототип-

void far floodfill(int x,int y,int bordecolor);

где x и y-координаты точки внутри контура, bordecolor-цвет контура. Цвет и шаблон заполнения устанавливается функцией

voi far setfillstyle (int pattern,int color);

Вид шаблона закрашивания и соответствующие ему макрос и значение (pattern) приведены в табл.3

 

Таблица 3

 

Макрос Значение Вид шаблона
EMPTY_FILL Заполнение цветом фона
SOLD_FILL Сплошное заданным цветом
LINE_FILL Линиями __________
LSTLASH_FILL Косыми линиями ///
SLASH_FILL Яркими косыми линиями //
BKSLASH_FILL Обратными косыми линиями \\
LTBKSLASH_FILL Яркими обратными косыми линиями \\
HATCH_FILL Светлая штриховка сеткой
XHATCH_FILL Крестообразная штриховка
INTERLEAVE_FILL Перекрестная штриховка
WIDE_DOT_FILL Заполнение редкими точками
CLOSE_DOT_FILL Заполнение частыми точками
USER_FILL   Шаблон заполнения, определяемый пользователем

 

Есть так же набор функций, которые чертят контур и закрашивают область внутри контура:

bar() - заполненный прямоугольник;

bar3d() -заполненный столбик;

fillelipse() -заполненный эллипс;

fillpoly() -заполненный многоугольник;

pieslice() -заполненный сектор круга;

sector() -заполненный эллиптический сектор.

Прототипы этих функций их применение и особенности использования можно посмотреть с помощью HELP-системы оболочки Borland C++.

Перечислим еще некоторые функции графической библиотеки системы Borland C++.

setfillpattern()- задает шаблон ,определяемый пользователем;

getfillpattern()- возвращает тип шаблона заполнения;

getfillsetting() - возвращает информацию о шаблоне и цвете заполнения;

getlinesetting()- возвращает информацию о текущем стиле, толщине и цвете

линии;

getpixel() - сообщает о цвете пикселя в точке (x, y).

В начале мы упомянули о графических окнах, но предположили, что окно совпадает со всем экраном. Создать меньшее графическое окно можно используя функцию setviewport(). Ее прототип-

void far setviewport( int left,int top,int right, int bottom,int flag);

параметры left,top, right, bottom задают местоположение и размеры окна в абсолютных координатах, т.е. координатах экрана. Параметр flag устанавливает режим выхода за границу окна. Если flag не нулевой, то происходит автоматическое прерывание выдачи при выходе за границу окна. В противном случае может происходить выход за границу окна. И в том и другом случае ошибка не фиксируется.

Для работы с экраном, окнами и образами (image) служат следующие функции:

cleardevice() - очищает активную страницу;

setactivpage() - устанавливает номер активной страницы;

setvisualpage() - устанавливает номер видимой страницы;

clearviewport() - очищает активное окно;

getviewsetting() - возвращает информацию об активном окне;

getimage() - записывает образ в заданный участок памяти;

imagesize() - определяет в байтах размер памяти, требуемый для хранения информации о прямоугольной области экрана;

putimage() - помещает на экране ранее записанный в памяти образ.

Функция cleardevice() очищает весь экран, устанавливает текущей точкой левый верхний угол экрана, но оставляет неизменными все установки графического экрана, стиль линии, текущий цвет и т.д.

Функция clearviewport() очищает текущее окно и устанавливает текущую точку в левый верхний угол окна.

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

Для создания движения образа по заданному шаблону на экране служат функции getimage() imagesize() и putimage(): с помощью функции getimage() взять часть экранного образа, вызвать imagesize() для определения размера памяти, необходимой для хранения этого образа, а затем вернуть его на экран в любую желаемую позицию с помощью функции putimage().

Наконец, для осуществления вывода текста в графическом режиме на экран используются функции:

outtext() - выводит строку на экран с текущей позиции;

outtextxy() - выводит строку на экран с заданной позиции;

settextjustify() - устанавливает режим выравнивания текста;

setusercharsize() - устанавливает шрифт, стиль и коэффициент увеличения текста;

textheight() - возвращает высоту строки в пикселах;

textwith() - возвращает ширину строки в пикселах.

Прототипы этих функций выглядят следующим образом:

void far outtext (char far*textstring);

void far outtextxy(int x, int y, char far *textstring);

Обычно (без применения функции settextjustify) “начальная точка“ располагается в верхнем левом углу первого символа.

В текстовом режиме форма символов на экране определяется частью технических средств, носящей название генератор символов, так что мы можем изменить их очертание. В графическом режиме символы формируются просто из набора точек. В этом случае любой желаемый шрифт может быть реализован в принципе с помощью программных средств. В графическом пакете языка Турбо Си существует несколько разных шрифтов. Если размер шрифта не задан пользователем, то по умолчанию каждый символ располагается в прямоугольнике 8х8 пикселов. При изображении текста в графическом режиме нет таких средств, как автоматический переход к началу следующей строки при заполнении предыдущей строки, поэтому нам всегда потребуется проверять, достаточно ли места для отображения строки в пределах границ окна. При выполнении этой операции необходимо быть предельно внимательным, чтобы не перепутать количество символов и количество пикселов. Здесь нам могут оказать помощь две функции Турбо Си, объявленные в файле GRAPHICS.H следующим образом:

int far textwidth(char far*textstring);

int far textheight (char far*textstring);

Эти функции возвращают числа, определяющие количество пикселов, занимаемых текстовой строкой, заданной переменной textstring в горизонтальном и вертикальном направлениях. Например, если X_max и Y_max определяют максимальные значения по осям X и Y соответственно, то текстовую строку “АВС” можно изобразить точно в нижнем правом углу следующим образом:

outtextxy(X_max+1-textwidth(“ABC”), Y_max+1-textheight (“ABC”),”ABC”);

Так, если применяется графический адаптер типа Геркулес, то для первого и для второго аргументов в этом обращении будут вычислены значения:

719+1-3х8=696 и

347+1-8=340 соответственно.

Если для прикладной задачи недостаточно только одного типа шрифта и размера, то можно использовать функцию Турбо Си:

void far settextstyle(int font,int direction,int charsize);

Фактически именно в таком виде эта функция объявлена в файле GRAPHICS.H. Первый аргумент font может принимать значения из целочисленных значений 0,1,2,3,4 со следующим смыслом:

 

 

Значение Символическая константа Тип шрифта
DEFAULT_FONT по умолчанию
TRIPLEX_FONT триплекс
SMALL_FONT малый
SANS_SERIF_FONT сансериф
GOTIC_FONT готический

Если в программу не включается обращение к функции settextstyle, то выбирается шрифт по умолчанию, (т.е. font= DEFAULT_FONT). Символы при этом шрифте формируются из отдельных точек. При других типах шрифтов символы строятся из штрихов, т.е. из отрезков прямых линий.

В качестве значений для второго аргумента direction могут применяться следующие символические константы:

 

Значение Символическая константа Направление

0 HORIZ_DIR Горизонтальное

1 VERT_DIR Вертикальное

 

По умолчанию принимается значение HORIZ_DIR. Если задано значение

VERT_DIR, то текстовая строка вычерчивается в вертикальном положении, как бы повернутой против часовой стрелки на 90 градусов.

Третий аргумент charsize определяет размер символов. Задавая значения i=1,2,.... 10, можно управлять размером символов. При charsize= i символы, состоящие из точек, будут занимать на экране прямоугольник размером 8ix8i пикселов. Если используются символы, изображаемые штрихами, то имеется возможность более гибкого управления размером символов. В этом случае для параметра charsize, третьего аргумента функции settextstyle, задается значение 0- для этого в файле GRAPHICS.H определяется символическая константа USER­_CHAR_SIZE=0.

Теперь можно применить функцию setusercharsize ,объявленную как

void far setusercharsize(int multx,int divx,intmulty, int divy);

Параметры multx,divx,multy,divy используются для масштабирования ширины и высоты символов: ширина по умолчанию масштабируется в отношении multx:divx, а высота по умолчанию- в отношении multy:divy. Например, чтобы получить текст в три раза шире и в два раза с половиной выше, чем по умолчанию, можно задать значения:

multx =3 divx=1

multy =5 divy=2.

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

void far settextjustify(int horiz, int vert);

где оба аргумента могут иметь значения 0,1,2,для которых могут быть использованы следующие символические константы:

 

Значение Символическая константа Назначение

0 LEFT_TEXT_BOTTOM_TEXT слева, снизу

1 CENTER_TEXT по центру

2 RIGHT_TEXT_TOP_TEXT справа, сверху

Приведем пример использования шрифтов в Турбо Си. Строка Turbo C отображается вертикально с типом шрифта “триплекс”.

/* FONTDEMO */

/*Демонстрация использования шрифта в графическом режиме*/

#include <graphics.h>

main()

{ int dY,XC;

initgr();

settextjustify(CENTER_TEXT,CENTER_TEXT);

settextstyle(TRIPLEX_FONT,VERT_DIR,3);

outtextxy(XC,dY,”Turbo C”);

endgr();

}

Во время работы программы могут возникать ошибки при выполнении графических операций. Для обработки ошибок, чтобы избежать аварийного прекращения работы программы, служат функции:

graphresult() -возвращает код ошибки выполнения последней графической операции;

grapherrormsg()-возвращает строку с сообщением об ошибке по заданному коду ошибки.

Если произошла ошибка при вызове графической библиотечной функции, устанавливается внутренний код ошибки. Функция graphresult() возвратит код ошибки, а вызов функции grapherrormsg(graphresult()) выдаст сообщение об ошибке. В следующем фрагменте программы приводится рекомендуемый способ инициализации графического режима (с комментариями)

/*Запрос автоопределения максимально возможного режима работы

видеоадаптера*/

int driver=DETECT, gmode, errorcode;

/*инициализация графики */

initgraph(& graphdriver, &gmode,””);

/*получение результата инициализации*/

errorcode= graphresult();

if(errorcode !=grOk) /*если произошла ошибка*/

{

printf(“Ошибка:% s\n”, grapherrormsg(errorcode));

printf( “Для останова нажмите любую клавишу \n”);

getch();

exit(1); /* Завершение работы программы*/

}}

В табл.4 приведены три сообщения об ошибках, их коды и макросы

 

Таблица 4

Код Макрос Сообщение об ошибке
grOK No error
grNoInitGraph BGI graphics not installed (use initgraph use )
grNoLoadMem Not enoph memory to load driver

 

Особенности работы в пакете С++ Builder 6

Графический редактор С++ Builder позволяет создавать картинки из графических примитивов или иллюстрации. В отличие от среды Borland C++ for Windows, которая требует хорошего знания языков программирования, С++ Builder 6 ориентирован на, так называемую, «быструю разработку». В ее основе лежит технология визуального проектирования и событийного программирования, суть которой заключается в том, что среда разработки берет на себя большую часть работы по генерации кода программы, оставляя программисту работу по конструированию диалоговых окон и написанию функций обработки событий.

Среда С++ Builder может вывести графический объект на поверхность формы (Form 1) или компонента (Image). Работа над новым проектом начинается с создания стартовой формы- главного окна программы, которой соответствует свойство Canvas-холст для рисования. Для того, чтобы на поверхности формы или компонента появился графический примитив необходимо к свойству Canvas применить соответствующий метод.

Например, вывод на поверхность формы прямоугольника с координатами (10,10,50,50) организуется записью

 

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

 

Холст для рисования Canvas состоит из отдельных точек – пикселов. Координаты пикселов нумеруются сверху – вниз и слева – направо. Левый верхний пиксел формы (клиентской области) имеет координаты (0,0), правый нижний- (ClientWidth, ClientHeight). Доступ к отдельному пикселу осуществляется через свойство Pixels [x][y], где x,y-координаты пиксела. Используя свойство Pixels, можно задать цвет любой точки графической поверхности. Например, инструкция

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

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

Размер графической формы Canvas определяется точками: Pixels [0][0]- левый верхний угол и Pixels [ClientWidth-1][ ClientHeight-1- нижний правый угол. Вид поверхности формы 1 представлен на рис.В.1.

 

 

 

Рисунок В.1-Основная форма

Вид графического объекта определяются двумя методами рисования:

· Pen- карандаш;

· Brush – кисть.

Карандаш и кисть являются свойствами объекта Canvas. Свойства объекта Pen задают цвет, толщину и тип линии или границы геометрической фигуры. Свойства объекта Brush задают цвет и способ закраски области внутри прямоугольника, круга, сектора, замкнутого контура.

Любая картинка или схема могут рассматриваться как совокупность графических примитивов: точек, линий, окружностей, дуг и т.д., следовательно, программа должна обеспечивать вычерчивание этих графических примитивов. Вычерчивание примитивов осуществляется методами. Например, для вычерчивания линии от точки курсора до координат (x,y) применяется метод LineTo(x,y). А для перемещения карандаша без вычерчивания линии метод MoveTo(x,y). При этом запись будет выглядеть следующим образом

 

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

Canvas -> LineTo(50,60); // рисовать линию из точки (10,10) в точку (50, 60).

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

Canvas -> MoveTo(10,10);

Canvas -> LineTo(50,50);

Canvas -> LineTo(10,50);

Canvas -> LineTo(10,10);

рисуют треугольник.

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

 

Пример 1. Фрагмент кода рисует ломаную линию, состоящую из трех звеньев.

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,4); // ломаная из трех звеньев

 

Очевидно, что, если координаты начальной и конечной точек совпадают, то получим замкнутый контур.

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

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

рисует квадрат, левый угол которого находится в точке (10,10), а правый нижний в точке (50,50). Цвет, вид и ширину линии контура прямоугольника определяют свойства Pen, а цвет и стиль заливки области внутри прямоугольника-значения свойcтва 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, поля которой определяют положение диагональных углов прямоугольной плоскости.

Пример 2. Фрагмент программы вычерчивания прямоугольника со структурой.

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

rct.Top=10;

rct. Left =10;

rct.Bottom =50;

rct. Right =50;

Canvas -> Rectangle(rct);

Закрашенные прямоугольники рисуются методом FillRect, где в качестве инструмента используется только кисть. В качестве параметра метода используется структура типа TRect. Поля структуры можно так же задать при помощи функции Rect.

Пример 3. Фрагмент программы вычерчивания прямоугольника со структурой

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

rct = Rect (10,10,50,50);

Canvas -> Brush->Color=clBlue;

Canvas -> FillRect(rct);

Для вычерчивания прямоугольника со скругленными углами используется метод RoundRect. Вызов метода выглядит следующим образом:

Canvas -> RoundRect (x1,y1,x2,y2,x3,y3);

Параметры x1,y1,x2,y2 определяют положение углов прямоугольника, а параметры x3,y3 – размер эллипса для вычерчивания скругленного угла.

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

Canvas -> Polygon(p,n);

где p-массив записей типа TPoint[n], который содержит координаты вершин многоугольника,

n- количество вершин.

Вид границы многоугольника определяют значений свойства Pen, а вид заливки внутренней области – значения свойства Brush той поверхности, на которой метод рисует.

Пример 4.Фрагмент программы вычерчивания ромба

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(x1,y1,x2,y2);

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

Параметры в метод Ellipse можно передать так же по структуре Trect, аналогичной структуре, приведенной в примере 3.

Метод Arc рисует дугу, являющуюся частью эллипса или окружности. Запись метода следующая:

Canvas-> Arc(x1,y1,x2,y2, x3,y3,x4,y4);

Параметры x1,y1,x2,y2 определяют эллипс (окружность), частью которого является дуга. Параметры x3 и y3 задают начальную, а x4 и y4- конечную точку дуги. Вычерчивание дуги производится против часовой стрелки. Для создания сектора эллипса или круга используется метод Pie. Инструкция вызова метода аналогична Arc

Canvas-> Pie(x1,y1,x2,y2, x3,y3,x4,y4);

за исключением того, что прорисовывается часть эллипса или окружности, кроме дуги, заключенной между точками x3,y3,x4,y4.

На поверхность графического объекта может быть выведен текст в виде строки типа AnsiString. Это обеспечивается методом TextOutA, инструкция записи которого записывается следующим образом:

Canvas -> TextOutA(x, y, текст);

Параметры x, y определяют координаты точки графической поверхности, от которой выполняется вывод текста. Вид шрифта, его размер и цвет определяются значением свойства Tfont, а размеры области вывода текста – методом TextWidth (ширина) и методом TextHeight (высота). Типы шрифтов определяются свойством Name. Их типы аналогичны, приведенным в MSWord.

Пример 5. Вывод текста

AnsiString ms= “Borland C++ Builder”; //строка вывода

Canvas-> Font -> Name= “Times New Roman”; //тип шрифта

Canvas-> Font ->Size = 24; //размер (высота) шрифта

Canvas-> Font -> Color = clBlack; //цвет текста

Canvas -> TextOutA(20,30, ms); //вывод текста в точке с координатами 20,30.

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

Canvas -> TextOutA(20,50, “Borland C++ Builder”);

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

В последнем случае текст будет выведен с точки остановки курсора (карандаша).

Более подробно с возможностями графического редактора C++ Builder 6 можно ознакомиться в [3].

При выполнении работ пользователь может на выбор использовать любой пакет. Все программы, приведенные в Приложении, написаны на языке Си. Однако, для использования пакета C++ Builder 6 они так же могут использоваться с необходимыми изменениями.

Для вывода графического объекта на печать необходимо кнопкой PrtScr перекинуть его в буфер компьютера и, открыв программу Paint, вставить рисунок. Отредактированный рисунок дожжен быть помещен в отчет вместе с листингом программы.


Лабораторная работа № 1







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.