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 (окончание)