- •Работа с графикой в паскале
- •Основные функции и процедуры модуля Crt, используемые для работы с экраном
- •Управление цветом и фоном
- •Очистка экрана и управление строками на экране
- •Управление яркостью
- •Управление курсором
- •Текстовые окна
- •Задержка изображения на экране
- •Символы псевдографики
- •Работа с текстом в графическом режиме
- •Создание анимации
- •Варианты заданий
Работа с текстом в графическом режиме
Для вывода текста используются растровый шрифт, символы которого определяются матрицей размером 8х8, и несколько векторных шрифтов (символы описываются набором векторов). Преимущество векторных шрифтов заключается в том, что при изменении размера символов их изображения не искажаются. Рекомендуется для вывода мелких надписей использовать растровый шрифт, для крупных символов ‑ векторный шрифт.
Каждый векторный шрифт хранится в виде отдельного файла, имеющего расширение .chr. Файлы со шрифтами должны находиться в одном каталоге с использующей их программой. В стандартном наборе шрифтов Турбо Паскаля нет русских символов.
Масштабирование и выбор шрифта производится с помощью процедуры SetTextStyle, информацию об установке режима графического текста можно получить с помощью процедуры GetTextSettings. Используемые в этих процедурах константы приведены в таблице.
Константа |
Значение |
Описание |
DefaultFont TriplexFont SmallFont SansSerifFont GothicFont |
0 1 2 3 4 |
растровый 8x8 шрифт векторный шрифт векторный шрифт векторный шрифт векторный шрифт |
HorizDir VertDir |
0 1 |
Ориентация слева направо Ориентация сверху вниз |
UserCharSize |
0 |
Размер символа определяется пользователем |
Создание анимации
С помощью процедур GetImage и PutImage (работа с буфером). При этом используются константы вывода двоичного образа на экран.
Пример:, программа Image_ex.pas
Работа со страницами видеопамяти
Работа со специальными режимами записи, задаваемыми процедурой SetWriteMode (только при вычерчивании линий).
Пример: программа Rotate.pas
Построение графиков произвольных функций
Перевод мировых координат в экранные
Основные правила
Целые значения
Начало координат
Масштабирование
Можно для масштабирования сделать вычисления для конкретной программы. Общий подход – расчет масштабных коэффициентов в программе.
Пример
Примеры программ
Пример1. Графика в текстовом режиме.
uses Crt, dos;
var i:integer;
reg:registers;
begin
clrscr;
TextMode(3);
HighVideo;
TextBackground(Black);
textcolor(white);
Writeln('Bright');
LowVideo;
Writeln('Dark');
{delete cursor}
with reg do begin
ah:=$01;
Ch:=Hi($2000);
CL:=Lo($2000);
intr($10, reg);
end;
readln;
{ Green characters on black}
window(1,1,15,12);
textbackground(magenta);
clrscr;
TextColor(Green);
WriteLn(' Hey there!');
writeln(' ╔═════════╗');
for i:=1 to 8 do
writeln(' ║ ║');
writeln(' ╚═════════╝');
textcolor(green+blink);
textbackground(yellow);
gotoxy(6,3);
writeln('hello');
textcolor(green);
textbackground(blue);
gotoxy(7,6);
writeln('/│\');
gotoxy(6,7);
writeln('//│\\');
gotoxy(5,8);
writeln('///█\\\');
gotoxy(8,9);
writeln('█');
for i:=1 to 10 do begin
gotoxy(8,5);
textcolor(yellow);
writeln('*');
{Sound(500);} { Beep }
Delay(2400); { For 400 ms }
{NoSound;}
textcolor(red);
gotoxy(8,5);
writeln('*');
delay(1300);
end;
window(1,1,80,25);
{norm cursor}
with reg do begin
ah:=$01;
Ch:=Hi($0607);
CL:=Lo($0607);
intr($10, reg);
end;
NormVideo; { Original attribute }
textbackground(green);
textcolor(white);
gotoxy(1,20);
WriteLn('Back ...');
readln
end.
Пример2. Цветные фигуры и линии
uses Graph;
var
grDriver : Integer;
grMode : Integer;
ErrCode : Integer;
begin
grDriver := Detect;
InitGraph(grDriver, grMode, 'bgi');
ErrCode := GraphResult;
if ErrCode = grOk then
begin { Do graphics }
SetColor(White);
SetLineStyle (SolidLn,0,NormWidth);
SetFillStyle (SolidFill,Red);
PieSlice(100,200,45,135,80);
SetColor (Red);
SetLineStyle(SolidLn,0,ThickWidth);
SetFillStyle (SolidFill,Yellow);
Rectangle(300,10,400,70);
FloodFill(350,50,Red);
SetColor(Green);
SetLineStyle (DashedLn,0,ThickWidth);
Line(0,GetMaxY,GetMaxX,0);
SetColor(Cyan);
SetLineStyle (SolidLn,0,NormWidth);
SetFillStyle(XHatchFill,Red);
Circle(500,250,50);
FloodFill(500,250,cyan);
Readln;
CloseGraph;
end
else
Writeln('Graphics error:', GraphErrorMsg(ErrCode));
end.
Пример 3. Движущийся круг
uses crt,
Graph;
var
Gd, Gm: Integer;
P: Pointer;
Size: Word;
i:integer;
begin
Gd := Detect;
InitGraph(Gd, Gm, ' ');
if GraphResult <> grOk then
Halt(1);
setcolor(magenta);
for i:=1 to 10 do
circle(20,30,i);
Size := ImageSize(10, 20, 30, 40);
GetMem(P, Size); { Allocate memory on heap }
GetImage(10, 20, 30, 40, P^);
readln;
ClearDevice;
for i:=1 to 120 do
begin
PutImage(10+i, 30, P^, NormalPut);
delay(100);
end;
Readln;
CloseGraph;
end.