Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций часть 3.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
79.87 Кб
Скачать
  1. Рисование графических примитивов и фигур. Линии и их

стили.

Процедура вывода отрезка на экран в текущем цвете и стиле определена в виде:

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.