Среда, 16.07.2025, 11:20 Приветствую Вас Гость

On-line: Книги, учебники, статьи

Главная | Регистрация | Вход | RSS

Краски, палитры, заполнения(3)

Процедура FloodFill.

Заполняет произвольную замкнутую фигуру, используя текущий стиль заполнения (узор и цвет). Заголовок:

Procedure FloodFill(X,Y: Integer; Border: Word);

Здесь X, Y- координаты любой точки внутри замкнутой фигуры; Border - цвет граничной линии.

Если фигура незамкнута, заполнение «разольется» по всему экрану.

Следует учесть, что реализованный в процедуре алгоритм просмотра границ замкнутой фигуры не отличается совершенством. В частности, если выводятся подряд две пустые строки, заполнение прекращается. Такая ситуация обычно возникает при заполнении небольших фигур с использованием типа LtSlashFill. В фирменном руководстве по Турбо Паскалю рекомендуется, по возможности, вместо процедуры FloodFill использовать FillPoly (заполнение прямоугольника).

Следующая программа демонстрирует заполнение случайных окружностей. Сначала в центре экрана создается окно, в котором заполняется небольшой прямоугольник. Часть прямоугольника останется незаполненной, в чем Вы можете убедиться, так как программа в этот момент приостанавливает работу, ожидая нажатия на клавишу Enter. Затем осуществляется вывод и заполнение случайных окружностей до тех пор, пока не будет нажата любая клавиша. Замечу, что прямоугольник заполняется полностью, если вместо типа LtSlashFill (косая штриховка линиями обычной толщины) используется SlashFill (штриховка утолщенными линиями). Если программа будет работать достаточно долго, она может «зависнуть», что лишний раз свидетельствует о несовершенстве реализованного в ней алгоритма.

Uses Graph, CRT; 

var

d, r, е, х, у, с : Integer; 

begin

{Инициируем графику} 

d := Detect; InitGraph(d, r, ' ') ; 

e := GraphResult;

if e <> grOk then . . WriteLn(GraphErrorMsg(e)) 

else 

begin

{Создаем прямоугольное окно}  

х := GetMaxX div 4; 

у. := GetMaxY div 4; 

Rectangle(х,у,3*x,3*y);

SetViewPort(x+1,y+1, 3*x-1,3*y-1,ClipOn); 

{Демонстрируем заливку маленького прямоугольника} 

SetPillStyle(LtSlashFill,GetMaxColor); 

Rectangle(0,0,8,20); FloodFill(1,1,GetMaxColor); 

OutTextXY(10,25,'Press Enter...'); 

ReadLn; {Ждем нажатия Enter} 

{Выводим окружности до тех пор, пока не будет нажата любая клавиша} 

repeat

{Определяем случайный стиль заливки} 

SetFillStyle(Random(12),Random(GetMaxColor+1)); 

{Задаем координаты центра и цвет окружности} 

х := Random (GetMaxX div 2); 

у := Random (GetMaxY div 2); 

с := Random (succ(GetMaxColor)); 

SetColor(c); 

{Выводим и заливаем окружность}

Circle(x, у, Random(GetMaxY div 5)); 

FloodFill (x, у, с) 

until KeyPressed;

if ReadKey=#0 then 

x := ord(ReadKey); 

CloseGraph 

end 

end.

Процедура Bar.

Заполняет прямоугольную область экрана. Заголовок: 

Procedure Bar(X1,Y1,X2,Y2: Integer);

Здесь XJ...Y2 - координаты левого верхнего (X1, Y1) и правого нижнего (Х2, Y2) углов закрашиваемой области.

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

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

Uses Graph, CRT; 

var

d, r, e : Integer; 

begin

{Инициируем графику} 

d : = Detect; InitGraph(d, r, ''); 

e := GraphResult; if e <> grOk then

WriteLn(GraphErrorMsg(e)) 

else 

begin

{Создаем окно в центре экран} 

d := GetMaxX div 4; 

r := GetMaxY div 4; Rectangle(d,r,3*d,3*r);

SetViewPort(d+1,r+1,3*d-1,3*r-1,ClipOn); 

{Цикл вывода и закраски случайных многоугольников}  

repeat

SetFillStyle(Random(12),Random(succ(GetMaxColor))); 

Bar(Random(Ge tMaxX),Random(Ge tMaxY),

  Random(Ge tMaxX),Random(Ge tMaxY)); 

until KeyPressed;

if ReadKey=#0 then d := ord(ReadKey); 

CloseGraph 

end 

end.

Процедура Ваr3D.

Вычерчивает трехмерное изображение параллелепипеда и закрашивает его переднюю грань . Заголовок:

Procedure Ваr3D (X1,Y1,X2,Y2,Depth: Integer; Top: Boolean);

Здесь X1... Y2 - координаты левого верхнего (X1, Y1) и правого нижнего (Х2, Y2) углов передней грани; Depth - третье измерение трехмерного изображения («глубина») в пикселях; Тор - способ изображения верхней грани.

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

const

TopOn = True; 

TopOff = False;

При вычерчивании используется текущий стиль линий (SetLineStyle) и текущий цвет (SetColor). Передняя грань заливается текущим стилем заполнения (SetFillStyle).

Процедура обычно применяется при построении столбиковых диаграмм. Следует учесть, что параллелепипед «прозрачен», т.е. за его незакрашенными гранями могут быть видны другие элементы изображения.

Следующая программа иллюстрирует различные аспекты применения процедуры Bar3D.

Uses Graph,CRT;

var

d, r, e: Integer; 

begin

{Инициируем графику}

d := Detect;

Ini-tGraph(d, r, ' ') ;

e := GraphResult;

if e <> grOk then

WriteLn(GraphErrorMsg(e)) 

else 

begin

{Столбик с верхней гранью:} 

Bar3D (80, 100, 120, 180, 15, TopOn); 

{Столбик без верхней грани:} 

Ваг3D (150, 150, 190, 180, 15, TopOff); 

{Этот столбик "стоит" на следующем и прозрачен:} 

Bar3D (230, 50, 250, 150, 15, TopOn); 

Bar3D (220, 150, 260, 180, 15, TopOn); 

{У этого столбика нет верхней грани, и поэтому он не мешает поставленному на него сверху:} 

Bar3D (300, 150, 340, 180, 15, TopOff); 

SetLineStyle(3,0,1); 

SetColor(Yellow); 

SetFillStyle(LtSlashFill,Yellow); 

Bar3D (300, 50, 340, 150, 15, TopOn); 

if ReadKey=#0 then d := ord(ReadKey); 

CloseGraph;

end 

end.

Процедура Fill Poly.

Обводит линией и закрашивает замкнутый многоугольник. Заголовок:

Procedure FillPoly(N: Word; var Coords);

Здесь N - количество вершин замкнутого многоугольника; Coords - переменная типа PointType, содержащая координаты вершин.

Координаты вершин задаются парой значений типа Integer: первое определяет горизонтальную, второе - вертикальную координаты. Для них можно использовать следующий определенный в модуле тип:

type

PointType = record

х, у : Integer 

end;

Стиль и цвет линии контура задаются процедурами SetLineStyle и SetColor, тип и цвет заливки - процедурой SetFillStyle.

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

Uses Graph, CRT; 

var

d, r, e: Integer;

p : array [1..6] of PointType; n, k : Word; 

begin

{Инициируем графику} 

d := Detect; InitGraph(d, r, ' ') ; 

e := GraphResult; if e <> grOk then

WriteLn(GraphErrorMsg(e)) 

else 

begin

{Создаем окно в центре экрана}

d := GetMaxX div 4;

r := GetMaxY div 4;

Rectangle(d,r,3*d,3*r);

SetViewPort(d+l,r+l,3*d-l,3*r-l,ClipOn);

{Цикл вывода случайных закрашенных многоугольников}

repeat

{Выбираем случайный цвет и узор)

SetFillStyle(Random(12),Random(succ(GetMaxColor))); 

SetColor (Random(succ(GetMaxColor))); 

{Назначаем случайные координаты}

n := Random (4) + 3 ; for k := 1 to n do with p[k] do 

begin

x := Random (GetMaxX div 2);

у := Random (GetMaxY div 2)

end;

FillPoly (n, p) {Выводим и закрашиваем} 

until KeyPressed;

if ReadKey=#0 then k := ord(ReadKey); 

CloseGraph 

end 

end.

Процедура FillEllipse.

Обводит линией и заполняет эллипс. Заголовок:

Procedure FillEllipse(X,Y,RX,RY: Integer);

Здесь X, Y - координаты центра; RX, RY- горизонтальный и вертикальный радиусы эллипса в пикселях.

Эллипс обводится линией, заданной процедурами SetLineStyle и SetColor, и заполняется с использованием параметров, установленных процедурой SetFillStyle.

Процедура Sector.

Вычерчивает и заполняет эллипсный сектор. Заголовок: Procedure Sector(X,Y: Integer; BegA,EndA,RX,RY: Word);

Здесь BegA, EndA - соответственно начальный и конечный углы эллипсного сектора. Остальные параметры обращения аналогичны параметрам процедуры FillEllipse.

В следующей программе на экран выводятся случайные закрашенные эллипсы и секторы. Для выхода из программы нажмите любую клавишу.

Uses Graph, CRT; 

var

d, r, e : Integer; 

begin

{Инициируем графику} 

d := Detect; InitGraph(d, r, ''); 

e := GraphResult; if e <> grOk then

WriteLn(GraphErrorMsg(e)) 

else 

begin

{Создаем окно в центре экрана}

d := GetMaxX div 4;

r := GetMaxY div 4;

Rectangle(d,r,3*d,3*r);

SetViewPort(d+1,r+1,3*d-1,3*r-1,ClipOn);

{Цикл вывода}

repeat

SetFillStyle(Random(12), Random(succ(GetMaxColor))); 

SetColor (Random(succ(GetMaxColor))); 

Sector(Random(GetMaxX div),Random(GetMaxY div 2), 

Random(360),Random(360),Random(GetMaxX div 5),

Random(GetMaxY div 5)); 

FillEl.lipse (Random (GetMaxX div 2),

Random(GetMaxY div 2),Random(GetMaxX div 5), 

Random(GetMaxY div 5)) 

until KeyPressed;

if ReadKey=#0 then d := ord(ReadKey); 

CloseGraph 

end

end.

Процедура PieSlice.

Вычерчивает и заполняет сектор окружности. Заголовок: 

Procedure PieSlice(X,Y: Integer; BegA,EndA,R: Word);

В отличие от процедуры Sector, указывается лишь один горизонтальный радиус R, остальные параметры аналогичны параметрам процедуры Sector.

Сектор обводится линией, заданной процедурами SetLineStyle и SetColor, и заполняется с помощью параметров, определенных процедурой SetFillStyle. Процедуру удобно использовать при построении круговых диаграмм, как, например, в следующей программе (рис. 14.9).

Рис. 14.9. Иллюстрация процедуры PieSlice

Uses Graph, CRT; 

var

d, r, e : Integer; 

begin

{Инициируем графический режим} 

d := Detect;

InitGraph(d, r, ''); 

e := GraphResult; if e <> grOk then

WriteLn(GraphErrorMsg(e)) 

else

begin

{Выводим маленький сектор}

SetFillStyle(WideDotFill, White);

PieSlice(GetMaxX div 2+5,GetMaxY div 2+4,270,360,100);

{Выводим большой сектор}

SetFillStyle (SolidFill, Red);

PieSlice (GetMaxX div 2,GetMaxY div 2, 0,270,100).;

{Выводим надписи}

OutTextXY (GetMaxX div 2+90,GetMaxY div 2+70, '25%');

OutTextXY(GetMaxX div 2-50,GetMaxY div 2-20, '75%');

{Ждем нажатия на любую клавишу} 

if ReadKey=#0 then d := ord(ReadKey); 

Close,Graph 

end

end.

Вход на сайт
Поиск
Календарь
«  Июль 2025  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Архив записей
Наш опрос
Как Вам удобнее??
Всего ответов: 341
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0