Главная » Free Pascal » Построение прямых и прямоугольников Free Pascal

0

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

Таблица 15.5

Формат обращения к процедуре

Выполняемое действие

Line(x1,y1,x2,y2);

Построение отрезка прямой между двумя точками

LineTo(x2,y2);

Построение отрезка прямой. Начало отрезка — текущая точка (CP), конец — точка (x2, y2)

LineRel(dx,dy);

Построение отрезка прямой. Начало отрезка — текущая точка, конец — точка (xCP+dx, yCP+dy)

MoveTo(x2,y2);

Перемещение текущей точки в позицию (x2, y2)

MoveRel(dx,dy);

Перемещение текущей точки в позицию (xCP+dx, yCP+dy)

Rectangle(x1,y1,x2,y2);

Построение прямоугольника со сторонами, параллельными координатным осям

SetLineStyle(Style,Pattern,width);

Установка стиля воспроизведения линии

DrawPoly(n,XY);

Построение ломаной линии с вершинами в точках массива XY (n — число точек)

В графических построениях участвуют либо абсолютные координаты точек (x1, y1), (x2, y2), задаваемые значениями типа SmallInt в экранной системе координат, либо приращения (dx, dy) относительно позиции текущей точки. Абсолютные ко- ординаты могут быть и отрицательными. Это означает, что одна из точек графиче- ского примитива находится за пределами координатной сетки экрана. Но видимый фрагмент соответствующего графического примитива будет построен. Порядок задания угловых точек прямоугольника жестко фиксирован. Точка (x1, y1) соответ- ствует левому верхнему углу прямоугольника.

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

   Листинг 1 5 .3 .  Программа  CP                                                  

program CP; uses graph; var

gd,gm: SmallInt;

begin

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”);

Rectangle(20,20,100,100); LineTo(100,150);

LineRel(50,0); readln; closegraph;

end.

Соответствующее графическое окно приведено на рис. 15.4.

Рис. 15.4. Перемещения текущей точки

Отрезки прямых и контуры прямоугольника могут рисоваться не только сплошными линиями. По умолчанию в графической системе установлен именно этот режим. Однако пользователь может его изменить, обратившись к процедуре SetLineStyle.

SetLineStyle(Style, Pattern, width);

Первый ее параметр Style обычно задается одной из следующих мнемониче- ских констант:

± SolidLn — режим построения сплошных линий (по умолчанию);

± DottedLn —  режим построения пунктирной линии;

± CenterLn — режим построения штрихпунктирной линии;

± Dashedln — режим построения штриховой линии;

± UserBitln — режим построения линий по шаблону пользователя.

В первых четырех режимах параметр Pattern игнорируется и может быть за- дан, например, нулем. Его назначение — задать шаблон пользователя, который формируется в виде двухбайтовой шестнадцатеричной константы. Шаблон скани- руется слева направо. Его очередной нулевой разряд делает очередной пиксел ли- нии невидимым, а единичный разряд — видимым. После исчерпания разрядов шаблона сканирование его битов повторяется заново. Образцы воспроизведения стандартных типов линий приведены на рис. 15.5. В качестве нестандартного шаб- лона была использована константа Pat=$FFFFFF00.

Третий аргумент процедуры SetLineStyle задает толщину линии, которая мо-

жет    равняться    одному    пикселу    (width=NormWidth)    или    двум    пикселам (width=ThickWidth).

Рис. 15.5. Стили линий

Процедура DrawPoly предназначена для построения ломаной линии, вершины которой заданы массивом точек типа PointType. Если координаты последней точки массива совпадают с координатами начальной точки, то таким способом можно построить любой многоугольник (листинг 15.4).

   Листинг 15.4. Программа  polygon                                             

program polygon; uses graph;

var

gd,gm:SmallInt;

xy:array [1..4] of PointType;

begin

xy[1].x:=10;

xy[1].y:=10;

xy[2].x:=100;

xy[2].y:=10;

xy[3].x:=80;

xy[3].y:=60;

xy[4].x:=10;

xy[4].y:=10;

// замыкание многоугольника

gd:=D8bit;

gm:=m800x600; initgraph(gd,gm,”);

DrawPoly(4,xy);              // построение треугольника

readln; CloseGraph;

end.

Графический экран этой программы приведен на рис. 15.6.

Рис. 15.6. Построение треугольника

Приведенные рис. 15.1, 15.3—15.6 построены искусственно, т. к. стандартно установленный режим рисования воспроизводит все графические элементы белым цветом на черном фоне. Поэтому настоящие графические окна соответствующих программ были обработаны в программе Paint при помощи обращения цвета на выделенных участках рабочего поля.

Дело в том, что попытка рисовать на графическом экране черным по белому не решается простым изменением цвета рисования (fc:=0) и цвета фона (bc:=15). При включении в приведенную выше программу перед обращением к процедуре Draw- Poly двух следующих операторов:

SetColor(0);    // код черного цвета SetBkColor(15); // код белого цвета

содержимое графического экрана не меняется. Попытка проявить цвет фона путем стирания содержимого экрана (процедура ClearDevice) тоже ни к чему хорошему не приводит — экран становится белым, а рисование цветом фона по белому сле- дов не оставляет. Поэтому приходится идти на "обман" графической системы: код нулевого цвета переносим в регистр ЦАП с номером, отличным от 0. Затем назна- чаем этот цвет в качестве цвета переднего плана и меняем цвет фона (листинг 15.5).

   Листинг 1 5 .5 .  Рисо вание  ч е рным по  бел ому                                                                               

program poly_B_W; uses graph;

var

gd,gm: SmallInt;

xy: array [1..4] of PointType;

begin

xy[1].x:=10;  xy[1].y:=10;

xy[2].x:=100; xy[2].y:=10;

xy[3].x:=80;  xy[3].y:=60;

xy[4].x:=10;  xy[4].y:=10;

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”);

SetPalette(1,0); // черный цвет -> 1-й регистр ЦАП SetColor(1);     // назначение цвета рисования SetBkColor(15);  // смена цвета фона

ClearDevice;     // проявление цвета фона

DrawPoly(4,xy); readln; CloseGraph;

end.

После этих манипуляций перед нами графический экран, вывод которого на принтер не приводит к повышенному расходу тонера (см. рис. 15.6).

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии