- •25. Модуль graph
- •25.1. Файлы bgi и содержание модуля Graph.
- •25.2. Инициализация и закрытие графического режима.
- •25.3. Обработка ошибок инициализации.
- •25.4. Классификация и анализ графических режимов.
- •25.5. Диапазоны графических режимов.
- •25.6. Очистка экрана и переключение режимов.
- •25.7. Управление режимом вывода образцов на экран.
- •25.8. Системы координат и текущий указатель.
- •Рисование графических примитивов и фигур. Линии и их
- •25.10. Коэффициент сжатия изображения.
- •25.11. Окружности, эллипсы, дуги.
- •25.12. Построение прямоугольников и ломаных.
- •25.13. Управление цветами и шаблонами заливки.
- •25.14. Заливка областей изображений.
Рисование графических примитивов и фигур. Линии и их
стили.
Процедура вывода отрезка на экран в текущем цвете и стиле определена в виде:
Line(X1,Y1,X2,Y2:integer) .
Задаются координаты начала (X1,Y1) и конца (X2,Y2) отрезка. Возможны ещё два метода рисования отрезков:
1.Из текущей точки в точку с заданными координатами (X,Y) процедурой
LineTo(X,Y:Integer) .
2.Относительно текущей позиции
LineRel(dx,dy:Integer) .
Можно управлять стилем линий: задавать толщину, тип (сплошные, пунктирные).
Определены следующие типы и константы стилей изображения линий:
TYPE
LineSettingType=RECORD
LineStyle:Word; {стиль(тип)}
Pattern:Word; {шаблон типа}
Thickness:Word; {толщина}
End;
CONST
{Для значений поля LineStyle}
SolidLn =0 {сплошная линия}
DottedLn =1 {точечная линия}
CenterLn =2 {штрихпунктирная линия}
DashedLn =3 {пунктирная линия}
UserBitLn =4 {Узор линии определяет пользователь}
{Для значений поля Thickness}
NormWidth=1 {толщина линии в 1 пиксел}
ThickWidth=3 {толщина линии в 3 пиксела}
Чтобы получить информацию о текущем стиле линий, можно воспользоваться процедурой GetLineSettings(Var LineType:LineSettingType),
а чтобы установить новый стиль линий, необходимо использовать процедуру SetLineStyle(LineStyle,Pattern,Thickness:Word), подставив в неё соответствующие значения.
Если параметр LineStyle не равен UserBitLn, то значение параметра Pattern не играет роли и обычно задаётся нулём.
25.10. Коэффициент сжатия изображения.
Если нарисовать квадрат отрезками, например
MoveTo(100,100);
LineRel(20,0);
LineRel(0,20);
LineRel(-20,0);
LineRel(0,-20); ,
то на экране возникнет сжатый прямоугольник. Похожая картина будет наблюдаться, если нарисовать окружность с помощью точек.
Отношение высоты экрана к ширине не равно отношению его разрешающей способности по вертикали к разрешающей способности по горизонтали. Для учёта неравенства в графическом стандарте BGI вводится специальный показатель, называемый коэффициентом сжатия изображения (aspect ratio). Стандартные мониторы имеют отношение высоты экрана к его ширине 0,75.
Процедура GetAspectRatio(Var A,B:Word) возвращает в переменных А и В значения, отношение которых (А/В) соответствует коэффициенту сжатия изображения.
Процедура SetAspectRatio(A,B:Word) позволяет изменять текущий коэффициент сжатия на равный (А/В).
Переназначение коэффициента сжатия влияет на работу всех процедур, выводящих окружности, эллипсы, дуги.
25.11. Окружности, эллипсы, дуги.
Для изображения окружностей используется процедура
Circle(x,y:Integer; Radius:Word)
x,y - координаты центра окружности,
Radius - её радиус.
{Необходимо, чтобы коэффициент сжатия соответствовал принятому BGI- драйвером.}
В модуле Graph представлены процедуры рисования эллипсов, дуг, секторов и процедура, позволяющая рисовать сектор, залитый по заданному шаблону. Процедуры запрашивают параметры StartAngle и EndAngle, которые обозначают начальный и конечный угол дуги (значения углов задаются в градусах).
Система графических координат:
(0,0) x
y
1.Рисование дуги радиуса Radius из центра с координатами (х, у) от угла
StartAngle до EndAngle
Arc(x, y: Integer; StartAngle, EndAngle, Radius: Word)
2.Рисование эллиптической дуги Ellipse(x, y: Integer; StartAngle, EndAngle, XRadius, YRadius: Word)
XRadius, YRadius - размеры горизонтальной и вертикальной полуосей соответственно.
Для изображения полного эллипса надо задавать углы от 0 до 360.
Угловые параметры неудобны.
Извлечь концевые координаты дуги позволяет процедура
GetArcCoords(Var ArcCoords:ArcCoordsType).
Тип ArcCoordsType объявлен в модуле Graph следующим образом:
TYPE
ArcCoordsType=RECORD
X, Y: Integer; {координаты центра}
XStart, YStart: Integer; {координаты начала дуги}
XEnd, YEnd: Integer; {координаты конца дуги}
END;
Процедура возвращает «итоги» последнего вызова процедуры рисования дуги или сектора. Это необходимо, когда дуга является частью какого-либо построения.
Пример:
USES Graph;
Procedure GrInit; {инициализация режима графики}
Var
GraphDriver: Integer; {для графического адаптера}
GraphMode: Integer; {для графического режима}
ErrorCode: Integer; {для кода ошибки}
Begin
GraphDriver:=Detect;
InitGraph(GraphDriver, GraphMode, ‘ ‘); {инициализация}
ErrorCode:= GraphResult; {результат инициализации}
if ErrorCode< > grOk then {если не успешно, то…}
begin
writeln(‘Ошибка графики: ‘,GraphErrorMsg(ErrorCode));
writeln(‘Программа остановлена’);
Exit;
end
End;
VAR
maxX, maxY, radius: Integer;
x_right, x_left, y_right, y_left: Integer;
ArcCo1, ArcCo2: ArcCoordsType;
BEGIN
GrInit;
maxX:=GetMaxX; {разрешение по оси Х}
maxY:=GetMaxY; {разрешение по оси Y}
raduus:=Round(maxy*0.3); {значение радиуса дуги}
x_right:=Round(maxy*0.75); {координаты центра
y_right:=Round(maxy*0.25); правой дуги}
x_left :=Round(maxy*0.25); {координаты центра
y_left :=Round(maxy*0.75); левой дуги}
Arc(x_right, y_right, 315, 135, radius);
GetArcCoords(ArcCo1); {где концы правой дуги}
Arc(x_left, y_left, 135, 315, radius);
GetArcCoords(ArcCo1); {где концы левой дуги}
Line(ArcCo1.XStart, ArcCo1.YStart, ArcCo2.XEnd, ArcCo2.YEnd);
Line(ArcCo2.XStart, ArcCo2.YStart, ArcCo1.XEnd, ArcCo1.YEnd);
ReadLn;
CloseGraph
END.
