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

DrawRectangle(X1,Y1, X2,Y2); Контур прямоугольника рисуется текущим пером. Внутренность прямоугольника не закрашивается
FillRectangle(X1,Y1, X2,Y2); Внутренность прямоугольника закрашивается текущей кистью. Контур прямоугольника не рисуется
Rectangle(X1,Y1, X2,Y2); Контур прямоугольника рисуется текущим пером. Внутренность прямоугольника закрашивается текущей кистью.

Пример 12.Задать квадратное графическое окно, окрасить его в красный цвет, нарисовать в центре окна чёрный квадрат.

UsesGraphABC; //подключение модуля

begin//начало программы

InitWindow(450,10,500,500,clRed); // отступы, размеры и цвет окна

SetWindowCaption('Чёрный квадрат в красном окне'); //заголовок окна

SetBrushColor(clBlack); //Цвет кисти - чёрный

FillRectangle(100,100,400,400); //закрашенный кистью прямоугольник

end.

Пояснение.

В разделе Uses программы подключен модуль GraphABC.

Процедура InitWindow(450,10,500,500,clRed);задаёт отступы окна 450 и 10 пикселов, задаёт размер окна - 500×500 пикселови окрашиваетокно в красный цвет.

Процедура SetWindowCaption ('Чёрный квадрат в красном окне'); задаёт заголовок графического окна.

Процедура SetBrushColor(clBlack);делает цвет кисти чёрным для закраски квадрата.

В центре экрана рисуется чёрный квадрат: FillRectangle(100,100,400,400);.

Пример 13.Прямоугольники разных цветов и прозрачности.

UsesGraphABC;

Begin

Window.Caption := 'Прозрачные прямоугольники';

Brush.Color := clRed; //красный

FillRectangle(50,50,100,Window.Height - 50);

Brush.Color := clGreen; //зелёный

FillRectangle(150,50,200,Window.Height - 50);

Brush.Color := clBlue; //синий

FillRectangle(250,50,300,Window.Height - 50);

Brush.Color := ARGB(127,255,0,0); //красный, прозрачность 127

FillRectangle(20,100,420,150);

Brush.Color := ARGB(63,0,255,0); //зелёный, прозрачность 63

FillRectangle(20,200,420,250);

Brush.Color := ARGB(31,0,0,255); //синий, прозрачность 31

FillRectangle(20,300,420,350);

End.

Шрифт

Вывод текста осуществляется текущим шрифтом. Для работы с текущим шрифтом используется объект Font(шрифт). Fontимеет ряд свойств. Среди них:

- Color – цвет шрифта (по умолчанию - clBlack);

- Style – стиль шрифта (по умолчанию – fsNormal);

- Size – размер шрифта в пунктах (по умолчанию – 10 пунктов);

Подложка текста имеет цвет Brush.Color(цвет кисти).

Стили шрифта

fsNormal – обычный;
fsBold – жирный;
fsItalic – наклонный;
fsBoldItalic – жирный наклонный;
fsUnderline – подчеркнутый;
fsBoldUnderline – жирный подчеркнутый;
fsItalicUnderline – наклонный подчеркнутый;
fsBoldItalicUnderline – жирный наклонный подчеркнутый.

Задание свойств шрифта.

Font.Color := clRandom;{цвет шрифта - случайный}

Font.Style := fsItalic;{стиль шрифта - наклонный}

Font.Size := 12{размер шрифта – 12 пунктов}

Такого же результата можно достичь, используя следующие процедуры:

SetFontColor(clRandom);{цвет шрифта - случайный}

SetFontStyle(fsItalic);{стиль шрифта - наклонный}

SetFontSize(12);{размер шрифта – 12 пунктов}

Пример 14.Ввести с клавиатуры вещественное число Х и вычислить значение Y=2X. Значения X и Y вывести в графическом окне.

UsesGraphABC;//подключение модуля

VarX, Y: Real;

Begin//начало программы

InitWindow(450,10,800,600,clSilver);// отступы, размеры и серебряный цвет окна

SetBrushColor(clWhite); //цвет кисти - белый

FillRectangle(50,50,750,550); //прямоугольник, закрашенный белой кистью

SetFontColor(clNavy); //цвет шрифта - тёмно-синий

SetFontSize(18); //размер шрифта - 18

SetFontStyle(fsBoldItalic); //стиль шрифта – жирный наклонный

TextOut(100,100,'Введите значение Х'); //вывод приглашения

ReadLn(X); //ввод значения Х

TextOut(100,130,'Вы ввели Х='); //вывод текста

TextOut(250,130,X); //вывод Х в ту же строку, правее

Y := 2*X; //вычисление Y

TextOut(100,180,'Ответ: Y = 2X ='); //вывод текста

TextOut(310,180,Y); //вывод Y в ту же строку, правее

end.

Пример 15.Нарисовать на экране Российский флаг. Внизу под флагом написать слово «РОССИЯ».

UsesGraphABC; //подключение модуля

begin//начало программы

InitWindow(450,10,800,600,clLightGray); // отступы, размеры и цвет окна

SetWindowCaption('Российский флаг'); //заголовок окна

SetBrushColor(clWhite); //цвет кисти - белый

FillRectangle(150,150,650,250); //закрашенный кистью прямоугольник

SetBrushColor(clBlue); //цвет кисти - синий

FillRectangle(150,250,650,350); //закрашенный кистью прямоугольник

SetBrushColor(clRed); //цвет кисти - красный

FillRectangle(150,350,650,450); //закрашенный кистью прямоугольник

SetBrushColor(clLightGray); //цвет кисти – серый (подложка под текст)

SetFontSize(66); //размер шрифта - 66

SetFontStyle(fsBoldItalic); //стиль шрифта – жирный наклонный

TextOut(200,480,'РОССИЯ'); //вывод слова РОССИЯ из точки (200,480)

end. //конец программы

Пояснение.

Создается графическое окно с заголовком 'Российский флаг'размером 800х600.

Окно окрашивается в светло-серый цвет.

Последовательно рисуются 3 прямоугольника: белого цвета, синего цвета, красного цвета друг под другом.

Под флагом выводится надпись'РОССИЯ'шрифтом размера 66 пунктов.

Часть II.

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

Пример 1.Работа с цветом и пером.
Хотим пересмотреть все возможные оттенки цвета Red.Нарисуем слева направо
256 вертикальных отрезков с нарастающей интенсивностью красного.

UsesGraphABC; // подключение модуля GraphABC

VarRed, // Red - интенсивность красного

h:Integer; // h – отступ вертикали от левого края окна

begin// начало программы

Window.Caption:='Красный цвет от 0 до 255';// заголовок окна

ForRed:=0 To255 Do// Red - составляющая красного от 0 до 255

begin// начало тела цикла

Pen.Color:=RGB(Red,0,0); // цвет пера задаём равным Red

Line(h,0, h,480); // рисуем вертикальный отрезок от h,0)до(h,480)

h:= h+1; // сдвигаемся на 1 пиксел вправо

end; // конец цикла

end. // конец программы

Пример 2.Сначала хаотично падают в окно 99 прямоугольников, нарисованных пером, но не закрашенных (DrawRectangle). Затем хаотично падают в окно 99 прямоугольников, закрашенных кистью, но не обведённых пером (FillRectangle). Цвет пера, кисти, а также размер и положение прямоугольников – случайны.

UsesGraphABC;

Varx, y, i: integer;

Begin

Window.Caption := 'DrawRectangle и FillRectangle';

Fori := 1 to99 do

Begin

Pen.Color := clRandom;

x := Random(Window.Width-100);

y := Random(Window.Height-100);

DrawRectangle(x,y,x+Random(100),y+Random(100));

Sleep(30);

end;

fori := 1 to99 do

Begin

Brush.Color :=clRandom;

x := Random(Window.Width-100);

y := Random(Window.Height-100);

FillRectangle(x,y,x+Random(100),y+Random(100));

Sleep(30);

end;

end.

Пример 3. Программа «Крупа». Сто тысяч и тридцать три пиксела случайного цвета рассыпаются по окну. Затем случайным цветом в окне выводится текст «PascalABC.NET”.

UsesGraphABC; //подключение модуля

Vari:integer; //объявление параметра цикла

begin//начало программы

Window.Caption :='Крупа'; //заголовок окна

Fori:=1 to100033 do//сто тысяч тридцать три пиксела

SetPixel(Random(Window.Width),Random(Window.Height),clRandom);

Font.Style := fsBoldItalic; //стильшрифта - жирныйнаклонный

Font.Size := 24; //задали размер шрифта - 24

Font.Color := clRandom; //задали случайный цвет текста

brush.Color:=ARGB(0,0,0,0); //задали прозрачную подложку текста

TextOut(200,220,'PascalABC.NET'); //вывод текста из точки (200,220)

end.

Пример 4. Программа «Долой прозрачность». Круги случайного цвета и размера с прозрачностью от 0 до 255 рассыпаются в окне.

UsesGraphABC;

VarTransparency: integer;

Begin

randomize;

forTransparency:=0 to255 do //прозрачность – параметр цикла

Begin

Brush.Color:=ARGB(Transparency,Random(256),Random(256),Random(256));

FillCircle(Random(Window.Width),Random(Window.Height),Random(20,60));

sleep(10);

end;

end.

Пример 5. Демонстрация работы со шрифтами.

UsesGraphABC; //подключение модуля

Vari: integer; //объявление переменных

begin//начало программы

Window.Caption := 'Шрифты'; //заголовок окна

Font.Style := fsBoldItalic; //стиль шрифта - жирный наклонный

Fori:=10 to17 do//параметр цикла - размер шрифта от 10 до 17

begin//начало тела цикла

Font.Size := i; //задали размер шрифта

Font.Color := clRandom; //задали случайный цвет

WriteLn('PascalABC.NET'); //вывели текст

end; //конец цикла

readln; //останов программы до нажатия Enter

Font.Style := fsBoldUnderline;

Fori:=10 to17 do

Begin

Font.Size := i;

Font.Color := clRandom;

WriteLn('PascalABC.NET');

end;

end. //конец программы

Пример 6. Имитация кругов на воде от капель дождя.

UsesGraphABC;

ProcedureKaplia(x0,y0: integer); //заголовок процедуры

Vari : integer; //локальная переменная

Begin

fori:=1 to63 do //вцикле – 63 итерации

Begin

Pen.Color := RGB(i*4,i*4,i*4); //перо – серое от тёмного к светлому

Circle(x0,y0,i); //стопка из 63-х кругов с растущим радиусом

Sleep(10);

end;

end;

BEGIN

Window.Caption := 'Капли дождя'; //заголовок окна

SetWindowSize(800,600); //размер окна

Randomize; //инициализация ГСЧ

WhileTrue do //бесконечный цикл

Kaplia(Random(800),random(600)); //вызов процедуры

END.

Пояснение.

Эффект капли реализован в процедуре Kapliaв цикле с параметром i, возрастающем от 1 до 63.

- Оператор Pen.Color := RGB(i*4,i*4,i*4);задаёт текущий цвет пера. Это серый цвет, его интенсивность в цикле меняется от тёмного к светлому.

- Оператор Circle(x0,y0,i); создает «стопку» из 63-х концентрических кругов. Радиус кругов в цикле растёт от 1 до 63, поэтому каждый следующий круг закрывает собой все предыдущие.

- Каждый круг имеет контур серого цвета– и каждый следующий круг имеет контур светлее, чем предыдущие. Чем больше диаметр круга, тем светлей его контур. Последний 63-й круг почти не виден на белом фоне окна.

- Все круги закрашиваются белой кистью (по умолчанию).

Таким образом, каждый вызов процедуры имитирует расходящийся круг на воде от упавшей капли.

В основной программе «дождь» реализован бесконечным циклом, т.к. условие продолжения цикла – всегда True:

WhileTrue do

Kaplia(Random(800),random(600));

В процедуру передаются два параметра, задающие центр капли. Координаты центра капли вычисляются как случайные числа так, чтобы центр не вышел за пределы окна.

Пример 7.Мульфильм “Паровоз”.

Процедуры рисования прямоугольников - student2.ru

ProgramParovoz;

UsesGraphABC;

Const

dx = 10; //перемещение за одну итерацию

N = WindowWidth divdx; //количество итераций

t = 3000 divN; //пауза в одной итерации

//чтобы цикл длился 3 секунды

Var

i, //параметр цикла для паровоза

j: Integer; //параметр цикла для дыма

Begin

InitWindow(450,10,800,600,clLightGray); // отступы, размеры и цвет окна

SetWindowCaption('Паровоз'); // текст в заголовке окна

SetBrushStyle(bsHatch); //кисть штриховая

SetBrushHatch(bhBackwardDiagonal); //со стилем штриховки – косой штрих

SetHatchBrushBackgroundColor(clGreen); //с зелёным цветом заднего плана

FillRectangle(0, 550, 800, 600); //рисуем траву

SetBrushStyle(bsSolid); //кисть сплошная

SetBrushColor(clSkyBlue); //кисть голубого цвета

FillRectangle(0, 0, 800, 100); //рисуем небо

SetBrushColor(clYellow); //кисть жёлтого цвета

FillCircle(600, 50, 30); //рисуем солнце

Fori := 0 toN do//движение паровоза

Begin

SetBrushColor(clMaroon); //кисть красно-коричневого цвета

FillRectangle(i*dx, 390, 180+i*dx, 490); //корпус паровоза

FillRectangle(i*dx, 350, 40+i*dx, 390); //труба паровоза

SetBrushColor(clBlack); //кисть чёрного цвета

FillCircle(30+i*dx, 520, 30); //заднее колесо

FillCircle(150+i*dx, 520, 30); //переднее колесо

SetPenColor(clWhite); //кисть белого цвета

Forj := 1 to4 do//рисуем 4 кольца дыма

DrawEllipse(i*dx, 330-j*15, 40+i*dx, 350-j*15);

sleep(t); //пауза

SetBrushColor(clLightGray); //кисть цвета фона окна

FillRectangle(i*dx, 260, 180+i*dx, 550); //закрыли паровоз

end;

end.

Пример 8а.Анимация. Мерцание.

UsesGraphABC;

Varx: integer;

Begin

Window.Caption := 'Эффект мерцания';

Brush.Color := clGreen; //взяли зелёную кисть

Forx := 70 to500 do //поехали

Begin

ClearWindow(clWhite); //очистили экран белым цветом

Circle(x,200,50); //нарисовали круг с центром (x,200)

Sleep(10); //пауза

end;

end.

Пояснение.

В цикле окружность перемещается вправо, т.к. координата X центра круга увеличивается, являясь параметром восходящего цикла.

При движении сильно проявляется эффект мерцания.

Чтобы избежать мерцания, можно воспользоваться процедурами LockDrawing и Redraw.

Основная идея состоит в следующем:

- вызвав LockDrawing, отключим рисование на экране,– тогда рисование будет осуществляться только во внеэкранном буфере

- далее будем формировать новый кадр изображения и, когда он сформирован, выводить его на экран целиком, вызывая процедуру Redraw, которая перерисовывает всё графическое окно

Данный метод используется для ускорения анимации и создания анимации без мерцания.

Пример 8б. Анимация без мерцания.

UsesGraphABC;

Varx: integer;

Begin

Window.Caption := 'Анимация без мерцания';

Brush.Color := clGreen;

LockDrawing; //отключаем рисование в окне

Forx := 70 to500 do

Begin

ClearWindow(clWhite);

Circle(x,200,50);

Redraw; //перерисовываем окно из внеэранного буфера

Sleep(10);

end;

end.

ПРИЛОЖЕНИЕ

Основные подпрограммы модуля GraphABC

InitWindow(l,t,w,h,Color); Устанавливает отступы, размеры и цвет графического окна
ClearWindow; Очищает графическое окно и закрашивает белым цветом
ClearWindow(Сolor); Очищает графическое окно и закрашивает цветом Сolor
Sleep(T); Пауза длительностью T миллисекунд
PutPixel(x,y, Color); Пиксел с координатами (x, y) закрашивается цветом Color
SetBrushColor(Сolor); Устанавливает цвет кисти Сolor
SetPenColor(Color); Устанавливает цвет пера Сolor
SetPenWidth(Width); Устанавливает толщину пера в пикселах
MoveTo(x,y); Перо устанавливается в точку (x,y)
LineTo(x,y); Рисуется отрезок от текущей позиции пера до точки (x,y). Текущая позиция переносится в точку (x,y).
Line(x1,y1,x2,y2); Рисуется отрезок от точки (x1,y1) до точки (x2,y2). Положение пера не изменяется.
DrawCircle(x,y,r); Контур круга с центром (x,y) и радиусом r рисуется текущим пером. Внутренность круга не закрашивается
FillCircle(x,y,r); Внутренность круга с центром (x,y) и радиусом r закрашивается текущей кистью. Контур круга не рисуется.
Circle(x,y,r); Контур круга с центром (x,y) и радиусом r рисуется текущим пером. Внутренность круга закрашивается текущей кистью.
DrawEllipse(x1,y1,x2,y2); Эллипс, вписанный в прямоугольник с координатами противоположных вершин (x1,y1)и (x2,y2) рисуется текущим пером. Внутренность эллипса не закрашивается. (Прямоугольник не рисуется.)
DrawRectangle(x1,y1,x2,y2); Контур прямоугольника с координатами противоположных вершин (x1,y1)и (x2,y2) рисуется текущим пером. Внутренность прямоугольника не закрашивается
FillRectangle(x1,y1,x2,y2); Внутренность прямоугольника с координатами противоположных вершин (x1,y1) и (x2,y2)закрашивается текущей кистью. Контур прямоугольника не рисуется.
Rectangle(x1,y1,x2,y2); Контур прямоугольника с координатами противоположных вершин (x1,y1)и (x2,y2) рисуется текущим пером. Внутренность прямоугольника закрашивается текущей кистью.
FloodFill(x,y, Color); Закрашивает замкнутую область одного цвета цветом Color, начиная с точки (x,y), находящейся внутри замкнутой области.
SetFontColor(Color); Устанавливает цвет шрифта
SetFontSize(Size); Устанавливает размер шрифта в пунктах
TextOut(x,y,Текст); Выводит Текст начиная с точки с координатами (x,y). В качестве Текста можно передавать значение любого типа.

Наши рекомендации