14. ГРАФИКА. ПРОСТОЙ ВАРИАНТ

Создание рисунков как бы карандашом и кисточкой, но автоматически по программе, является обязательным элементом современного графического программирования. В языке Java реализовано два разных пакета графики, каждый из которых имеет свою область применимости. В этом разделе рассмотрен простой вариант, появившийся в первой версии языка Java. Для использования этого пакета в ACL разработана команда #graphics или короче #g . Эта команда имеет много операций, но мы рассмотрим здесь только часть из них, являющуюся стандартной для всех языков программирования. В этом случае графический рисунок или чертеж может быть составлен из многих элементарных графических объектов, таких как линии, тексты, области, прямоугольники и т. д. График создается с помощью комбинирования различных операций данной команды.

Прежде всего рассмотрим механизм задания цветов. Этот механизм является общим для всех команд и уже частично упоминался выше. Цвета устанавливаются по номеру, являющемуся индексом элемента массива цветов. Массив содержит 256 цветов. Каждый цвет задается определенной комбинацией яркости красного, зеленого и синего (RGB), то есть тремя целыми числами в диапазоне от 0 до 255. Номер цвета задается параметром [col] (color). Любой элемент массива цветов можно определить командой #col (color). Эта команда пишется следующим образом

.

 #col [b= ; le= ; fir= ;]

Она определяет часть массива цветов, начиная с индекса, равного значению параметра [b], а полное число определяемых цветов равно значению параметра [le]. Число 3*[le] целых значений RGB должно быть задано предварительно в массивах i() или r() начиная с первого элемента, на который указывает параметр [fir]. Вот пример.

 #d 6 i(1) 255 0 0 122 122 122    #col [b=2; le=2; fir=i(1);] 

Эти две команды определяют цвет номер 2 как красный и номер 3 как серый. При запуске интерпретатора все цвета определены заранее следующим образом

(1 до 243) черный (0 0 0),
(244) темно-красный (128,0,0),
(245) темно-серый (85,85,85),
(246) белый (255 255 255),
(247) черный (0 0 0),
(248) красный (255 0 0),
(249) синий (0 0 255),
(250) зеленый (0 195 0),
(251) серый (128 128 128),
(252) коричневый (152 128 0),
(253) фиолетовый (152 0 152),
(254) голубой (0 255 255),
(255) темно-синий blue (0 0 128),
(256) светло-коричневый (220 200 180),

Eсли такое определение вас устраивает, можно смело указывать нужные номера цветов с самого начала. Таблицу цветов можно переопределить в любой момент.

Перейдем к команде #g. В названиях ее операций достаточно указывать 3 первых символа. Многие операции содержат координаты точек на плоскости рисунка, указывающие размеры объектов и их положение на рисунке. Нужно помнить, что эти координаты задаются не вполне абсолютно. Есть возможность изменить весь график, как целое, без переписывания кода программы. График может быть перемещен и промасштабирован. Координаты каждого элемента перед помещением на рисунок дополнительно смещаются на вектор трансляции, который задается параметрами [trx] и [try]. То есть действительная позиция элемента определяется его координатами плюс вектор трансляции. Если этот вектор не равен нулю, то все элементы, нарисованные далее, будут перемещены. Другой параметр [sca] позволяет масштабировать размеры элементов. Этот параметр измеряется в процентах, так что [sca=100;] означает исходные размеры. Если [sca] < 100, все расстояния будут уменьшены, включая как размеры, так и позиции на рисунке (но не вектор трансляций). Если [sca] > 100, они будут увеличены.

Есть и другой режим. Если [sca] отрицательно, то для масштабирования будет использовано абсолютное значение, в то время как исходные позиции не будут меняться, только размеры. То есть в первом случае весь рисунок масштабируется как целое, а во втором -- только объекты, но не их расположение. Есть исключение. Такие объекты как {image} (картинки) и {axes} (оси) не могут быть промасштабированы по размеру (по крайней мере на данный момент). Картинки используются как есть. Что касается размеров осей, то они могут быть изменены явным заданием параметров. Очень часто оси делаются именно на картинках, поэтому неудобно менять одно без другого. Перейдем к изучению операций.

.

 #g [op=open; twi=; the=; col=;]

Эта операция открывает новый график для работы. Параметры [twi] и [the] определяют полные ширину и высоту графика в пикселах экрана. Прямоугольник графика будет заполнен цветом, номер которого в массиве цветов определяется параметром [col]. Положение всех элементов в поле графика будет отсчитываться от левого нижнего угла заданной области. Тут есть одна особенность. Эта команда только заказывает область графика параметрами twi, the, но сами эти параметры используются только при закрытии процесса графика. Поэтому в процессе рисования эти параметры меняться не должны. Если какие-либо команды их меняют, то они должны выполняться до команды открытия графики, например, команда #w для записи картинки из файла в память компьютера.

.

 #g [op=cont; n=;]

Эта операция позволяет продолжить рисование графика, который был предварительно сохранен в памяти компьютера в массиве изображений с номером [n]. Она просто открывает картинку для рисования на ней дополнительных объектов.

.

 #g [op=close; c=; sav=; form=;] FT

Эта операция закрывает процесс рисования и сохраняет полученную картинку соответсвенно значению параметра [sav] аналогично команде #w (см. предыдущий раздел). А именно, если [sav] > 0, то картинка спасается в памяти компьютера с номером [sav]. Максимальный возможный номер 100. Если [sav=0;], то картинка будет показана на экране как кнопка в отдельном окне по центру экрана. В этом случае, если [c=0;], то программа выполняет следующие команды, а если [c=1;], то программа ждет, когда пользователь закроет окно. Если [sav=-1;], то картинка будет показана и одновременно будет записана в файл в текущую рабочую папку, имя файла без расширения задается параметром [form]. Если [sav=-2;], то картинка только спасается в файл без показа на экране. Аргумент FT задает заголовок окна в том случае, когда картинка показывается на экране. В других случаях его задавать необязательно, хотя конечно ошибки не будет, если его и задать. Он будет пропущен как комментарий. Если картинка показана на экране с [c=1;], то модификатор будет возвращен в параметр s(1) как значение от 16 до 27 (см. подробности в предыдущей статье о команде #w). Также работает параметр [emp]. Если он равен 0, то выполняется старый режим и картинка размещается в центре экрана, а если 1, то дополнительно параметры [xp] и [yp] указывают координаты левого верхнего угла окна относительно левого верхнего угла экрана.

.

 #g [op=text; nx=; ny=; col=; tfo=; tki=; tsi=; sty=;] FT

Эта операция рисует форматированный текст на графике, который задается аргументом FT. Координаты текста определяют параметры [nx] и [ny]. Дополнительное условие задается параметром [sty]. Если [sty=1;], то текст помещается левым нижним углом на координаты. Если [sty=2;] текст будет помещен центральной точкой на координаты. Наконец, если [sty=3;] текст будет помещен правым нижним углом на координаты. Цвет текста определяется параметром [col]. Фонт текста задается параметром [tfo], который может меняться в интервале от 1 до 5. Это номер одного из логических фонтов. Какой реальный фонт будет поставлен ему в соответствие зависит от наличия фонтов на компьютере, поэтому просто проверьте все значения и выберите подходящий. Параметр [tki] определяет вид фонта. Он может быть равен 0 (plain) 1 (bold) 2 (italic) 3 (bold-italic). Параметр [tsi] задает размер фонта в пикселах экрана. Разумные значения 12, 14, 16. Графический текст поддерживает греческие буквы, которые могут быть заданы своими юникодами. Ниже показаны некоторые из юникодов для греческих букв: большие Delta - 916, маленькие, alpha - 945, beta - 946, gamma - 947, delta - 948, epsilon -949, dzeta - 950, eta - 951, theta - 952, kappa - 954, lambda - 955, mu - 956, nu - 957, ksi - 958, pi - 960, ro - 961, sigma - 963, tau - 964, phi - 967, chi - 967, psi - 968, omega - 969. В списке готовых программ есть программа Unicodes, которая показывает все символы по их юникодам для заданного фонта. Такую программу можно использовать для получения информации о том какие юникоды что показывают в каждом фонте. Что касается русских букв, то если операционная система позволяет набирать русские буквы переключением клавиатуры, то это будет работать и здесь. Но в любом случае русские буквы тоже можно задать юникодами.

.

 #g [op=line; nx=; ny=; col=; n=; b=;]

Эта операция рисует линию как последовательность многих прямолинейных отрезков. Цвет задается параметром [col]. Координаты первой точки задаются [nx] и [ny]. Параметр [n] определяет число прямолинейных отрезков Параметр [b] задает индекс первого элемента целого массива i(), который содержит длины каждого отрезка в следующем порядке: x1, y1, x2, y2, x3, y3, и так далее. Каждая пара чисел задает координаты вектора, то есть разности между концом и началом отрезка.

.

 #g [op=area; nx=; ny=; col=; n=; b=; mo=;]

Эта операция рисует область. Она аналогична предыдущей операции, но в этом случае добавляется дополнительный отрезок из конца последнего отрезка в начало линии, то есть линия всегда описывает замкнутую область. Если [mo=0;], то область заполняется цветом согласно номеру [col]. Если [mo=1;], то линия представляет границу области с тем же цветом.

.

 #g [op=rect; nx=; ny=; wid=; hei=; col=; mo=;]

Эта операция рисует частный случай области, а именно, прямоугольник, ширина и высота которого определяются параметрами [wid] and [hei]. Центральная точка прямоугольника помещается в точку с координатами [nx] и [ny]. Если [mo=0;], то прямоугольник заполняется цветом [col]. Если [mo=1;], то рисуется только граница прямоугольника тем же цветом.

.

 #g [op=oval; nx=; ny=; wid=; hei=; col=; mo=;]

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

.

 #g [op=arc; nx=; ny=; wid=; hei=; col=; mo=; b=; le=;]

Эта операция аналогична предыдущей, но с тем отличием, что рисуется только часть эллипса, у которого стартовый угол задается параметром [b], а угловая ширина определяется параметром [le]. Углы измеряются в градусах.

.

 #g [op=image; nx=; ny=; n=; file=;]

Эта операция позволяет добавить на график готовую картинку. Центральная точка картинки будет иметь координаты [nx] и [ny], отсчитываемые от левого нижнего угла графика. Если [n] > 0, то картинка будет взята из памяти компьютера с номером [n]. Если [n=0;], картинка будет взята из файла, имя которого определяется параметром [file] относительно рабочей папки.

Эта команда имеет еще дополнительные операции научной графики, которые будут рассмотрены в отдельной главе. Все, что здесь описано, существует также и в языке Java, а научная графика в языке Java отсутсвует. Она есть только в ACL. В языке Java для этого надо прибавить соответствующие классы.