6.4 Фигуры и стили.
Существует большое число программ для рисования и заполнения фигур, включая точки, линии, окружности, дуги, эллипсы, прямоугольники, многоугольники, полосы, 3-х мерные полосы и сектора.
Процедура PutPixel Строит элемент изображения) в точке (x,y).
Описание: PutPixel(x,y : integer; эл_изображ : word).
Примечания: Строит в (x,y) точку, цвет которой определяется параметром "эл_изобр".
Пример:
uses Graph;
var Gd,Gm,Color : word;
begin
Gd := Detect;
InitGraph(Gd, Gm, '');
if GraphResult <> grOk then
Halt(1);
Randomize;
repeat
Color := Random(GetMaxColo)r;
PutPixel(Random(100),Random(100),Color); { строит "звездочки" }
Delay(10);
until KeyPressed;
Readln;
CloseGraph;
end.
Процедура Line Рисует прямую линию из точки (x1,y1) в точку (x2,y2).
Описание: Line(x1, y1, x2, y2 : integer)
Примечания: Рисует прямую, толщина и тип которой задаются процедурой SetLineStyle, а цвет устанавливается процедурой SetColor.
Процедура Rectangle Рисует прямоугольник, используя текущий цвет и тип строки.
Описание: Rectangle(x1, y1, x2, x2 : integer).
Примечания: Точка с координатами (х1,у1) определяет верхний левый угол прямоугольника, а точка с координатами (х2,у2) определяет нижний правый угол (0 <= х1 < х2 <=GetМахХ и 0 <= у1 < у2 <= GetМахY).
При вычерчивании прямоугольника будут использоваться текущий тип строки и цвет, которые устанавливаются процедурой SetLineStyle.
Процедура DrawPoly Используя текущий тип прямой и текущий цвет рисует контур многоугольника.
Описание: DrawPoly(числ_коорд : word; var коорд_верш)
Примечания: Параметр "коорд_верш" является нетипизованным параметром, который содержит координаты каждого пересечения в многоугольнике. Параметр "числ_коорд" задает число координат в "коорд_верш". Координата состоит из двух слов: значения x и значения y.
Если при вычерчивании многоугольника происходит ошибка, то функция GraphResult будет возвращать значение -6.
Заметим, что для вычерчивания замкнутой фигуры с n вершинами вы должны передать при обращении к процедуре DrawPoly n+1 координату, где координата вершины с номером n будет равна координате вершины с номером 1 (см. приведенный ниже пример).
Пример:
const Triangle : array[1..4] of PolyPoint=((x:10;y:100),(x:100;y:100),(x:150;y:150),(x:50;y:100);
begin
...
DrawPoly(SizeOf(Triangle) div SizeOf(PolyPoint), Triangle);
...
end.
Процедура Circle Рисует окружность. Точка (Х,Y) считается центром окружности.
Описание: Circlе(Х,Y : integer; радиус : word)
Примечания: Окружность рисуется текущим цветом. В каждом графическом драйвере содержится коэффициент относительного удлинения, который используется в процедурах Сirclе, Аrс и РiеSliсе.
Пример:
for r := 1 to 5 do
Circle(100,100,r*10);
Процедура Arc Вычерчивает дугу окружности от начального угла до конечного угла. Точка (x,y) используется, как центр окружности.
Описание: Аrс(Х,Y:integer; нач_угол, кон_угол, радиус:word)
Примечания: Рисует дугу окружности с центром (x,y) и радиусом "радиус". Дуга рисуется от начального угла ("нач_угол") до конечного угла ("кон_угол"). При этом используется текущий цвет. Начальный угол, равный 0 и конечный угол, равный 359, задают вычерчивание полной окружности.
Пример:
for f := 1 to 5 do
Arc(100, 100, 0, 89, f*10);
Процедура Ellipse Рисует эллиптическую дугу от начального угла до конечного угла, используя (Х,Y) в качестве точки центра.
Описание: Еllipsе(Х, Y : integer; нач_угол, кон_угол :word; радХ, радУ : word)
Примечания: Процедура рисует эллиптическую дугу, используя (Х,Y), как точку центра, а "радХ", "радУ" - как горизонтальную и вертикальную полуоси. Дуга эллипса вычерчивается от начального угла (параметр "нач_угол") до конечного угла (параметр "кон_угол") текущим цветом. Значение начального угла, равное 0, и конечного угла, равное 359, приведут к вычерчиванию полного эллипса.
Процедура SetLineStyle Устанавливает текущую толщину и тип линии.
Описание: SetLineStyle(тип_строки : word; образец :word; толщина : word)
Примечания: Данная процедура влияет на все типы линий, вычерчиваемые процедурами Line, LineTo, RecTangle, DrawPoly, Arc, Circle и др.
Могут вычерчиваться непрерывные, пунктирные линии, линии, состоящие из точек или точек и тире. Если процедуре SetLineStyle иередаются неверные параметры, то GraphResult будет возвращать значение -11(grError) и текущие установки останутся неизмененными. Описаны следующие константы:
Константа |
Значение |
Описание |
SolidLn |
0 |
непрерывная линия |
DottedLn |
1 |
линия из точек |
CenterLn |
2 |
линия из точек и тире |
DashedLn |
3 |
пунктирная линия |
UserBitLn |
4 |
тип, определяемый пользователем |
NormWidth |
1 |
нормальная толщина |
ThickWidth |
3 |
жирная линия |
Когда в качестве параметра процедуру SetLineStyle передается UserBitLn, то в качестве BitPattern для строки будет использоваться параметр "образец".
Пример:
uses Graph;
var GraphDriver, GraphMode : integer;
x1, y1, x2, y2 : integer;
begin
GraphDriver := Detect;
InitGraph(GraphDriver,GraphMode,'');
if GraphResult <> grOk then
Halt(1);
x1 := 10;
y1 := 10;
x2 := 200;
y2 := 150;
SetLineStyle(DottedLn,0,NormVidth);
Rectangle)x1,y1,x2,y2);
SetLineStyle(UserBitLn,$C3,ThickWidth);
Rectangle(Pred(x1), Pred(y1), Succ(x2), Succ(y2));
end.
Процедура SetFillPattern Выбирает заданный пользователем образец закраски.
Описание: SetFillPattern(Pattern : FillPatternType; Color : word)
Примечания: Устанавливает тип закраски и ее цвет для всех типов закраски, выполняемых процедурами FillPoly, Bar, FloodFill, Bar3D и PieSlice, битовый образец закраски, задаваемый процедурой Pattern, и цвет, задаваемый процедурой Color.
Тип FillPatternType предварительно определяется следующим образом:
type FillPatternType = array[1..8] of byte;
Образец закраски основывается на внутренних байтовых значениях, содержащихся в массиве Pattern. Этот массив имеет длину 8 байтов и каждый байт 8 элементам изображения в образце закраски. Если бит в байте образца закраски принимает значение 1, то элемент изображения будет построен. Следующий образец закраски представляет собой, например, закраску в виде "шахматной доски" (50% полутон):
Двоичный вид |
Шестнадцатеричный вид |
|
10101010 |
$AA |
первый байт |
01010101 |
$55 |
второй байт |
10101010 |
$AA |
третий байт |
01010101 |
$55 |
четвертый байт |
10101010 |
$AA |
пятый байт |
01010101 |
$55 |
шестой байт |
10101010 |
$AA |
седьмой байт |
01010101 |
$55 |
восьмой байт |
Определенные пользователем типы закраски позволяют вам создавать типы закраски, отличающиеся от заранее определенных, которые могут выбираться с помощью процедуры SetFillStyle. Всякий раз, когда вы выбираете новый образец закраски с помощью процедур SetFillPattern или SetFillStyle все операции закраски будут выполняться с использованием этого типа закраски. При обращении вида SetFillStyle(UserField, SomeColor) всегда будет выбираться образец, заданный пользователем. Это позволяет вам определять и использовать с помощью процедуры SetFillPattern новый образец закраски, а затем переходить от встроенного образца закраски к новому, заданному вами, обращаясь к процедуре GetTextStyle.
Пример:
uses Graph;
const Gray50:FillPatternType = ($AA, $55, $AA, $55, $AA, $55,$AA, $55);
var Driver, Mode: integer;
begin
Driver := Detect; { перевести в графический режим }
InitGraph(Driver, Mode, '');
if GraphResult <> 0 then
Halt(1)
SetFillPattern(Gray50, White);
Bar(0, 0, 100, 100); { нарисовать столбец, используя 50% полутон }
Readln;
CloseGraph;
end.
Процедура SetFillStyle Устанавливает тип закраски и ее цвет.
Описание: SetFillStyle(образец : word; цвет : word)
Примечания: Устанавливает образец и цвет закраски для всех типов закраски, выполняемых процедурами FillPoly, Bar, Bar3D, и PieSlice. Можно использовать множество типов закраски. По умолчанию выбирается сплошная закраска белого цвета.
Определены следующие константы:
Константа |
Значение |
Описание |
EmptyFill |
0 |
заполнить область фоновым цветом |
SolidFill |
1 |
непрерывное заполнение област за- данным цветом |
LineFill |
2 |
заполнить --- |
LtSlashFill |
3 |
заполнить /// |
SlashFill |
4 |
заполнить жирными линиями /// |
BkSlashFill |
5 |
заполнить \\\ (жирными линиями |
LtBkSlashFill |
6 |
заполнить \\\ |
HatchFill |
7 |
заполнить редкой штриховкой |
XhatchFill |
8 |
заполнить частой пересекающейся штриховкой |
InterLeaveFill |
9 |
заполнить прерывистой линией |
WideDotFill |
10 |
заполнить редкими точками |
CloseDotFill |
11 |
заполнить частыми точками |
Пример:
SetFillStyle(SolidFill,0);
Bar(x1,y1,x2,y2);
SetFillStyle(XHatchFill,0);
Bar(x1,y1,x2,y2);
Процедура FloodFill Заполняет ограниченную облать, используя текущий заполнитель.
Описание: FloodFill(x, y, граница : word)
Примечания: Эта процедура используется для заполнения замкнутой области (для растровых устройств). Точка (x,y) является внутренней точкой заполняемой области. Для заполнения области, ограниченной цветом, который определяет параметр "граница", используется текущий образец закраски. Если точка (x,y) находится внутри замкнутой области, то заполняется внутренняя область. Если эта точка находится вне замкнутой области, то заполняется ее внешняя часть (поле экрана, не входящее в область).
Если при заполнении области происходит ошибка, то функция GraphResult возвращает значение -7 (grNoFloodMem).
Заметим, что процедура FloodFill останавливается после того, как выведено две пустых строки. Это может произойти в том случае, когда заполнитель и маленький прямоугольник сливаются. В следующей программе прямоугольник полностью не закрашивается:
program StopFill;
uses Graph;
var Driver, Mode: integer;
begin
Driver := Detect;
InitGraph(Driver, Mode, 'c:\bgi');
if GraphResult <> grOk then
Halt(1);
SetFillStyle(LtSlashFill, GetMaxColor);
Rectangle(0, 0, 8, 20);
FloodFill(1, 1, GetMaxColor);
ReadLn;
CloseGraph;
end.
В этом случае прямоугольник будет полностью закрашен, если использовать более "густой" заполнитель типа SlashFill.
Процедура ClearDevice
Функция: Сбрасывает состояние текущего графического экрана и подготавливает его для вывода данных
Описание: ClearDevice
Примечания: Данная процедура очищает устройство и сбрасывает все графические параметры, устанавливая для них те значения, которые предусмотрены по умолчанию (текущий указатель, палитру, цвет, область вывода). Процедура перемещает текущий указатель в точку с координатами (0,0).
Пример:
Randomize;
repeat
LineTo(Random(200), Random(200));
until KeyPressed;
ClearDevice;
Readln;
Процедура SetViewPort Устанавливает для графического вывода текущую область просмотра или окно.
Описание: SetViewPort(х1, у1, х2, у2 : word;
Примечания: Точка (x1,y1) задает верхний левый угол области просмотра, а точка с координатами (x2,y2) определяет нижний правый угол (0 <= y1 < x2 и 0 <= y1 < y2). Левый верхний угол экрана задается координатами (0,0). Булевская переменная Сliр определяет будет ли изображение отсекаться текущими границами области просмотра.
Процедура SetViewPort(0,0,GetMaxX,GetMaxY,True) всегда задает в качестве области просмотра все поле графического экрана. Определены следующие константы:
const
ClipOn := true;
ClipOff := false;
Все графические команды (например, GetX, ОutТехt, Rectangle, МоvеТо и т. д.) зависят от текущей области просмотра. В качестве примера заметим, что процедура МоvеТо перемещает текущий указатель в точку (5,5) внутри области просмотра (абсолютными координатами данной точки были бы координаты (15,25)).
Если булевская переменная Сliр установлена в значение Тruе, то, когда выполняется обращение к процедуре SetViewPort, все рисунки будут обрезаться на границах текущей области просмотра. Заметим, что "текущий указатель" никогда не отсекается. В следующем примере прямая линия не будет нарисована полностью, поскольку она будет обрезана на границе области просмотра:
SetWiewPort(10, 10, 20, 20, ClipOn);
Line(0, 5, 15, 5);
Если бы не выполнялось отсечение, то прямая должна была бы начинаться в точке с абсолютными координатами (10,15) и заканчиваться в точке с абсолютными координатами (25,15). Но, поскольку выполнялось отсечение, то в действительности прямая будет вычерчиваться, начиная с точки с абсолютными координатами (10,15), и заканчивается в точке (20,15).
Процедуры InitGraph, ClearDevice и SetGraphMode сбрасывают определение текущей области просмотра и устанавливают в качестве области просмотра весь экран. Текущее определение области просмотра можно получить с помощью процедуры GetViewSettings, которая воспринимает параметры следующего глобального типа:
type ViewPortType = record
x1, y1, x2, y2 : word;
Clip : boolean;
end;
Процедура SetViewPort перемещает текущий указатель в точку с координатами (0,0).
Пример 2:
const vp1 : ViewPortType = (x1 : 10; y1 : 80; x2 : 100; y2 : 150; Clip : ClipOn);
vp2 : ViewPortType = (x1 : 110; y1 : 0; x2 : 150; x2 : 70; Clip : ClipOn);
var GraphDriver, GraphMode : integer;
begin
GraphDriver := Detect;
InitGraph(GraphDrivet,GraphMode,'');
if GraphRasult <> grOk then
Halt(1);
with vp1 do
begin
Rectangle(Succ(x1), Succ(y1), { нарисовать контур области просмотра }
Pred(x2), Pred(y2));
SetViewPort(x1, y1, x2, y2, ClipOn);
OutText('Область просмотра');
end;
{ полный экран }
SetViewPort(0, 0, GetMaxX, GetMaxY, ClipOn);
with vp2 do
begin
{ нарисовать контур второй области просмотра }
Rectangle(Succ(x1), Succ(y1), { нарисовать контур области просмотра }
Pred(x2), Pred(y2));
SetViewPort(x1, y1, x2, y2, ClipOn);
OutText('Область просмотра 2');
end;
Readln;
CloseGraph;
end.
Процедура ClearViewPort Очищает текущую область просмотра (окно).
Описание: ClearViewPort
Примечания: Очищается текущая область просмотра. При этом используется цвет, сохраненный в Раlettе(0), вызывается процедура Bar и текущий указатель перемещается в точку с координатами (0,0). Если при очистке области просмотра возникает ошибка, процедура GraphResult возвращает значение 6.
Пример:
begin
...
SetViewPort(10, 10, 100, 100, ClipOn);
SetColor(White);
OutText('Для очистки области просмотра нажмите <RETURN>);
ClearViewPort;
...
end;
Процедура GetViewSettings Позволяет пользователю выдать запрос о текущей области просмотра на экране и параметрах "вырезанного" изображения.
Описание: GetViewSettings(var ViewPort : ViewPortType)
Примечания: Данная процедура возвращает переменную типа ViewPortType. Этот тип предварительно описан следующим образом:
type ViewPortType = record
x1, y1, x2, y2: integer;
Clip : boolean;
end;
Точки (x1,y1) и (x2,y2) представляют собой размеры активной области просмотра. Параметр Clip представляет собой переменную булевского типа и указывает на наличие "вырезанного" (отсеченного за заданными границами) изображения.
Пример:
uses Graph;
var Gd, Gm : integer;
ViewPortType = ViewPortType;
begin
Gd := Detect; { перевести в графический режим }
InitGraph(Gd, Gm, '');
if GraphResult < 0 then
Halt(1);
GetViewSettings(ViePort);
with ViewPort do
begin
Rectangle(0, 0, x2 x1, y2 y1);
if Clip then
OutText('Отсечение изображения не активно');
else
OutText('Сегодня отсечение изображения не действует');
end;
Readln;
CloseGraph;
end.
Процедура RestoreCrtMode Возвращает режим экрана в исходное состояние (то, какое существовало до инициализации графики).
Описание: RestoreCrtMode
Примечания: Восстанавливает исходный видеорежим, обнаруженный процедурой InitGraph. Данная процедура может использоваться вместе с процедурой SetGraphMode для переключения между текстовым и графическим режимом.
Пример:
uses Graph;
var GraphDriver, GraphMode : integer;
begin
GraphDriver := Detect;
InitGraph(GraphDriver,GraphMode,'');
if GraphResult <> grOk then
Halt(1);
OutText('Для выхода из графики нажмите RETURN:');
Readln;
RestoreCrtMode;
Writeln('Теперь вы в текстовом режиме');
Readln;
SetGraphMode(GetGraphMode);
OutTextXY(0, 0, 'Вы снова в графическом режиме');
OutText(0, TextHeight('H'), 'Для выхода нажмите RETURN');
Readln;
CloseGraph;
end.
