Для работы с графикой из программы на Паскале в папке, откуда она запускается, должен присутствовать файл EGAVGA.BGI. Он представляет из себя графический драйвер, предназначенный для управления видеопамятью в режимах поддержки мониторов типовEGAиVGA. Разумеется, современные мониторы давно «переросли» эти два исторически распространенных класса дисплеев. Однако, на любом современном компьютере поддержка видеорежимовEGAиVGAпо-прежнему возможна если не напрямую, то через специальную программу-эмулятор (см. конец главы).
В поставку Паскаля могут входить и другие файлы с расширением *.BGI, отвечающие за работу с мониторами различных типов.
Кроме того, при компиляции программы, имеющей графический вывод, должен быть доступен модуль GRAPH.TPU, содержащий подпрограммы отрисовки графических объектов.
Библиотека GRAPH.TPU подключается стандартным способом с помощью USES в разделе описаний программ:
В графическом режиме, который в современных операционных системах типа Windowsявляется основным, экран представляет собой матрицу точек (пикселов), причем имеется возможность высветить любой пиксел любым цветом. Координаты каждого пиксела определяются парой целых чисел:
Pascal. Работа с графикой (Ellipse, rectangle, circle, textout)
координата X- номер пиксела в строке. Нумерация слева направо, начиная с 0;
координата Y — номер строки пикселов. Нумерация строк сверху вниз, начиная с 0.
Таким образом, координаты левого верхнего угла экрана равны (0,0). Любой объект, высвечиваемый на экране, представляет собой совокупность отдельных пикселов. При переходе в графический режим экран очищается. Количество воспроизводимых пикселов по горизонтали и вертикали зависит от типа монитора и установленного графического режима(каждый монитор может использовать несколько режимов, отличающихся количеством поддерживаемых цветов и разрешением графического экрана в пикселах):
монитор CGA — максимум 320*200 пикселов, монитор EGA – 640*350, монитор VGA – 640*480; Работу с более современными и мощными графическими режимами, относящимися к классу SuperVGA, Паскаль непосредственно не поддерживает, хотя существуют созданные независимыми разработчиками графические драйверы этих режимов.
Режим функционирования экрана, кроме количества пикселов, характеризуется определенной палитрой- набором видимых цветов. Каждая палитра состоит из четырех цветов для CGA или 16 цветов для EGA и VGA.
Установка графического режима осуществляется путем обращения к процедуре InitGraph:
Целочисленные переменные gdиgmзадают тип графического дисплея и режим работы графического адаптера, строковая переменнаяpt- путь к файлу графического адаптера (*.BGI). Пример:
var gd,gm,error: integer;
If error <> grOk Then Begin
Write (‘Ошибка графики: ‘, GraphErrorMsg(error));
Line (0,0,getmaxx,getmaxy); Readln; Closegraph;
Здесь устанавливается графический режим VGA640*480 точек с 16 цветами, так как путь к файлуEGAVGA.BGIуказан пустым, предполагается, что он находится в текущей папке, после перехода в графический режим процедуройLineрисуется линия из левого верхнего в правый нижний угол экрана, затем, после нажатияEnter, графический режим закрывается и происходит выход из программы.
Пример решения задач на Pascal #1
Для автоматического выбора максимально возможного режима переменной gdнеобходимо присвоить значениеdetect, при этом переменныеgmиptне определяются, если в текущем каталоге, в котором находится система Турбо Паскаль, имеются файлы *.BGI. Пример:
VAR gd,gm: integer;
Рассмотрим основные процедуры и функции модуля Graph.
CloseGraph;- завершает работу в графическом режиме. Необходимо выполнять эту процедуру перед завершением любой графической программы на Паскале.
ClearDevice;очищает графический экран. Обе этих процедуры не имеют параметров.
function GetMaxX:integer;- получает максимальную координату по осиX
function GetMaxY:integer;- получить максимальную координату по осиY
SetColor(Color);- устанавливает цвет рисования линий, точек и текста (аналог «пера» в программах для рисования). Цвета кодируются так же, как в текстовом режиме. Для полноты картины перечислим их все:
0 — черный (BLACK) 8 — темно-серый (DARKGRAY)
1 — синий (BLUE) 9 — голубой (LIGHTBLUE)
2 — зеленый (GREEN) 10 — светло-зеленый (LIGHTGREEN)
3 — циановый (CYAN) 11 — светло-циановый (LIGHTCYAN)
4 — красный (RED) 12 — светло-красный (LIGHTRED)
5 — фиолетовый (MAGENTA) 13 — светло-фиолетовый (LIGHTMAGENTA)
6 — коричневый (BROWN) 14 — желтый (YELLOW)
7 — светло-серый (LIGHTGRAY) 15 — белый (WHITE)
SetFillStyle (Style, Color);- устанавливает цвет заполнения областей экрана (Color) и способ наложения цвета (Style). Является аналогом «кисти» в программах для рисования ПараметрColorимеет значения, указанные выше, параметрStyle- от 1 до 11. ПриStyle=1– происходит обычное сплошное заполнение цветом, другие стили позволяют создать различные штриховки.Здесь и далее вместо цифр можно использовать имена стилей, для краткости мы не будем приводить их все.
Пр.SetFillStyle (LineFill,GREEN);
SetLineStyle (LineStyle,Pattern,ThickNess:integer);- определяет стиль рисования линий. ЗдесьLineStyleпринимает значения от 0 до 4 ,Patternпри использовании готовых стилей всегда равен 0, толщина линии указывается только значением 1 или 3 (в пикселах).
Пр.SetLineStyle (0,0,1);
Line(X1,Y1,X2,Y2);- рисует текущим цветом линию с координатами начала (X1,Y1), и конца (X2,Y2).
MoveTo(X,Y); — устанавливает текущую позицию рисования в (X,Y)
LineTo(X,Y);- проводит прямую из текущей позиции в точку с координатами (X,Y) текущим цветом.
LineRel(Dx,Dy);- проводит прямую из текущей позиции в точку с приращением координат от текущих на Dx и Dy, приращения могут быть и отрицательными.
Rectangle(X1,Y1,X2,Y2);- рисует прямоугольник с координатами левого верхнего угла (X1,Y1) и правого нижнего угла (X2,Y2).
Bar(X1,Y1,X2,Y2);- рисует закрашенный прямоугольник с координатами диагонали (X1,Y1) и (X2,Y2) цветом, установленным процедурой SetFillStyle.
Bar3d (X1,Y1,X2,Y2,Depth:integer; Top:boolean);- рисует трехмерный параллелепипед; параметрDepthопределяет глубину по осиX,Topуказывает, рисовать ли верхнюю грань
Пр.Bar3D (50,50,100,100,20,TRUE);
DrawPoly (NumPoint:integer; var PolyPoints);- процедура рисует многоугольник или ломаную линию. Аналогичная процедураFillPolyсоздает закрашенный цветом заливки многоугольник. Изучим работу процедуры на примере:
var Poly: array [1..10] of integer;
a:=getReal (‘Левая граница по X=’);
b:=getReal (‘Правая граница по X=’);
if a>b then write (‘Ошибка! Левая граница должна быть меньше правой’);
xMax-19 пикселов для рисования графика.
Чтобы масштабировать данные по оси Y, нужно сначала узнать максимальное
и минимальное значение f(x), поэтому требуется цикл: >
if fx>fmax then fmax:=fx
значения x ограничены пределами [a,b] и можно любую точку с
координатами (x,f(x)) перевести в точку на экране монитора.
Вообще, X, принадлежащий интервалу [A,B], можно линейно преобразовать
в Y, принадлежащий интервалу [C,D] по формуле
Используем эту формулу для расчета коэффициентов преобразования величин
x, f(x) к экранным координатам cx,cy >
прямоугольника с текстом, а размер символа по умолчанию равен 8*8 точек.
С учетом этого считаем координаты для функции Outtextxy >
str (a:8:3,ss); outtextxy (2,yMax-8, ss);
str (b:8:3,ss); outtextxy (xMax-66,yMax-8, ss);
правый верхний угол прямоугольника с текстом. >
str (fmax:8:3,ss); outtextxy (9,2, ss);
str (fmin:8:3,ss); outtextxy (9,yMax-66, ss);
if x>a then line (oldx,oldy,cx,cy);
repeat until KeyPressed;
Недостаток этой программы – отсутствие пропорционального масштабирования по осям xиy. Подумайте, как ее можно улучшить. Листинг 12 из Приложения 4 представляет более объемную графическую программу, реализующую несложную компьютерную игру. ФункцияDrawэтого листинга может также служить примером обработки 16-цветного изображения в форматеBMPиз программы на Паскале.
Решение задач, связанных с выводом графики на экран, часто требует сохранения участка экранного изображения в оперативной памяти с последующим восстановлением прежней картинки. Для решения этой проблемы в библиотеке Graphпредусмотрен набор соответствующих функций.
В первую очередь требуется оценить объем памяти, требуемый для сохранения участка экрана. Стандартная функция библиотеки Graph, имеющая видImagesize (x1,y1,x2,y2:integer):Word, гдеx1,y1– экранные координаты верхнего левого, аx2,y2– правого нижнего угла, возвращает число байт памяти, необходимых для сохранения заданной прямоугольной области. Эта функция может определить объем памяти до 64 Кб включительно, так как тип возвращаемого значения – беззнаковое целоеWord(см. раздел 2.2). Если количество требуемой памяти больше либо равно 64 Кб, возвращается значение ошибки-11(grError). Разумеется, вызов функции предполагает, что монитор находится в графическом режиме.
После того, как требуемое количество байт определено, программа должна позаботиться о выделении участка оперативной памяти, предназначенного для сохранения изображения. Это легко сделать, используя системную процедуру Getmem (var p:Pointer; size:Word), где объем памятиsizeранее определен функциейImagesize, а переменнаяpпредставляет собойуказатель.
Ранее незнакомый нам тип данных «указатель» служит для косвенного вызова одних переменных через другие. Фактически, переменная-указатель хранит адрес другой типизированной переменной и может обратиться к ней, используя синтаксисp^, гдеp– имя указателя. Применение указателей позволяет создавать динамические переменные, способные в разные моменты времени адресовать различные участки оперативной памяти, в которых хранятся данные. Самый большой блок памяти, который может выделитьGetmem, также равен 64 Кб. Освободить ранее занятую память можно процедуройFreemem (var p:Pointer; size:word).
Наконец, третий шаг – сохранить участок экрана, используя только что сформированный в оперативной памяти буфер. Для этой цели достаточно использовать процедуру Getimage (x1,y1,x2,y2:Integer; var p). Здесь параметрыx1,y1,x2,y2имеют тот же смысл, что для функцииImagesize, а нетипизированный параметр-указательpполучен процедуройGetmem.
Теперь требуемый участок экрана сохранен в памяти и может быть занят новым изображением. После того, как изображение выполнило свои функции и нужно восстановить прежний фрагмент экрана, достаточно вызвать процедуру Putimage (x,y:integer; var p; mode:word), гдеx,y– экранные координаты левого верхнего угла восстанавливаемой области,p– указатель на сохраненную память, а переменнаяmodeопределяет, какая двоичная операция будет использована при выводе изображения на экран. Для неизмененного восстановления изображения следует передавать в качествеmodeзначениеNormalPut, другие возможные значения параметра –CopyPut,XORPut,ORPut,ANDputиNOTPut. Все описанные функции использованы в листинге, приведенном ниже. Его изучение поможет Вам в написании аналогичных программ, поддерживающих движение по экрану графических объектов.
Источник: studfile.net
Графика языка паскаль
Текстовый (crt) –
на экране 25 строк по 80 символов в строке.
Минимальный элемент вывода – символ.
Графический (graph) –
на экране точки. В Паскале разрешение
экрана 640*480. Каждая точка может быть одним
из 16-ти цветов.
Минимальный элемент вывода – пиксель.
3. Графический экран
0,0
Y
Х
640
(X,Y)
480
Координаты измеряются в пикселях
Home
4. Шаблон графической программы:
5. ГРАФИЧЕСКИЕ ПРИМИТИВЫ
6. Процедура прорисовки линии
Line (x1, y1, x2, y2)
x2,y2
x1,y1
Пример Line (30, 45, 100, 142)
7. Стили линии
SetLineStyle (Style, 0, Wid)
Style – устанавливает тип линии
Wid – устанавливает толщину линии
Пример
SetLineStyle (3, 0, 1);
Line (20, 30, 130, 30);
8. Процедура прорисовки прямоугольника
Rectangle (x1, y1, x2, y2)
x1,y1
x2,y2
Пример rectangle (30, 45, 100, 142)
Home
9. Процедура прорисовки окружности
Circle (x, y, R)
x, y – координаты центра окружности
R – радиус окружности
R
x, y
Пример
Circle (30, 45,100)
10. Процедура прорисовки эллипса
Ellipse (x, y, , , Rx, Ry)
x, y – координаты центра эллипса;
— начальный угол
— конечный угол
Rх – горизонтальный радиус эллипса
Ry — вертикальный радиус эллипса
x, y
Rх
90
х
0 ,360
180
Ry
270
11. Sector(x,y,, ,Rx, Ry); Выводит закрашенный эллиптический сектор с центром в точке (x,y) полуосями Rx, Ry и от начального угла до угла
Sector(x,y, , ,Rx, Ry);
Выводит закрашенный эллиптический сектор
с центром в точке (x,y) полуосями Rx, Ry и от
начального угла до угла
SetFillStyle(1,6);
Sector(300,250,90,180,50,50);
12. Цветовая гамма
Цвета в операторах задаются с помощью своих кодов:
0 – черный;
1 – синий;
2 –зеленый;
3 – бирюзовый;
4 – красный;
5 – пурпурный;
6 – коричневый;
7 – светло-серый;
8 – темно-серый;
9 – ярко-синий;
10 – ярко-зеленый;
11 – ярко-бирюзовый;
12– ярко-красный;
13 – ярко-пурпурный;
14 – желтый;
15 – белый.
13. Установка цвета рисунка
Цвет графических примитивов задается
с помощью процедуры
SetColor (цвет)
цвет – код цвета
14. ЗАЛИВКА ЗАМКНУТЫХ ОБЛАСТЕЙ
15. Процедура определения типа заливки областей
SetFillStyle (тип штриховки, цвет)
Пример SetFillStyle (3, 4)
Параметр «тип штриховки» может принимать следующие значения:
0 – нет закраски
1 – сплошная
2–
3–
4–
5–
6–
7–
8–
9–
10 –
11 –
16. Заливка произвольной области
FloodFill (x, y, Border)
x, y — координаты точки внутри заливаемой
замкнутой области
Border – цвет границы заливаемой области
x,y
Home
17. Решение задач
18. Нарисовать цилиндр
Program cilindr;
uses Graph, crt;
Var gd, gm: integer;
BEGIN
gd := detect;
InitGraph (gd, gm, »);
Ellipse (420, 200, 0, 360, 100, 40);
Line (320, 200, 320, 440);
Line (520, 200, 520, 440);
Ellipse (420, 440, 180, 360, 100, 40);
readKey;
closegraph;
END.
Источник: ppt-online.org
Графика в паскале abc примеры программ
На предыдущих страницах мы рассмотрели процедуры для работы с точками в Паскале, а также познакомились с некоторыми другими процедурами. Теперь пришло время использовать эти знания в построении графиков функций в паскале.
Следует сразу заметить, что построение графика функции происходит в два основных этапа: построение системы координат и, собственно, рисование самого графика. Кроме того, процесс создания системы координат тоже разбивается на несколько частей.
Договоримся ещё об одном: систему будем строить с положительными и отрицательными значениями по обеим осям. Поскольку многие используют ещё турбо паскаль, то в конце страницы будет приведены две программы: одна – для PascalABC и PascalABC.Net, другая – для Turbo Pascal и Free Pascal.
Итак, для построения системы координат нам необходимо знать, в каких границах графического окна она будет находиться. Можно было бы опустить этот этап и строить декартову систему так, чтобы она занимала все графическое окно. Но это не очень удобно и просто некрасиво выглядит, когда график функции занимает всю область, не имея свободных полей слева-справа и сверху-снизу. Поэтому, чтобы задать прямоугольник, в котором будет находиться система координат, достаточно знать координаты левого верхнего и правого нижнего его углов.
Пусть (xLeft; yLeft) – координаты левого верхнего угла декартовой системы координат в графическом окне PascalABC.Net, (xRight; yRight) – соответственно координаты правого нижнего угла. Следующая задача – провести оси координат OX и OY. Будем считать, что нам нужны все четыре четверти координат. В этом случае обе оси будут иметь положительные и отрицательные значения. Чтобы правильно поставить центр координат (x0; y0), необходимо знать границы изменения аргумента x по оси OX и значения функции f по оси OY.
Итак, отложим по оси ОХ числа от a до b с интервалом dx, по оси OY – числа от fmin до fmax с разницей dy; причем обязательные условия: a≤0, b≥0, fmin≤0, fmax≥0. Для правильного отображения засечек на осях необходимо также, чтобы dx было делителем a и b, а dy было делителем fmin и fmax, и эти числа придется выбирать самостоятельно для каждого интервала. Но сначала нам придется познакомиться с таким понятием как масштаб системы координат в графическом окне паскаля. Что такое масштаб?
✎ Масштаб – это величина, или коэффициент, показывающий, сколько пикселей графического окна паскаля приходится на единицу оси системы координат. Например, по оси ОХ нужно расположить числа от -4 до 16 (всего 20 единиц), а ширина графического окна паскаля равна 1000 пикселей; тогда на единицу величины оси ОХ приходится 1000_20=50 пикселей/единицу. Это и есть масштаб по оси ОХ. Чтобы узнать, сколько пикселей содержат n единиц, надо просто умножить n на 50.
График функции будем строить по точкам, используя процедуру SetPixel(x, y, c), где x, y – координаты точки в графическом окне паскаля, c – цвет точки. Для рисования осей координат ОХ и OY воспользуемся процедурой Line(x1, y1, x2, y2), где (x1; y1) – координаты начальной точки, (x2; y2) – координаты конечной.
Последовательность такова: сначала строим систему координат, а после (в самом конце) вычисляем значения функции, вычисляем соответствующие координаты точки в графическом окне и ставим точку (x, y), закрашенную в зеленый цвет. Откройте PascalABC или PascalABC.Net, скопируйте следующий код и запустите программу:
Только не нужно забывать, что в PascalABC цвет имеет тип ColorType, а PascalABC.Net тип цвета Color – это синоним System.Drawing.Color.
Итак, запустив программу, вы должны увидеть следующее:
А теперь программа для тех, у кого нет PascalABC, но есть Turbo Pascal или Free Pascal. Итак, скопируйте нижеприведенный код в блокнот, сохраните в формате .pas и откройте в турбо паскале, потом запустите (ctrl+F9):
Если все сделано правильно, вы должны увидеть такой график функции:
Вообще, построение графиков – это одно из постейших заданий, с которым может столкнуться программист на практике. Наиболее сложным вариантом есть применение графики в создании игр, таких, как европейская рулетка. Если вы захотите играть в европейскую рулетку, то реалистичная графика игры первой бросается в глаза.
Простейший игровой автомат – это обычная игра, но с использованием функции Random(N), возвращающей случайное число от 0 до N-1. Это значит, что нажимая на кнопки, выбирая разные фишки, бросая кубики, шарики и т.п. каждый раз вы будете получать случайный результат, так как функция Random генерирует случайные числа с привязкой к текущему времени. Также в играх подобного типа обязательное использование таймера для создания плавности перехода. Позже в этом разделе мы напишем небольшие игры и посмотрим, как это работает.
После запуска PascalABC, по умолчанию, запускается текстовый режим. Для работы с графикой служит отдельное графическое окно.
Чтобы его открыть, необходимо подключить модуль GraphABC. В этом модуле содержится набор процедур и функций, предназначенных для работы с графическим экраном, а также некоторые встроенные константы и переменные, которые могут быть использованы в программах с графикой.
С их помощью можно создавать разнообразные графические изображения и сопровождать их текстовыми надписями.
Подключение осуществляется в разделе описаний.
Формат подключения модуля GraphABC:
Графический экран PascalABC (по умолчанию) содержит 640 точек по горизонтали и 400 точек по вертикали. Начало отсчета – левый верхний угол экрана. Ось x направлена вправо, а ось y –вниз. Координаты исчисляются в пикселях.
Все команды библиотеки GraphABC являются подпрограммами и описаны в виде процедур и функций. Для того, что бы команда выполнилась необходимо указать команду и задать значения параметров.
Источник: genueguru.ru