Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция по графическому режиму.doc
Скачиваний:
5
Добавлен:
21.02.2016
Размер:
115.2 Кб
Скачать

Procedure Rectangle (x1, y1, x2, y2 : Integer);

4. Опрос и установка цветов пера и фона

Различные адаптеры поддерживают разное количество цветов, выводимых одновременно на экран в графическом режиме. Но для всех BGI-драйверов оно ограничено в диапазоне 0..15.

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

Procedure SetColor(Color : Word);

Цвет фона может быть изменен процедурой SetBkColor:

Procedure SetBkColor(Color : Word);

Для опроса текущих установок цвета предусмотрены функции GetColor и GetBkColor:

Function GetColor : Word;

Function GetBkColor : Word;

5. Вывод текста

Для вывода текста служат процедуры OutText и OutTextXY. Текст выводится в соответствии с установленным стилем и выравниванием:

OutText(Text:String)– выводит на экран текст Text относительно позиции текущего указателя;

OutTextXY(x,y:Integer;TextString:String)– выводит строку относительно координат точки (x, y).

Для установки стиля текста используется процедура SetTextStyle:

Procedure SetTextStyle(Font,Direсtion : Word; Size: Word);

Font – номер шрифта,

Для указания кода шрифта можно использовать следующие константы:

Const

DefaultFont = 0; {матричный шрифт 8х8 (по умолчанию)}

TriplexFont = 1; {полужирный шрифт}

SmallFont = 2; {светлый шрифт (тонкое начертание)}

SansSerifFont = 3; {книжная гарнитура (рубленный шрифт)}

GothicFont = 4; {готический шрифт}

Direсtion – код направления текста (по умолчанию принимается горизонтально). Возможны лишь две ориентации текста: HorizDir = 0, VertDir = 1 – константы, обозначающие горизонтальное и вертикальное расположение текста.

Size – код размера шрифта, диапазон изменения параметра составляет от 1 до 10.

Шрифты могут не поддерживать кириллицу!

Для задания выравнивания текста относительно текущего указателя используется процедура SetTextJustify:

SetTextJustify (Horizontal, Vertical : Word);

Параметры могут принимать одно из трех значений:

Const

{Для горизонтального ориентирования (Horizontal)}

LeftText = 0; { координата Х задает левый край строки }

CenterText = 1; { координата Х задает середину строки }

RightText = 2; { координата Х задает правый край строки }

{Для вертикального ориентирования (Vertical)}

BottomText = 0; { координата Y задает нижний край строки }

CenterText = 1; { координата Y задает середину строки }

TopText = 2; { координата Y задает верхний край строки }

Текстовые процедуры GotoXY, Write/WriteLn и установки цвета текста в графическом режиме работают только, если переменная CRT.DirectVideo равна False (или модуль CRT не подключен). Ввод текста через Read/ReadLn действует всегда, при этом текст стирает фоновое изображение.

6. Перевод мировых координат в графические

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

0 <= grx <= GetMaxX

0 <= gry <= GetMaxY

Мировая система координат или декартовая система координат является независимой от типа устройства отображения. Для точки (x,y) выполняются условия:

xmin < x < xmax

ymin < y < ymax

точки (xmin, ymin) и (xmax, ymax) определяют прямоугольную область в двумерном пространстве.

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

  1. Декартовая система координат проецируется на всю область экрана

function getgrx(x:real):integer;

begin

getgrx:=round(GetMaxX/(maxx-minx)*(x-minx));

end;

function getgry(y:real):integer;

begin

getgry:=round(GetMaxY)/(maxy-miny)*(y-miny));

end;

  1. Декартовая система координат проецируется на указанную область экрана

function getgrx(x:real):integer;

begin

getgrx:=round((grmaxx-grminx)/(maxx-minx)*(x-minx))+grminx;

end;

function getgry(y:real):integer;

begin

getgry:=round((grmaxy-grminy)/(maxy-miny)*(y-miny))+grminy;

end;

где minx, maxx – минимальное и максимальное значение координаты х в декартовой системе координат;

miny, maxy – минимальное и максимальное значение координаты y в декартовой системе координат

grminx, grmaxx – минимальное и максимальное значение координаты х в графической системе координат;

grminy, grmaxy – минимальное и максимальное значение координаты y в графической системе координат

Пример. Написать программу для построения графика функции y(x)=a*sin(x). Построение графика осуществлять в заданной области экрана. Нарисовать оси координат.

{Программа выполняет построение графика функции y=a*sin(x).}

program grafic;

uses crt,graph;

var

grminx,grminy, { графические границы области }

grmaxx,grmaxy : integer; { построения графика }

a, { число в уравнении функции }

stepx, { шаг изменения x}

minx,miny, { физические границы области }

maxx,maxy : real; { построения графика }

s : string; { для ввода чисел с клавиатуры}

ercode : integer; { код ошибки при преобразовании строки в число}

{Процедура инициализации графического режима. Возвращает true - графический режим инициализирован; при возникновении ошибки - false}

function grinit:boolean;

var

grdriver, {графический адаптер}

grmode, {графический режим}

ercode :integer; {код ошибки}

begin

grinit := True;

grdriver:= Detect;

initgraph(grdriver,grmode,''); { инициализация графики}

ercode:=graphresult; { результат инициализации}

if ercode<>grok then

begin

writeln('ошибка графики:',grapherrormsg(ercode));

writeln('программа остановлена. ');

grinit := False;

end;

end;

{Функция перевода физического значения х в графическое x(в пикселы).

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

график функции.}

function getgrx(x:real):integer;

begin

getgrx:=round((grmaxx-grminx)/(maxx-minx)*(x-minx))+grminx;

end;

{Функция перевода физического значения y в графическое y(в пикселы).

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

график функции.}

function getgry(y:real):integer;

begin

getgry:=round((grmaxy-grminy)/(maxy-miny)*(y-miny))+grminy;

end;

{Функция вычисления значения функции при аргументе х}

function f(a:real; x:real):real;

begin

f:=a*sin(x);

end;

{Процедура вычисления минимального и максимального значений функций

на заданном отрезке [minx,maxx] по оси х.

Функция возвращает значения:

miny - минимальное значение;

maxy - максимальное значение;}

procedure GetMaxMinY(var miny : real; var maxy : real);

var

x,y : real; {физические значения х и функции y(x)}

begin

{вычисление минимального и максимального значений функции}

miny := f(a,minx);

maxy := f(a,minx);

x := minx+stepx;

repeat

y:=f(a,x);

if y<miny then miny:=y;

if y>maxy then maxy:=y;

x:=x+stepx;

until x>maxx;

end;

{Рисование осей OX и OY графика

Для расчета используются следующие данные:

minx,maxx,miny,maxy - физические значения минимума и

максимума х и y(x)}

procedure DrawAxes;

var

s : string; {название графика функции}

axisx, axisy : integer; {графические координаты осей}

begin

{определение координат осей ОХ и OY}

axisx := grminx;

axisy := grminy;

{Рисование оси ОХ}

setcolor(white);

line(getgrx(minx)-20,axisy,getgrx(maxx)+20,axisy);

{Рисование стрелки по оси ОХ}

moveto(getgrx(maxx)+20,axisy);

linerel(-10,2);

linerel(3,-2);

linerel(-3,-2);

linerel(10,2);

{Рисование подписи оси ОХ}

outtextxy(getgrx(maxx)+15,axisy-10,'x');

{Рисование оси ОY}

line(axisx,getgry(miny)+20,axisx,getgry(maxy)-20);

{Рисование стрелки по оси ОY}

moveto(axisx,getgry(maxy)-20);

linerel(2,10);

linerel(-2,-3);

linerel(-2,3);

linerel(2,-10);

{Рисование подписи оси ОY}

outtextxy(axisx-15,getgry(maxy)-10,'y');

{Вывод названия графика функции}

str(a:4:2,s);

s := ' y(x)='+s+'*sin(x)) - синусоида';

outtextxy(GetMaxX div 2 - 100 ,GetMaxY-25,s);

end;

{Функция рисования графика функции с шагом stepx.

Для рисования используются следующие данные:

minx,maxx - физические значения минимума и максимума х}

procedure DrawGraphic;

var

first : boolean; {признак рисования первой точки на графике}

grx,gry : integer; {графич. координаты (x,y) (в пикселах)}

x,y : real; {физические координаты точки (x,y)}

begin

{Задание цвета графика функции}

setcolor(LightBlue);

first:=true;

x:=minx;

{Цикл рисования графика функции}

repeat

y:=f(a,x);

{получение граф. координат точки (x,y)}

grx:=getgrx(x);

gry:=getgry(y);

if first then

begin {рисование первой точки на графике}

moveto(grx,gry);

putpixel(grx,gry,getcolor);

first:=false;

end {рисование линии о текущей точки к точке (grx,gry)}

else lineto(grx,gry);

x:=x+stepx; {переход к следующей точки на графике}

until x>maxx;

end;

BEGIN

clrscr;

repeat

repeat

writeln('Введите минимальное значение х (в радианах) -> ');

readln(s);

val(s,minx,ercode);

if (ercode <> 0) then

writeln('Ошибка при вводе минимального значения х!');

until (ercode=0);

repeat

writeln('Введите максимальное значение х (в радианах) -> ');

readln(s);

val(s,maxx,ercode);

if (ercode <> 0) then

writeln('Ошибка при вводе максимального значения х!');

until (ercode=0);

if (minx>=maxx) then

writeln('Минимальное значение х должно быть меньше максимального!');

until (minx<maxx);

repeat

writeln('Введите значение коэффициента а -> ');

readln(s);

val(s,a,ercode);

if (ercode <> 0) then

writeln('Ошибка при вводе коэффициента а!');

until (ercode=0);

if (grinit) then {вызов процедуры инициализации графического режима}

begin

grminx:=48; {задание минимального х для окна графика}

grmaxx:=getmaxx-48; {задание максимального х для окна графика}

grminy:=getmaxy-48; {задание минимального у для окна графика}

grmaxy:=24; {задание максимального у для окна графика}

stepx:=(maxx-minx)/150; {шаг изменения аргумента x}

GetMaxMinY(miny,maxy); {вычисление минимального и максимального y}

DrawAxes; {рисование осей графика}

DrawGraphic; {рисование графика функции}

readkey;

closegraph; {закрытие графического режима}

end;

END.

12