Незаполненные и заполненные фигуры

 

Без построения различных графических фигур не обходиться ни одна серьёзная графическая система. Например, при построении меню используются прямоугольники, в которые помещаются названия режимов; круговые диаграммы строятся из окружностей и секторов и т.д. Библиотека Graph содержит ряд проце-дур, которые формируют различные фигуры на основе задаваемых параметров. Цвет, стиль и толщина линии для вычерчивания берутся по умолчанию или устанавливаются соответственно процедурами SetColor и SetFillStyle.

1.Для построения прямоугольных фигур применяется процедура Rectangle.

Заголовок процедуры:

 

Procedure Rectangle (x1, y1, x2, y2: integer)

 

Данная процедура отображает прямоугольник с использованием текущего стиля и цвета линии. Параметры (x1,y1) и (х2,у2) - координаты соответственно верхнего левого и нижнего право правого углов прямоугольника.

2. Процедура Bar рисует прямоугольник, область внутри его залита по текущему шаблону.

Еще более наглядное представление информации при рисовании диаграмм позволяет получить процедура

Bar3D(x1,y1,x2,y2:Integer; D3:Word;Top:Boolean)

Где параметр Top задает режим отображения верхней плоскости.

True – отображать, TopOn

False – не отображать, TopOff

 

Пример 20. программы использования процедуры Rectangle:

 

program primer;

uses graph;

var gd,gm: integer;

begin

gd:=detect;

initgraph(gd,gm,");

SetBkColor(15);SetColor(red);SetLineStyle(0,0,3);

Rectangle(100,100,3 00,200);

SetColor(green);SetLineStyle(1,0,1);

Rectangle(350,100,550,200);

SetColor(blue);SetLineStyle(2,0,l);

Rectangle(100,250,300,350);

SetColor(yellow);SetLineStyle(3,0,3);

Rectangle(350,250,550,350);

readln;

closegraph;

end.

 

В приведённом примере на экране изображаются четыре прямоугольника. Перед рисованием каждого прямоугольника устанавливается цвет рисования (процедура SetColor) и стиль линии (процедура SetLineStyle), затем с помощью процедуры Rectangle рисуется прямоугольник заданного размера. В конце программы осуществляется задержка (чтобы можно было увидеть результат - ReadLn) и выход из графического режима(closegraph). Запустите интегрированную среду программирования, введите текст программы и запишите на диск, затем откомпилируйте его и проверьте действие программы.

 

Пример 21: построение двух прямоугольников используя процедуры - Rectangle, Bar, соединенных прямыми линиями.

Program lin1;

Uses graph, crt;

Var gd,gm:integer;

Begin

gd:= detect;

Initgraph(gd,gm,’’);

Line(20,100,40,100); Rectangle(40,60,80,120);

Line(80,100,140,100); Bar(140,80,200,120);

Readln;

Closegraph;

End.

 

 

Для того чтобы нарисовать окружность применяется процедура Circle.

Заголовок процедуры:

 

Procedure Circle (x, у: integer; Rad: Word)

 

Данная процедура вычерчивает окружность. Параметры x и y-определяют координаты центра окружности, Rad - радиус окружности (в пикселях, по горизонтали). Например, процедура Circle(150,200,100) нарисует окружность с центром в точке с координатами (150,200) и радиусом равным 100. Окружность вычерчивается текущим цветом, установленным с помощью процедуры SetColor. При этом используется стиль линии, определённый процедурой SetLineStyle с единственным исключением: каким бы ни был текущий тип линии (точечная или пунктирная), окружность всегда рисуется сплошной линией.

 

Пример22: программы использования процедуры Circle:

 

program okrugnost;

uses graph;

var gd,gm:integer;

begin

gd:=detect;

initgraph(gd,gm,");

SetBkColor(yellow);SetColor(red);SetLineStyle(0,0,3);

Circle(100,100,50);

SetColor(green);SetLineStyle(0,0,3);

Circle(400,l 00,75);

SetColor(blue);SetLineStyle(0,0,l);

Circle(250,300,90);

readln;

closegraph;

end.

 

В приведённом примере на экране на жёлтом фоне изображаются три окружности разного радиуса, цвета и толщины линии. Цвет устанавливает процедура SetColor, а толщину линии процедура SetLineStyle. В конце программы осуществляется задержка (чтобы можно было увидеть результат - ReadLn) и выход из графического режима(closegraph). Запустите интегрированную среду программирования, введите текст программы и запишите на диск, затем откомпилируйте его и проверьте действие программы.

Пример 23: использования процедуры Circle:

 

program krugi2;

uses graph;

var gd,gm: integer;

x,y:real;

begin

randomize;

gd:=detect;

initgraph(gd,gm,");

while x<=200 do

begin

setcolor(random(15));

circle(random(600),random(400),random(50));

x:=x+1;

Delay(700);

end;

readln;

Closegraph;

end.

 

В этой программе на экран выводятся 200 окружностей разного радиуса и цвета. Цвет окружности выбирается случайным образом с помощью процедуры SetColor. Также случайным образом определяется координаты центра окружности и радиус. Запустите интегрированную среду программирования, введите текст программы и запишите на диск, затем откомпилируйте его и проверьте действие программы.

Пример 24: Построение четырех внутренних с радиусом 10 и четырех внешних окружностей с радиусом 20 .

Program krug;

Uses graph, crt;

Var Gd,gm,I,x:integer;

Begin

Gd:= detect; Initgraph(gd,gm,’ ’);

x=x+60;

For I:=1 to 4 do

begin

circle (x,80,20); circle(x,80,10); x:=x+40;

end;

readln;

closegraph;

end.

Для имитации объемных фигур, используются дуги. Они вычерчиваются с помощью процедуры:

Arc(x,y:Integer; StAngle, EndAngle, Radius:Word),

где x,y – центр окружности;

StAngle – начальный угол;

EndAngle – конечный угол, отсчитывается от горизонтальной оси против часовой стрелки.

Radius – радиус.

Если StAngle=0 EndAngle=359, то вычерчивается полная окружность.

 

Построение круговой диаграммы показано на рисунке 3.

y

 

вращение против часовой стрелки

 
 

 


конечный угол

 

начальный угол

x

рисунок 3 Круговая диаграмма

 

Процедура Arc(x,y:Integer; StAngle, EndAngle, Radius:Word),рисует дугу окружности: Углы отчитываются против часовой стрелки и указываются в градусах. Нулевой угол соответствует горизонтальному направлению вектора слева направо. Если задать значения начального угла 0 и конечного 359, то будет выведена полная окружность.

 

Пример 25.построение дуги через процедуру Arc(x,y, StAngle, EndAngle, Radius).

 

Program arg1;

Uses graph, crt;

Var Gd,Gm, Integer;

Begin

Gd:=detect;

Initgraph(Gd,Gm, ‘ ’);

Arc (80,100,45.180,30); Рисунок 4 построения дуги с

Readln; координатами центра 80,100

Closegraph;

End.

Вот как выглядят две дуги: одна с углами 0 и 100, вторая 300 и 540 (рисунок 5)

 
 

 

 


Рисунок 5 Пример дуг с разными начальными и конечными углами

 

Пример 26 программы использования процедуры Arc:

 

program primer;

uses graph;

var gd,gm,i:integer;

begin

gd:=detect;initgraph(gd,gm,'');

SetBkColor(15);

Randomize;

SetLineStyle(0,0,1);

For i:=1 to 20 do

begin

SetColor(random(15));Arc(300,200,90+i*10,350+i*10,50+i*5);

end;

readln;closegraph;

end.

В этой программе на экран выводятся 20 дуг окружностей разного радиуса и цвета. В начале программы после инициализации графики(initgraph) устанавли-ваем цвет фона с помощью процедуры SetBkColor. Затем с помощью процедуры SetLineStyle устанавливаем стиль линии, которыми будут вычерчиваться дуги. После этих установок с помощью цикла рисуются 20 дуг, у которых одинаковый центр (точка с координатами 300 и 200) но разные начальные и конечные углы, а также разные радиусы. Цвет дуги выбирается случайным образом с помощью про

цедуры SetColor. Запустите интегрированную среду программирования, введите текст программы и запишите на диск, затем откомпилируйте его и проверьте действие программы.

Если существует необходимость нарисовать эллипс, то применяется процедура Ellipse.

Заголовок процедуры:

 

Procedure Ellipse (x,y:integer; BegA, EndA, RX, RY:Word);

 

Эта процедура вычерчивает эллипсную дугу. Параметры х и у – коорди-наты центра эллипса, BegA и EndA – соответственно начальный и конечный углы дуги, RX и RY – горизонтальный и вертикальный радиусы эллипса в пикселях ( рисунок 6).

 
 

 

 


Рисунок 6 Пример эллипса

 

Эллипс вычерчивается текущим цветом, установленным с помощью процедуры SetColor. При этом используется стиль линии, определённый процедурой SetLineStyle с единственным исключением: каким бы ни был текущий тип линии (точечная или пунктирная), эллипс всегда рисуется сплошной линией.

 

Пример 27 программы использования процедуры Ellipse:

 

uses graph;

var gd,gm,i:integer;

begin

gd:=detect;

initgraph(gd,gm,'');

SetBkColor(7); SetLineStyle(0,0,1);SetColor(4);

Ellipse(100,150,0,360,30,80);

SetColor(1);

Ellipse(300,150,0,180,30,80);

SetLineStyle(0,0,3);SetColor(8);

Ellipse(200,300,90,360,30,80);

SetLineStyle(0,0,1); SetColor(13);

Ellipse(500,150,90,270,30,80);

SetLineStyle(0,0,3);SetColor(2);

Ellipse(400,300,30,340,30,80);

readln;

closegraph;

end.

 

В этой программе на экран выводятся 5 дуг эллипсов. Каждая дуга эллипса имеет свой центр свои начальный и конечный радиусы и начальные и конечные углы. Перед вычерчиванием каждой дуги эллипса устанавливается стиль линии (процедура SetLineStyle) и цвет (процедура SetColor). Запустите интегрированную среду программирования, введите текст программы и запишите на диск, затем откомпилируйте его и проверьте действие программы.

Помимо незаполненных фигур, средства модуля Graph позволяют выводить на экран также заполненные фигуры. С использованием заполнений мы познакомились в разделе «Цвета, палитры, заполнения» (см. выше). Далее мы рассмотрим процедуры, которые выводят на экран уже заполненные фигуры.

Для того, чтобы заполнить замкнутую область экрана, необходимо применить процедуру FloodFill.

Заголовок процедуры:

 

Procedure FloodFill(x,y:integer; Border:word);

 

Данная процедура заполняет произвольную замкнутую область используя стиль заполнения (шаблон и цвет).

Параметры х и у – координаты произвольной точки в области, которую требуется заполнить, Border – код цвета линии, ограничивающий заполняемую область. Нужный стиль заполнения должен быть предварительно задан процедурой SetFillStyle. Если точка с координатами (х,у) находится внутри замкнутой области, заполненной окажется эта область. Если точка находится снаружи замкнутой области, заполняется все пространство вне области. Если же область окажется незамкнута, заполненным окажется весь экран.

 

Пример28: программы использования процедуры FloodFill:

 

program primer;

uses graph;

var gd,gm,i:integer;

begin

gd:=detect;

initgraph(gd,gm,'');

SetBkColor(7);SetLineStyle(0,0,3);SetFillStyle(8,5);SetColor(4);

Circle(GetMaxX div 2,GetMaxY div 2,200);

SetColor(1);

Line(320,45,490,333);

Line(147,333,490,333);

Line(147,333,320,45);

SetColor(2);

Rectangle(250,180,390,290);

FloodFill(GetMaxX div 2,GetMaxY div 2,2);

readln;

closegraph;

end.

 

В приведённом примере показано как применяется процедура FloodFill. Прежде чем закрашивать замкнутую область нарисуем следующий рисунок. Сначала установим цвет фона с помощью процедуры SetBkColor. Потом с помощью процедуры SetLineStyle установим стиль линии, которой будет вычерчиваться рисунок. И, наконец, процедура SetFillStyle позволит нам определить шаблон и цвет заполнения замкнутой области. После этого установив цвет рисования (процедура SetColor) нарисуем окружность красным цветом. Внутри окружности нарисуем линиями треугольник синим цветом, а внутри треугольника нарисуем прямоугольник синим цветом (см. рисунок 7а).

Весь рисунок мы сделаем таким образом, чтобы центр окружности попал в треугольник и в прямоугольник. После построения такого рисунка применим процедуру FloodFill. В качестве первых двух параметров этой процедуры возьмём координаты центра окружности. Третий параметр процедуры FloodFill мы будем менять. Если в качестве третьего параметра мы возьмём число 2 (что соответствует цвету нарисованного прямоугольника) то на нашем рисунке закраситься только прямоугольник (см. рисунок 7б). Если вместо числа два мы поставим число 1 (что соответствует цвету нарисованного треугольника) то закраситься треугольник и всё что находиться внутри него (см. рисунок 7в). Ну и, наконец, если в качестве третьего параметра процедуры FloodFill мы возьмём число 4 (что соответствует цвету нарисованной окружности) то произойдет закраска этой окружности и всего того, что находиться внутри неё (см. рисунок 7г).

Запустите интегрированную среду программирования, введите текст программы и запишите на диск, затем откомпилируйте его и проверьте действие программы.

 

 


Рисунок 7 Пример работы процедуры FloodFill

 

Пример 29: Построение 5 внутренних эллипсов

Program ellips;

Uses graph, crt;

Var gd,gm,x,I :integer;

Begin

Gd:= detect;

Initgraph(gd,gm,’’);

X:=0;

For I:=1 to 5 do

Begin

Ellipse(180,200,0,360,50,89+x);

X:=x+10;

readln;

closegraph;

end.

Закрашенный многоугольник

FillPoly(число вершин,двумерный массив координат вершин);

В строке массива записывавют координаты Х, У одной вершины.

Эта процедура по своему действию очень похожа на процедуру DrawPoly.

 

Фрагмент программы рисования закрашенного треугольника :

…………….

Const T:array[1..3,1.2] of Integer= ((20,50),(10,30),(50,10));

Begin

…………..

SetFillStyle(1,2); {1- Сплошная закраска зеленым цветом- 2}

SetPoly(3,T); {Рисуется закрашенный треугольник}

…..………

Процедуры, которые используются для заполнения секторов окружностей и эллипсов. Рисование сектора эллипса, который будет залит цветом по текущему шаблону.

Sector (X,Y:Intejer; StAngle, EndAngle,XR,YR:Word) параметры этой процедуры аналогичны Arc,Ellipse.

 

Чтобы разделить окружность на несколько секторов

PieSlice (X,Y: Intejer; StAngle, EndAngle, Radius: Word) вычеркивает и заполняет текущим узором сектора круга

Где X,Y – центр окружности.

Высота сектора задается значением 2 углов StAngle, EndAngle.

1.FillEllipse (X,Y:Integer; XR,YR:Word) Процедура служит для вычеркивания контура эллипса текущим цветом и заполнение ограниченной контурами области экрана текущим узором.

 

Если чередовать операторы SetFillStyle и PieSlice можно изобразить круговую диаграмму.

2.Заполнение более сложной фигуры

Floodfill – заполнение области расположенной в нутрии замкнутого контура, либо вне его.

Floodfill(X,Y:Integer;Border:Word)

X,Y – координаты в нутрии или вне замкнутого контура.

Border – задает цвет контура.

 

Примеры 30: рисования окружностей и их закрашивание .

Program krug2;

Uses graph, crt;

Var Gd,gm,i :integer;

Begin

gd:= detect;

Initgraph(gd,gm,’ ’);

i:=0

Repeat

Setcolor(15); circle (320,235,230); setfillstyle(1,i); floodfill(320,235,15);

readln; i:=i+1;

until i>15;

closegraph;

end.

 

Примеры 31:

Program krug3;

Uses graph, crt;

Var gd,gm :integer;

Begin

gd:= detect;

Initgraph(gd,gm,’ ’);

Ellipse(220,150,180,90,100,100); Line(220,150,120,150); Line(220,150,220,50);

Circle(170,100,50);

Ellipse(170,100,0,360,50,10);

readln;

closegraph;

end.

Пример 32:

Program krug4;{ рисование эллиптических дуг}

Uses graph, crt;

Var gd,gm,x,y :integer;

Begin

gd:= detect;

Initgraph(gd,gm,’ ’);

setBkcolor(Blue)

x:=getmaxx div 2;

y:= getmaxy div 2;

repeat

if random(100)=1 then setcolor(random(16));

x:=x+ random(5)-2;

y:=y+ random(5)-2;

ellipse(x,y,340,200,50,40);

until keypressed;

readln;

closegraph;

end.

Пример 33:

Program krug5; {красная окружность разделенная на несколько секторов и сектора залиты синей клеткой}

Uses graph, crt;

Var gd,gm :integer;

Begin

gd:= detect;

Initgraph(gd,gm,’ ’);

Setfillstyle(8, lightblue);

Setcokolor(12;

Setlinestyle(2,0,3);

Circle(320,235,230);

Pieslice(320,235,30,90,230);{деление окружности на несколько секторов}

readln;

closegraph;

end.