Процедуры рисования прямоугольников
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.Мульфильм “Паровоз”.
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). В качестве Текста можно передавать значение любого типа. |