Графика, графика, графика. Часть 1. Введение
Важна ли графика для начинающих программистов? Или следует в первую очередь изучать конструкции языка, алгоритмы, методику написания программ? А графика — баловство?
Несомненно, все зависит от аудитории. Если программированию обучается школьник, то графика очень важна — мышление конкретное, и хочется сразу видеть результаты своего труда. Абстрактное мышление быстро утомляет. Если программировать учится студент — здесь другая картина. Графика нужна по большей мере как вспомогательное средство для визуализации результатов, динамики выполнения алгоритмов. Но что однозначно — графика нужна.
Меня вот часто спрашивают студенты — как сделать что-нибудь графическое на C++? Много лет уже спрашивают. Уже устал отвечать — не знаю…
Конечно, не каждый язык должен иметь стандартную поддержку графики. Даже универсальный. Но вот от языка для обучения (а язык Паскаль используется в основном для обучения) поддержку графики — ждут.
В старом добром Бейсике — чем он подкупал — на Корветах там всяких, Атари и Синклерах — загрузил среду, написал
Circle(100,100,50)
и получил на экране кружочек — прямо поверх кода. Это потом с появлением MS DOS, где основным режимом стал текстовый, все усложнилось.
На старом добром Turbo Pascal был такой замечательный модуль Graph — подключил его, написал пару строчек непонятных заклинаний — и рисуй себе все что угодно аж 256 цветами!
Вот эти заклинания:
uses Graph;
var GraphDriver,GraphMode: integer;
begin
InitGraph(GraphDriver,GraphMode,'d:\turbo\bgi');
<здесь рисуем>
end.
Еще в конце там CloseGraph надо было вызвать. И знатоки с умным видом рассказывали новичкам, что у тебя там неправильно установлен путь к графическому драйверу или драйвер у тебя не тот.
В общем, прошли те времена — появилась Windows, а в ней основной режим — графический.
Прошли ли? Меня до сих пор спрашивают, почему в PascalABC нет модуля Graph? Отвечаю, что не мог больше терпеть. Но нет-нет да мелькнет в Интернете на форуме пост какого-нибудь новичка — представляете, настолько плохой PascalABC, что даже графики в нем нет или она там какая-то своя! Не та, что описана в груде книжек по Турбо-Паскалю, а другая!
Вот об этой другой графике мы и поговорим.
Те, кто программировал графические приложения под Windows, знают, что рисовать лучше всего в обработчике события WM_PAINT или OnPaint (последнее — если используется какой-нибудь объектный каркас для Windows-приложения). В этом обработчике нельзя рисовать долго, поскольку программа на время его работы блокируется. А если рисовать в других обработчиках, то нарисованное стирается при следующей перерисовке окна. Короче — куча проблем!
Идея была простой: создать графическую библиотеку, подключающуюся крайне просто, где эти проблемы были бы решены. Еще лучше, если графическое приложение будет похоже на обычную программу: чтобы сразу после begin можно было писать графические команды.
Решение было найдено — вот эта простейшая программа:
uses GraphABC;
begin
Rectangle(10,10,100,100);
end.
При запуске такой программы возникает специальное графическое окно, и все рисование происходит именно на нем. Изображение на нем не пропадет при перерисовке, и можно рисовать сколь угодно долго — программа не окажется заблокированной на время рисования. Это значит, в частности, что можно легко делать простую анимацию.
Вот несколько очень простых графических программок — совершенно бесполезны — чистое баловство!
Программа 1. SetPixel и RGB
Показывает использование процедуры SetPixel и функции RGB.
uses GraphABC;
begin
for var x:=0 to Window.Width-1 do
for var y:=0 to Window.Height-1 do
SetPixel(x,y,RGB(2*x-y,x-3*y,x+y));
end.
Программа 2. Рисование звездочки
Показывает использование процедур MoveTo и LineTo, а также полярных координат.
uses GraphABC;
const
n = 17; // количество точек
n1 = 7; // через сколько точек соединять
begin
var a := -Pi/2;
var Center := Window.Center;
var Radius := Window.Height/2.2;
MoveTo(
Round(Center.X+Radius*cos(a)),
Round(Center.Y+Radius*sin(a))
);
for var i:=1 to n do
begin
a += n1*2*Pi/n;
LineTo(
Round(Center.X+Radius*cos(a)),
Round(Center.Y+Radius*sin(a))
);
end;
end.
Пример 3. Цифровые часы
Показывает использование процедуры TextOut, а также функций TextWidth, TextHeight.
uses GraphABC;
begin
Font.Size := 80;
var x0 := (Window.Width - TextWidth('00:00:00')) div 2;
var y0 := (Window.Height - TextHeight('00:00:00')) div 2;
while True do
begin
var t := DateTime.Now;
var s := string.Format(
'{0:d2}:{1:d2}:{2:d2}',
t.Hour,t.Minute,t.Second
);
TextOut(x0,y0,s);
Sleep(1000);
end;
end.
Ну вот, для введения и достаточно.