скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыРеферат: Модуль Graph в программе Turbo Pascal

Системы координат и «текущий указатель»

В растровой компьютерной графике экран представляет собой прямоугольный массив адресуемых точек и любое изображение на нем образуется как композиция светящихся или погашенных пикселов. Эти точки адресуются двумя целыми - горизонтальным номером точки nx и вертикальным номером ny:

0 <= nх <= nx_max,

0 <= nу <= ny_max,

где nx_max и ny_max - количество адресуемых точек по горизонтали и по вертикали минус единица

В модуле Graph предусмотрена возможность программного опроса максимальных адресуемых координат экрана. Она реализована парой функций

GetMaxX: Integer;

GetMaxY: Integer.

Возвращаемые ими значения соответствуют параметрам nx_max и ny_max, будут различаться для различных режимов и адаптеров. При адресации точек координатами, большими, чем эти значения, операция игнорируется.

Точка с адресом (0,0) обычно расположена в левом верхнем углу экрана дисплея. Координаты (nx, ny) называют также координатами устройства. Они могут принимать только целые значения.

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

Графические координаты задают положение точки на экране дисплея. Поскольку минимальным элементом, к которому имеет доступ программист, является пиксель, естественно в качестве графических координат использовать порядковые номера пикселей. Допустимый диапазон изменения графических координат составляет [0, rx- 1] для X и [0, ry - 1] для Y –координаты. Точкой отсчета является верхний левый угол экрана. Значения X- координаты отсчитываются слева направо, а Y-координаты - сверху вниз. Это отличает графические координаты от обычных декартовых координат, принятых в математике, и служит источником ошибок для начинающего программиста.

Для правильного отображения графика в декартовой системе координат на экране необходимо учесть следующее:

1.         Графические координаты принимают только целочисленные значения.

2.         Графические координаты принимают, ограниченные как снизу (нулевым значением), так и сверху (значением разрешения).

3.         Графическая координата Y отсчитывается сверху вниз.

Таким образом, геометрические декартовы координаты точки (X, Y) для отображения на экране следует пересчитать в графические (Xg, Yg) по формулам:

Xg= ëSx*Xû + dx,

Yg= ry-ëSy*Yû – dy,

Где ëXû - целая часть X, Sx, Sy- масштабные множители, выбираемые из условия

rx=ëSx*Xmaxû+1

ry=ëSx*Ymaxû+1

Xmax, Ymax- максимальные значения геометрических координат.

Слагаемые dx, dy обеспечивают смещение относительно левого верхнего угла экрана.

Изображение будет смещено в центр экрана при dx=ërx/2û, dy=ëry/2û.

В графическом режиме текущий указатель перемещается специальными процедурами.

Процедура MoveTo (х, у: Integer) перемещает его в точку экрана с координатами (х, у).

Процедура MoveRel( dx, dy : Integer ) перемещает текущий указатель на dx пикселов по горизонтали и соответственно на dy по вертикали относительно последнего положения текущего указателя. Положительные значения dx и dy увеличивают его координаты, а отрицательные — уменьшают.

В системе координат дисплея ось Y направлена вниз, поэтому, если указатель надо перенести вверх, то приращение dy должно быть отрицательным.

Для определения текущего положения графического курсора используются функции

GetX: Integer;

GetY: Integer,

возвращающие положение указателя соответственно по оси X и по оси Y. Позиционирование текущего указателя и опрос его местонахождения работают корректно, даже если работа происходит за пределами координат устройства.

Изменяют положение текущего указателя также процедуры LineTo, LineRel, OutText.

Все процедуры инициализации и очистки экрана (InitGraph, GraphDefaults, ClearDevice, SetGraphMode, SetViewPort и ClearViewPort) устанавливают текущий указатель в положение (0,0).


Рисование графических примитивов и фигур. Линии и их стили

Процедура вывода линии (отрезка) на экран (в текущем цвете и стиле) определена в следующем виде:

Line (Х1, Y1, Х2, Y2: Integer)

Здесь задаются координаты начала (X1,Y1) и конца (X2,Y2) отрезка. Возможны еще два метода рисования отрезков:

1.         Из текущей точки в точку с заданными координатами (X,Y). Выполняется процедурой

2.         LineTo ( х, у: Integer)

3.         Относительно текущей позиции. Положение текущего указателя принимается за начало «временных» координат (0,0) и указывается местоположение конца отрезка в них. Такое построение делает процедура

4.         LineRel( dx, dy : Integer )

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

В Турбо Паскале можно управлять стилем линий: задавать толщину, тип (сплошные линии, пунктирные и т.п.). Для этого определены следующие типы и константы стилей изображаемых линий:

TYPE

LineSettingsType=RECORD

LineStyle : Word; { стиль (тип) }
Pattern : Word; { шаблон типа }
Thickness : Word; { толщина }

END;

CONST

{ Для значений поля LineStyle :}


SolidLn = 0 { сплошная линия }
DottedLn = 1 { точечная линия}
CenterLn = 2 { штрихпунктирная линия}
DashedLn = 3 { пунктирная линия }
UserBitLn = 4 { тип линии задан явно шаблоном}

{ Для значений поля Thickness: }

NormWidth = 1 { толщина линии в один пиксел}
ThickWidth = 3 { толщина линии в три пиксела}

Чтобы получить информацию о текущем стиле линяй, можно воспользоваться процедурой

GetLineSettings( VAR LineType : LineSettingsType)

А чтобы установить новый стиль линий, необходимо использовать процедуру SetLineStyle( LineStyle, Pattern, Thickness : Word ), подставив в нее соответствующие значения. Если параметр LineStyle не равен UserBitLn, то значение параметра Pattern не играет роли и обычно задается нулем.

Рассмотрим подробно вариант, когда LineStyle равно UserBitLn. В этом случае при определении типа линии руководствуются следующими соображениями:

1.         Линия представляет собой совокупность отрезков, каждый из которых имеет длину 16 пикселов. Если длина линии не делится на 16 нацело, то последний отрезок обрезается.

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

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

Uses Graph; {подключен модуль Graph}
{$I Initgraf.pas} {процедура инициализации}
Var
x : Integer;
BEGIN
Grlrtit; {инициализация графики}
X: = GetMaxX; {разрешение экрана по X}
SetLineStyle (DottedLn, 0, NormWidth);
Line (0, 10, x, 10); {тонкая сплошная линия}
SetLineStyle (CenterLn, 0, NormWidth);
Line (0, 20, x, 20); {штрихпунктирная линия}
SetLineStyle( UserBitLn, $CCCC, NonriWidth );
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, $СССС, ThickWidth );
Line( 0, 30, x, 30 );  { линия 1100110011001100 }
SetLineStyle( UserBitLn, $B38F, ThickWidth );
Line( 0, 40, x, 40 ); { линия 1011001110001111 }
SetLineStylef UserBitLn, $4С70, ThickWidth );
Line( 0, 50, x, 50 ); { линия 0100110001110000}
ReadLn; { пауза до нажатия ввода}
CloseGraph { закрытие графики}
END.

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

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

Коэффициент сжатия изображения

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

MoveTo (100, 100);

LineRel (20, 0); LineRel (0, 20);

LineRel (-20, 0); LineRel (0, -20);

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

Другая процедура,

SetAspectRatio (А, В: Word)

Позволяет изменять текущий коэффициент сжатия на коэффициент, равный (А/В). Переназначение коэффициента сжатия влияет на работу всех процедур, выводящих окружности, эллипсы, дуги и на значение параметров, возвращаемых при вызове процедуры GetAspectRatio. Построить же правильный квадрат можно, домножая его вертикальный размер на исходный (системный) коэффициент сжатия.

{ Построение квадрата }

Program QuadroDem;

Uses Graph;

const l=100;

Var

d,r,e:integer;

a,b :word;

Begin

d:=Detect;

InitGraph(d,r,'');

e:=GraphResult;

if e<>grOk then

writeln(GraphErrorMsg(e))

else

begin

GetAspectRatio(a,b);

Rectangle(20,20,round(l*(b/a)),l);

readln;

CloseGraph;

end

Страницы: 1, 2, 3, 4, 5


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.