19.4.2. Коэффициент сжатия изображения
Если попытаться нарисовать квадрат отрезками, например
MoveTo( 100, 100 );
LineRel( 20, 0 ); LineRel( 0, 20 );
LineRel(-20, 0 ); LineRel( 0, -20 );
то на экране скорее всего возникнет сжатый прямоугольник. Похожая картина будет наблюдаться, если «вручную» нарисовать окружность с помощью отрезков прямых или точек: получится эллипс. Это связано с тем, что отношение высоты экрана к ширине не равно отношению его разрешающей способности по вертикали к разрешающей способности по горизонтали. Для учета этого неравенства в графическом стандарте BGI вводится специальный показатель, на-
- 427 -
зываемый коэффициентом сжатия изображения (aspect ratio). Его значения могут иметь широкий диапазон. Например, для ПЭВМ типа IBM PC/XT/AT стандартные мониторы имеют отношение высоты экрана к его ширине, равное 0,75. При этом разрешающая способность адаптеров колеблется от 640x200 для CGA до 1024x768 для IBM8514, и отношение GetMaxY к GetMaxX может меняться от 0,3125 (640x200) до 0,75 (640x480, 1024x768). Таким образом, на единицу длины оси экрана приходится разное количество пикселов по горизонтали и вертикали, а поскольку все операции производятся с пикселами, то в результате вместо окружности может получиться эллипс, горизонтальная полуось которого равна радиусу, а вертикальная — радиусу, деленному на коэффициент сжатия изображения. Это очень неудобно при работе программы на разных ПЭВМ, так как если в ней есть прорисовка окружностей, то на различных ПЭВМ они будут выглядеть как различные вариации эллипса. В модуле Graph есть две процедуры, помогающие устранить это неудобство. Первая из них
GetAspectRatio( VAR А, В : Word )
возвращает в переменных A и B значения, отношение которых (A/B) соответствует коэффициенту сжатия изображения. В модуле Graph нет ни одного вещественного параметра (что повышает быстродействие), поэтому все нецелые значения представляются как отношение двух целых. Другая процедура,
SetAspectRatio( А, В : Word )
позволяет изменять текущий коэффициент сжатия на равный (A/B) и может помочь при написании программ, одинаково работающих на различных IBM-совместимых ПЭВМ.
Переназначение коэффициента сжатия влияет на работу всех процедур, выводящих окружности, эллипсы, дуги (см. след. разд.) и на значение параметров, возвращаемых при вызове процедуры GetAspectRatio. Построить же правильный квадрат можно домножая его вертикальный размер на исходный (системный) коэффициент сжатия.