2. Можно задать шаблон-комбинацию шестнадцати светящихся или погашенных пикселов. Его представляют как множество единиц и нулей: 1 — светится, 0 — нет. Например, мелкий равномерный пунктир задается как

1100110011001100 — всего 16 разрядов.

Поскольку Турбо Паскаль не позволяет работать с числами, представленными в двоичной системе счисления, необходимо перевести полученное число в десятичную (52428) или в шестнадцатеричную ($СССС) систему счисления и подставить его фактическим параметром на место Pattern при вызове SetLineStyle (рис. 19.11).

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

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

| х : Integer;

| BEGIN

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

| х := GetMaxX; { разрешение экрана по X }

| SetLineStyle( DottedLn, 0, NormWidth );

| Line( 0, 10, х, 10 ); { тонкая сплошная линия }

| SetLineStyle( CenterLn, 0, NormWidth );

| Line( 0, 20, х, 20 ); { штрихпунктирная линия }

Рис. 19.11

- 426 -

| SetLineStyle( UserBitLn, $CCCC, NormWidth );

| Line( 0, 30, x, 30 ); { линия 1100110011001100 }

| SetLineStyle( UserBitLn, $B38F, NormWidth );

| Line( 0, 40, x, 40 ); { линия 1011001110001111 }

| SetLineStyle( UserBitLn, $4C70, NormWidth );

| Line( 0, 50, x, 50 ); { линия 0100110001110000 }

| ReadLn; { пауза до нажатия ввода }

| SetLineStyle( DottedLn, 0, ThickWidth );

| Line( 0, 10, x, 10 ); { толстая сплошная линия }

| SetLineStyle( CenterLn, 0, ThickWidth );

| Line( 0, 20, x, 20 ); { штрих-пунктирная линия }

| SetLineStyle( UserBitLn, $CCCC, ThickWidth );

| Line( 0, 30, x, 30 ); { линия 1100110011001100 }

| SetLineStyle( UserBitLn, $B38F, ThickWidth );

| Line( 0, 40, x, 40 ); { линия 1011001110001111 }

| SetLineStyle( UserBitLn, $4C70, ThickWidth );

| Line( 0, 50, x, 50 ); { линия 0100110001110000 }

| ReadLn; { пауза до нажатия ввода }

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

| END.

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

В этом примере на экране монитора рисуется пять горизонтальных линий разной толщины: две нарисованы по системному шаблону, а три — по шаблону, заданному нами.

Назначение стиля линий влияет на действие всех процедур, выводящих на экран отрезки или фигуры, из них состоящие. Процедуры, выводящие на экран дуги, учитывают только толщину, заданную в стиле.

<p>19.4.2. Коэффициент сжатия изображения</p>

Если попытаться нарисовать квадрат отрезками, например

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 )

Перейти на страницу:

Поиск

Похожие книги