- •Тема лекции: «Графический режим среды Turbo Pascal»
- •1. Краткие сведения о графическом режиме
- •Характеристики наиболее распространенных адаптеров
- •2. Подпрограммы для переключения между текстовым и графическим режимами
- •Function GraphErrorMsg(Code : Integer) : String;
- •InitGraph(Driver,Mode,’’);
- •Function GetGraphMode : Integer;
- •Procedure SetGraphMode (Mode : Integer);
- •InitGraph(Driver,Mode,’’);
- •3. Работа с координатами, точками и линиями
- •Function GetMaxX : word;
- •Procedure Rectangle (x1, y1, x2, y2 : Integer);
- •SetTextJustify (Horizontal, Vertical : Word);
- •6. Перевод мировых координат в графические
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) определяют прямоугольную область в двумерном пространстве.
Для перевода координат точки из мировой системы в систему координат графического режима можно использовать следующие процедуры:
Декартовая система координат проецируется на всю область экрана
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;
Декартовая система координат проецируется на указанную область экрана
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.