19.4.3. Окружности, эллипсы и дуги

Для изображения окружностей используется процедура

Circle( x, у : Integer; Radius : Word )

Здесь (X,Y) — координаты центра окружности, Radius — ее радиус. Результатом ее работы будет окружность, если коэффициент сжатия

- 428 -

изображения соответствует принятому BGI-драйвером для текущего графического режима. В противном случае на экране появится эллипс, вытянутый по вертикали (коэффициент сжатия больше принятого по умолчанию) или по горизонтали (коэффициент меньше принятого).

В модуле Graph представлены процедуры рисования эллипсов, дуг, секторов и процедура, позволяющая рисовать сектор, залитый по заданному шаблону. Все они запрашивают параметры StartAngle и EndAngle, которые обозначают начальный и конечный угол дуги. От какого направления измеряется угол? На рис. 19.12 изображена система графических координат, в которой мы работаем.

Положительное направление оси X (слева направо) принято за 0°, отрицательное направление оси Y — за 90°, т.е. углы отмеряются от положительного направления оси X против часовой стрелки. Все значения этих параметров даются в градусах.

Ниже перечислены процедуры рассматриваемого класса:

1. Рисование дуги радиуса Radius из центра с координатами (X,Y) от угла StartAngle до EndAngle:

Arc( X,Y: Integer; StartAngle, EndAngle, Radius: Word )

При изменении коэффициента сжатия изображения вид выводимых дуг будет отличаться от правильных окружностей.

2. Рисование эллиптической дуги с аналогичными параметрами:

Ellipse( X, Y: Integer; StartAngle, EndAngle, XRadius, YRadius: Word )

где XRadius и YRadius — размеры горизонтальной и вертикальной полуосей соответственно. Как видно из описания процедуры, оси

- 429 -

эллипса могут быть только параллельны осям X и Y. Для изображения полного эллипса надо задавать углы 0° и 360°. Значение коэффициента сжатия изображение не влияет на его вид.

Некоторые другие процедуры, изображающие секторы (Sector, PieSlice), а также FillEllipse, выполняют попутно их заливку, поэтому они рассмотрены в разд. 19.5.3 «Заливка областей изображения».

Угловые параметры очень неудобны для нашей системы координат — мы можем определить координаты начала и конца дуг окружности или эллипса не иначе, как только используя известные тригонометрические выражения. Но в подобных вычислениях нет необходимости, поскольку эти координаты все равно известны внутри процедур Arc, Ellips, Sector и PieSlice.

Извлечь концевые координаты дуг позволяет процедура

GetArcCoords( VAR ArcCoords : ArcCoordsType )

Тип ArcCoordsType объявлен в модуле Graph следующим образом:

TYPE

ArcCoordsType = RECORD

X, Y : Integer; { центр }

XStart, Ystart : Integer; { начало }

XEnd, Yend : Integer; { конец }

END;

Рассматриваемая процедура возвращает «итоги» последнего вызова процедуры рисования дуги или сектора. Это может пригодиться в случае, если дуги являются частью какого-либо построения на экране дисплея (рис. 19.13).

USES Graph; { подключен модуль Graph }

{$I initgraf.pas} { процедура инициализации }

VAR

maxx, maxy, radius : Integer;

x_right, x_left, y_right, y_left : Integer;

ArcCo1, ArcCo2 : ArcCoordsType;

BEGIN

GrInit; { инициализация графики }

maxx := GetMaxX; { разрешение по оси X }

maxy := GetMaxY; { разрешение по оси Y }

radius := Round(maxy*0.30); { значение радиуса дуг }

x_right := Round(maxx*0.75); { центр правой дуги }

y_right := Round(maxy*0.25);

Рис. 19.13

- 430 -

x_left := Round(maxx*0.25); { центр левой дуги }

y_left := Round(maxy*0.75);

Arc(x_right, y_right, 315, 135, radius);

GetArcCoords(ArcCol ); { где концы правой дуги? }

Arc( x_left, y_left, 135, 315, radius );

GetArcCoords( ArcCo2 ); { где концы левой дуги? }

{ Дуги сопрягаются прямыми: }

Line(ArcCo1.XStart, ArcCo1.YStart, ArcCo2.XEnd, ArcCo2.YEnd);

Line(ArcCo2.XStart, ArcCo2.YStart, ArcCo1.XEnd, ArcCol.YEnd);

ReadLn;

CloseGraph { закрытие графики }

END.

Рис. 19.13 (окончание)