ТОП 10:

Вывод основных графических примитивов



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

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

 

void arc(int x, int y, int stangle, int endangle, int radius)

 

Выводит дугу окружности радиусом radius. Центр окружности задают ко­ординаты х, у. Аргументы stangle и endangle задают соответственно начальный и конечный углы (рис. 3.1.) выводимой дуги. Углы задаются в градусах и отсчитываются против хода часовой стрелки. Положению часовой стрелки 3 часа соответствует угол 0 градусов, 12 часов - 90 градусов, 9 часов - 180 градусов, 6 часов - 270 градусов. При задании stangle равным 0 градусов и endangle равным 359 градусов выводится полная окружность. Для вывода дуги используется текущий цвет и только сплошная линия. Толщина линии может быть задана функцией settextstyle() (1 или 3 пиксела). Текущая позиция при выводе дуги не изменяется. Функция автоматически корректирует координаты точек в соответствии с коэффициентом сжатия дисплея.

Рис. 3.1. Вывод окружностей и дуг

 

 

void bar(int left, int top, int right, int bottom)

 

Выводит полосу, заполненную текущим цветом с использованием текущей маски заполнения. Аргументы задают пиксельные координаты левого верхнего (left, top) и правого нижнего (right, bottom) углов заполняемой области экрана. Функция не выводит контур заполняемой области экрана. Координаты углов задаются относительно координат левого верхнего угла текущего графического окна.

 

void bar3d(int left, int top, int right, int bottom, int depth, int topflag)

Выводит в изометрии "столбик" и заполняет его фронтальную поверхность текущим цветом с использованием текущей маски заполнения. Аргументы задают: пиксельные координаты левого верхнего (left, top) и правого нижнего (right, bottom) углов заполняемой области экрана; "глубину "(depth) в пикселах изображаемого столбца; необходимость изображения "верхней" поверхности столбца (topflag): если topflag = 0, верхняя поверхность не отображается. Функция выводит контур "столбика", используя только непрерывную линию. Координаты углов фронтальной поверхности задаются относительно координат левого верхнего угла текущего графического окна.

 

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

 

Выводит окружность заданного аргументом radius радиуса с центром, за­данным координатами х и у. Координаты центра определяются относительно координат левого верхнего угла текущего графического окна. Для вывода ок­ружности используется текущий цвет и только сплошная линия. Толщина линии (но не стиль!) может быть задана функцией settextstyle() (1 или 3 пиксела).

 

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

Область экрана внутри окружности может быть заполнена функцией floodfill() по текущей маске с использованием текущего цвета.

 

void drawpoly(int numpoints, int polypoints[])

 

"Соединяет" отрезками прямых линий текущего цвета и стиля точки (полигон), координаты которых заданы парами значений. Эти пары расположены в массиве, на который указывает polypoints[] . Аргумент numpoints задает число соединяемых между собой точек. Координаты точек задаются относительно координат левого верхнего угла текущего графического окна. Текущая позиция не изменяется. Для получения замкнутых ломаных линий необходимо задать равными первую и последнюю точки выводимого полигона. Область экрана внутри полигона может быть заполнена с использованием текущего цвета и стиля заполнения функцией fillpoly().

 

void ellipse (int x, int y, int stangle, int endangle, int xradius, int yradius)

 

Выводит эллиптическую дугу или полный эллипс, используя текущий цвет. Аргументы задают (рис. 3.2): пиксельные координаты центра эллипса (х, у); начальный угол дуги (stangle); конечный угол дуги (endangle); радиус эллипса по горизонтали (xradius); радиус эллипса по вертикали (yradius). Функция выводит контур дуги или полный эллипс, используя непрерывную линию. Координаты центра задаются относительно координат левого верхнего угла текущего графического окна. Толщина линии (но не стиль!) может быть задана равной 1 или 3 пикселам функцией settextstyle(). Углы задаются в гра­дусах и измеряются против хода часовой стрелки. Положению часовой стрелки 3 часа соответствует угол 0 градусов, 12 часов - 90 градусов, 9 часов - 180 градусов, 6 часов - 270 градусов. При задании stangle равным 0 градусов и endangle равным 359 градусов выводится полный эллипс. Текущая позиция при выводе дуги не изменяется. Функция автоматически корректирует коор­динаты точек в соответствии с коэффициентом сжатия дисплея. Область экрана внутри эллипса может быть заполнена (фун-кцией floodfill() или fillellipse() по текущей маске с использованием текущего цвета.

 

Рис. 3.2. Вывод эллиптических примитивов

 

void fillellipse(int x, int y, int xradius, int yradius)

 

Выводит эллипс, заполненный текущим стилем. Аргументы функции задают (см. рис. 3.2.): пиксельные координаты центра эллипса (х, у); радиус эллипса по горизонтали (xradius); радиус эллипса по вертикали (yradius). Функция выводит контур эллипса текущим цветом, устанавливаемым функцией setcolor(). Координаты центра задаются относительно координат левого верхнего угла текущего графического окна. Текущая позиция при выводе эллипса не изменяется. Функция автоматически корректирует координаты точек в соответствии с коэффициентом сжатия дисплея. Цвет и маска заполнения могут быть заданы с помощью функций setfillpattern() и setfillstyle().

При выполнении операции заполнения функция использует внутренний буфер библиотеки графики Turbo С для хранения промежуточных результатов. Если объем буфера будет недостаточным, функция установит в -6 внутренний код ошибки. Этот код доступен программе через обращение к функции graphresult().

 

void fillpoly(int numpoints, int *polypoints)

 

Выводит контур полигона, заданного numpoints точками. Координаты точек заданы парами, расположенными в массиве, на который ссылается polypoints. Функция соединяет первую и последнюю точки и заполняет область внутри полигона текущим стилем. Функция выводит контур полигона текущим цветом, устанавливаемым функцией setcolor(). Координаты точек задаются относительно координат левого верхнего угла текущего графического окна. Текущая позиция не изменяется. Цвет и маска заполнения могут быть заданы с помощью функций setfillpattern() и setfillstyle().

При выполнении операции заполнения функция использует внутренний буфер библиотеки графики для хранения промежуточных результатов. Если объем буфера будет недостаточным, функция установит в -6 внутренний код ошибки. Этот код доступен программе через обращение к функции graphresult().

 

void floodfill (int x, int y, int border)

 

Заполняет текущим стилем область экрана, ограниченную непрерывной линией с цветом border, начиная с точки с координатами (х, у). Функция заполняет область либо внутри замкнутой линии, либо вне ее. Это зависит от положения начальной точки: если она лежит внутри области, заполняется внутренняя область; если точка лежит вне замкнутой области, заполняется внешняя область; если точка лежит точно на линии цвета border, заполнение не производится. Заполнение начинается с начальной точки и продолжается во всех направлениях, пока не встретится пиксел с цветом border. Цвет border должен отличаться от цвета заполнения, в противном случае будет заполнен весь экран. Цвет и маска заполнения могут быть заданы с помощью функций setfillpattern() и setfillstyle().

 

void pieslice( int x, int y, int stangle, int endangle, int radius)

 

Выводит контур кругового сектора и заполняет его внутреннюю область текущим стилем. Контур образован круговой дугой радиусом radius с координатами центра (х, у), проведенной, начиная от угла stangle до угла endangle, и радиусами, соединяющими центр с концевыми точками дуги. Дуга контура выводится текущим цветом, устанавливаемым функцией setcolor() всегда сплошной линией. Толщина (но не стиль!) дуговой линии равна 1 или 3 пикселам и задается функцией setlinestyle(). Стиль линии радиусов может быть любым и управляется функцией setlinestyle(). Особенностью рассматриваемой функции является то, что при задании любого другого стиля линии, отличного от сплошной линии (параметр linestyle в функции setlinestyle(), не равный 0), дуга сектора становится невидимой. Цвет и маска заполнения могут быть заданы с помощью функций setfillpattern() и setfillstyle().

При выполнении операции заполнения функция использует внутренний буфер библиотеки графики для хранения промежуточных результатов. Если объем буфера будет недостаточным, функция установит в -6 внутренний код ошибки. Этот код доступен программе через обращение к функции graphresult(). Углы stangle и endangle выводимой дуги задаются в градусах и измеряются против хода часовой стрелки. Положению часовой стрелки 3 часа соответствует угол 0 градусов, 12 часов - 90 градусов, 9 часов - 180 градусов, 6 часов - 270 градусов. При задании stangle равным 0 градусов и endangle равным 359 градусов выводится полная окружность.

 

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

 

Выводит контур прямоугольника, заданного координатами левого верхнего (left, top) и правого нижнего (right, bottom) углов. Координаты углов задаются относительно координат левого верхнего угла текущего графического окна. Контур выводится линией текущего цвета и стиля. Цвет контура может быть установлен функцией setcolor(). Стиль линии может быть выбран или задан функцией setlinestyle().

 

void sector(int x, int y, int stangle, int endangle, int xradius, int yradius)

 

Работает аналогично функции pieslice(), за исключением того, что выводится не круговая, а эллиптическая дуга. Аргумент xradius задает радиус эллипса по горизонтали, a yradius - радиус эллипса по вертикали. При выводе сектора учитывается коэффициент сжатия, и эллиптическая дуга на экране геометрически корректна.

 

Перечисленными функциями исчерпывается список функций для вывода основных графических примитивов. Дополнительные графические примитивы могут быть построены из стандартных средств С++.

3.9. Предварительная подготовка к работе

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

2. Ознакомиться с графическим режимом отображения информации на экран монитора и стандартными библиотечными функциями C, обслуживающими этот режим.

 

Порядок выполнения работы

1. Разработать программу для вывода на экран графика заданной функции.

 

Номер Функция Диапазон аргумента
Начало Конец
Sin2(x/2)+Sqrt(x) 3π/2 15π
Sin3(x/2)+Sqrt(x) 3π/2 16π
Sin2(x/4)+Sqrt(x) 3π/2 17π
Cos2(x/2 ) +Sqrt (x ) 3π/2 18π
Cos3(x/2)+Sqrt(x) 3π/2 15π
Cos2(x/4)+Sqrt(x) 3π/2 16π
Sin2(x)- Cos2(x) 3π/2
Sin3(x)+ Cos2(x) 3π/2
Sin2(x)+ Cos3(x) π/2
Sin3(x)+ Cos3(x) π/2
Sin2(x)- Cos2(x) π/2
Sin3(x)- Cos2(x) π/2
Sin2(x)- Cos3(x) π/2
Sin3(x)- Cos3(x) π/2
Sin2(x/2)-Sqrt(x) π/2 13π
Sin3(x/2)-Sqrt(x) π/2 12π
Sin2(x/4)-Sqrt(x) π 11π
Cos2(x/2)-Sqrt(x) π 10π
Cos3(x/2)-Sqrt(x) π
Cos2(x/4)-Sqrt(x) π

 

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

3. Найти максимальное значение функции на заданном интервале и вывести в отдельное окно на экране.

Содержание отчета

1. Краткие сведения о видеосистемах ПЭВМ, графическом режиме их работы и функциях обслуживания графического режима.

2. Алгоритмы и тексты отлаженных программ.

3. Выводы.

 

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

1. Зачем нужен графический режим?

2. Почему в видеосистеме используют и текстовый, и графический режимы?

3. Можно ли обойтись только графическим режимом? Если да, то какие характеристики должна при этом иметь ПЗВМ?

4. Как влияет размер видеопамяти на характеристики графического режима?

5. Зачем нужен видеоадаптер в графическом режиме?

6. Назовите основные характеристики графического режима, чем они обусловлены?

7. Существуют ли окна в графическом режиме? Зачем они нужны?

8. Какие функции инициализации графического режима Вы знаете?

9. Какие функции обслуживания графических окон Вы знаете?

10. Есть ли курсор в графическом режиме? Если да, то как можно им управлять?

11. Что такое пиксел? Зачем нужен атрибут пикселя?

12. Какие функции работы с пикселями Вы знаете?

13. Сколько цветов фона и символов можно одновременно ис­пользовать в графическом режиме и почему?

14. Какие функции установки цветов Вы знаете?

15. Что называется графическим примитивом и какие функции обслуживания графических примитивов Вы знаете?

 

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







Последнее изменение этой страницы: 2016-06-06; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.205.93.2 (0.01 с.)