возвращает в переменных A и B значения, отношение которых (A/B) соответствует коэффициенту сжатия изображения. В модуле Graph нет ни одного вещественного параметра (что повышает быстродействие), поэтому все нецелые значения представляются как отношение двух целых. Другая процедура,
SetAspectRatio( А, В : Word )
позволяет изменять текущий коэффициент сжатия на равный (A/B) и может помочь при написании программ, одинаково работающих на различных IBM-совместимых ПЭВМ.
Переназначение коэффициента сжатия влияет на работу всех процедур, выводящих окружности, эллипсы, дуги (см. след. разд.) и на значение параметров, возвращаемых при вызове процедуры GetAspectRatio. Построить же правильный квадрат можно домножая его вертикальный размер на исходный (системный) коэффициент сжатия.
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 -