Операторы и функция
Операторы рисования
Точка, линия, окружность и залитая область — основа любого рисунка на графической поверхности. Их ставят операторы PSET, PRESET, LINE, CIRCLE, PAINT и DRAW, а состояние отдельного пикселя читает встроенная функция POINT. Ниже сначала объясняется, где эти средства работают, в каких единицах задаются координаты и что означает цвет, а затем каждая сущность описана отдельно вместе со своей формой вызова.
Где работают эти операторы
Набор доступных средств зависит от поверхности. Для LINE, CIRCLE, DRAW и формы POINT(selector) требуется графический режим SCREEN 1..10. Операторы PSET, PRESET и PAINT доступны и в графическом SCREEN, и на холсте CANVAS; в обоих случаях они используют индексные цвета. Форма POINT(x, y) читает пиксель обеих поверхностей, но преобразование координат зависит от выбранной поверхности.
Обычная консоль и текстовый режим SCREEN 0 не предоставляют поверхность для этих операций. Если неподходящий режим известен при проверке программы, компилятор выдаёт MB2046 и запрещает запуск: например, после SCREEN 0 нельзя выполнить CIRCLE (10, 10), 5. Когда режим определяется только при исполнении, его проверяет диагностика MB3010.
Координаты и цвета
Без дополнительного преобразования координаты измеряются в пикселях: ось x направлена вправо, а ось y — вниз от верхнего края. Операторы VIEW и WINDOW меняют систему координат экрана, а слово STEP задаёт относительное смещение от текущей графической позиции.
Цвет этих примитивов — индекс палитры. Полноцветное значение RGB(...) имеет другой договор и не заменяет индекс.
Оператор PSET
Оператор PSET записывает цвет одного пикселя.
PSET (<координата X>, <координата Y>)
PSET (<координата X>, <координата Y>), <цвет>
PSET STEP (<координата X>, <координата Y>)
PSET STEP (<координата X>, <координата Y>), <цвет>
Укажите координаты точки и, при необходимости, индекс цвета.
При пропуске цвета используется текущий цвет рисования.
На экране SCREEN точка преобразуется текущими настройками VIEW и WINDOW.
На холсте CANVAS передаются мировые координаты. Камера преобразует точку, а область VIEWPORT ограничивает её вывод.
На холсте записывается индекс 0..255; значение вне диапазона нормализуется обычным графическим правилом приведения индекса. Это не форма для записи цвета RGB(...).
Со словом STEP точка вычисляется как смещение от текущей графической позиции. Для холста исходная позиция находится в мировых координатах.
CANVAS 24, 18
CLS RGB(0, 0, 0)
VIEWPORT (10, 6)-(14, 10)
CAMERA 100, 50
PSET (100, 50), 12
PRINT POINT(10, 6)
PRINT POINT(9, 6)
Пример отображает мировую точку (100, 50) в физическую точку (10, 6) выбранной области. Пиксель (9, 6) сохраняет фоновый цвет.
Оператор PRESET
Оператор PRESET записывает один пиксель, используя фоновый цвет, если явный цвет пропущен.
PRESET (<координата X>, <координата Y>)
PRESET (<координата X>, <координата Y>), <цвет>
PRESET STEP (<координата X>, <координата Y>)
PRESET STEP (<координата X>, <координата Y>), <цвет>
Так можно стереть отдельную точку, заменив её цвет фоновым.
Для экрана применяются текущие настройки VIEW и WINDOW.
На холсте точка задаётся в мировых координатах и преобразуется камерой в текущую область VIEWPORT.
Цвет остаётся индексом 0..255 с обычным правилом нормализации; полноцветный код RGB(...) здесь не используется.
При пропуске цвета берётся текущий фоновый индекс. После вызова CANVAS он равен 0.
Форма STEP отсчитывает смещение от текущей графической позиции, которая на холсте является мировой.
CANVAS 24, 18
CLS RGB(255, 255, 255)
VIEWPORT (10, 6)-(14, 10)
CAMERA 100, 50
PRESET (100, 50)
PRINT POINT(10, 6)
PRINT POINT(9, 6)
Пример стирает мировую точку (100, 50) фоновым индексом. После преобразования это физический пиксель (10, 6).
Оператор LINE
Оператор LINE соединяет две точки или рисует прямоугольник по противоположным углам.
LINE (<начальный X>, <начальный Y>)-(<конечный X>, <конечный Y>)
LINE (<начальный X>, <начальный Y>)-(<конечный X>, <конечный Y>), <цвет>
LINE (<начальный X>, <начальный Y>)-(<конечный X>, <конечный Y>), <цвет>, B
LINE (<начальный X>, <начальный Y>)-(<конечный X>, <конечный Y>), <цвет>, BF
Без суффикса выводится отрезок между заданными точками.
Суффикс B выбирает рамку прямоугольника.
Суффикс BF выбирает заполненный прямоугольник.
LINE -(<конечный X>, <конечный Y>), <цвет>LINE STEP (<начальный X>, <начальный Y>)-STEP (<конечный X>, <конечный Y>), <цвет>LINE (<начальный X>, <начальный Y>)-(<конечный X>, <конечный Y>), , BFПервая форма начинает отрезок в текущей позиции. Во второй форме обе точки заданы смещениями: первая — от текущей позиции, вторая — от первой. В третьей форме пустая позиция цвета сохраняет текущий цвет и выбирается заполненный прямоугольник. STEP допустим независимо у каждой из двух точек.
Оператор CIRCLE
Оператор CIRCLE рисует окружность, её дугу или эллипс.
CIRCLE (<координата X>, <координата Y>), <радиус>
CIRCLE (<координата X>, <координата Y>), <радиус>, <цвет>
CIRCLE (<координата X>, <координата Y>), <радиус>, <цвет>, <начальный угол>, <конечный угол>
CIRCLE (<координата X>, <координата Y>), <радиус>, <цвет>, <начальный угол>, <конечный угол>, <отношение осей>
Аргументы x и y определяют центр.
Аргумент radius типа DOUBLE задаёт радиус в единицах текущей логической шкалы.
Аргументы startAngle и endAngle задают пределы рисуемой дуги.
Аргумент aspect типа DOUBLE определяет отношение вертикального радиуса к горизонтальному. При значении меньше 1 вертикальный радиус уменьшается; при значении больше 1 горизонтальный радиус уменьшается.
CIRCLE STEP (<координата X>, <координата Y>), <радиус>CIRCLE (<координата X>, <координата Y>), <радиус>, , , , <отношение осей>STEP задаёт центр как смещение от текущей графической позиции. Пустые позиции сохраняют значения по умолчанию: цвет 15, полный круг и отношение осей 1; отдельные углы или отношение осей можно передать, оставив предыдущие позиции пустыми.
При пропуске цвета используется индекс 15, белый в стандартной палитре. У операторов LINE и PSET другое значение по умолчанию: текущий цвет переднего плана.
Оператор PAINT
Оператор PAINT заливает область, начиная с указанной точки.
PAINT (<координата X>, <координата Y>)
PAINT (<координата X>, <координата Y>), <цвет заливки>
PAINT (<координата X>, <координата Y>), <цвет заливки>, <цвет границы>
PAINT STEP (<координата X>, <координата Y>)
PAINT STEP (<координата X>, <координата Y>), <цвет заливки>
PAINT STEP (<координата X>, <координата Y>), <цвет заливки>, <цвет границы>
Координаты x, y типа LONG задают начальный пиксель заливки. Числовая заливка и граница принимают INTEGER, LONG, DOUBLE или DECIMAL; вещественный цвет усекается к целому и должен помещаться в INTEGER. Переполнение сообщает MB3008.
Строковая заливка PAINT
PAINT (<координата X>, <координата Y>), <узор>PAINT (<координата X>, <координата Y>), <узор>, <цвет границы>PAINT (<координата X>, <координата Y>), <узор>, <цвет границы>, <фоновый узор>Узор и фоновый узор должны быть строками. Каждый символ задаёт один байт из восьми битов: единичный бит выбирает текущий цвет переднего плана, нулевой — текущий фон. Узор повторяется через восемь пикселей по горизонтали и через число своих байтов по вертикали, с привязкой к физическим пикселям. Допустимы от 1 до 64 байтов; код каждого символа по правилам ASC должен лежать в 0..255. Нарушение сообщает MB3007.
Фоновый узор ограничивает замену теми пикселями, которые соответствуют его повторению. Он допустим только со строковой заливкой. Без явной границы строковая заливка использует текущий цвет переднего плана как границу. В числовой форме без явного цвета заливки используется текущий фон; без явной границы — цвет заливки. Слово STEP также допустимо во всех формах PAINT.
Если фоновый узор указан, каждый доступный пиксель обрабатывается не более одного раза. Совпадение нового цвета с прежним не мешает завершению заливки; повтор одинакового узора также завершается.
Проверка повторной заливки: background_repeat.axm.
Пример строкового узора
SCREEN 1
COLOR 6, 1
DIM oldPattern AS STRING = CHR(170) & CHR(85)
DIM newPattern AS STRING = CHR(85) & CHR(170)
LINE (1, 1)-(4, 4), 9, B
PAINT (2, 2), oldPattern, 9
PAINT (2, 2), newPattern, 9, oldPattern
PRINT POINT(2, 2)
PRINT POINT(3, 2)
PRINT POINT(2, 3)
PRINT POINT(3, 3)
SLEEPПрограмма дважды заполняет внутренность рамки. Второй узор заменяет первый; чтения печатают соответственно 1, 6, 6 и 1. Рамка сохраняет индекс 9.
Если задан только цвет заливки, заполнение ограничивается естественной границей цвета.
Аргумент borderColor явно задаёт цвет, на котором заполнение должно остановиться.
В режиме SCREEN начальная точка подчиняется VIEW, WINDOW и, при наличии, слову STEP.
На холсте начальная точка задаётся в мировых координатах; камера и область VIEWPORT определяют её физическое положение и границы вывода.
Заливка на холсте также индексная. Цвет заливки и цвет границы нормализуются до 0..255; полноцветная форма с RGB(...) не поддерживается.
Слово STEP на холсте отсчитывает смещение от текущей мировой графической позиции.
После заливки текущая графическая позиция совпадает с её стартовой мировой точкой.
CANVAS 24, 18
CLS RGB(0, 0, 0)
VIEWPORT (10, 6)-(15, 11)
CAMERA 100, 50
PSET (100, 50), 9
PSET (101, 50), 9
PSET (102, 50), 9
PSET (100, 51), 9
PSET (102, 51), 9
PSET (100, 52), 9
PSET (101, 52), 9
PSET (102, 52), 9
PAINT (101, 51), 6, 9
PRINT POINT(11, 7)
PRINT POINT(10, 6)
Мировая точка (101, 51) в примере отображается в пиксель (11, 7) и получает индекс 6. Граница с индексом 9 сохраняется.
Оператор DRAW
Оператор DRAW рисует и перемещает графическую позицию по командам внутри строки.
DRAW <строка команд>
Аргумент должен быть строкой с командами перемещения, поворота и рисования, перечисленными ниже.
Эти команды разбирает сам оператор DRAW; за пределами его строки они не являются отдельными инструкциями Axiom.
Команды строки DRAW
| Команда | Действие |
|---|---|
U, D, L, R | Движение вверх, вниз, влево или вправо. После буквы можно указать неотрицательную длину; без числа используется 1. |
E, F, G, H | Диагональное движение вверх вправо, вниз вправо, вниз влево или вверх влево; число задаёт смещение по каждой оси. |
B | Следующее движение или M выполняется без рисования. |
N | После следующего движения или M восстанавливается исходная графическая позиция. |
M x,y | Переход к абсолютной логической точке. Для относительного перехода у обеих координат указывают знак: M +20,-10. |
C число | Выбор индексного цвета для следующих отрезков внутри этой строки DRAW. |
S число | Положительный масштаб движения: фактическая длина равна длине команды, умноженной на S/4. Начальное значение — 4. |
A число | Поворот направлений на 0, 90, 180 или 270 градусов; допустимы числа 0..3. |
TA число | Поворот направлений на произвольный конечный угол в градусах. |
P заливка[,граница] | Заливка из текущей точки целыми индексными цветами. Без границы она равна цвету заливки. |
Пробелы между командами допустимы, регистр букв несущественен. Дробные числа внутри строки записываются с точкой. Каждый новый вызов DRAW начинает с текущего цвета, масштаба 4 и угла 0. Неизвестная команда, незавершённый модификатор B/N, неправильное число или неподдержанная команда X сообщают MB3007.
SCREEN 1
PSET (20, 20), 12
DRAW "R40 D20 L40 U20"
PRINT POINT(2); POINT(3)
SLEEPПрограмма рисует прямоугольник с углом (20, 20), печатает координаты вернувшейся позиции: 20 и 20, затем ждёт клавишу.
Функция POINT
Встроенная функция POINT читает индекс пикселя либо координату текущей графической позиции.
POINT(<координата X>, <координата Y>)
POINT(<селектор>)
В форме с двумя аргументами результат соответствует пикселю в заданной точке.
Для SCREEN точка преобразуется настройками VIEW и WINDOW.
Для CANVAS аргументы обозначают физический пиксель холста. Камера и область не преобразуют их: экранную точку (12, 12) читают вызовом POINT(12, 12).
Если пиксель холста полноцветный, функция возвращает ближайший индекс стандартной палитры Axiom.
Одноаргументная форма читает координату графической позиции по селектору. Она требует SCREEN и учитывает его настройки VIEW и WINDOW; на холсте эта форма недоступна.
CANVAS 16, 16
CLS RGB(0, 0, 0)
VIEWPORT (8, 8)-(16, 16)
CAMERA 4, 4
FILLRECT 8, 8, 1, 1, RGB(255, 255, 255)
PRINT POINT(8, 8)
PRINT POINT(12, 12)
Первое чтение возвращает индекс фона, второе — индекс белого пикселя. Аргументы функции соответствуют физическим точкам холста, хотя рисование выполнялось под камерой.
Правила работы
Рисование ограничено доступной областью. Часть фигуры за её пределами обрезается; сам выход фигуры за край обычно не является ошибкой.
При работе на экране проверяйте текущие настройки VIEW, WINDOW и наличие STEP: от них зависит положение результата.
На холсте форма POINT(x, y) всегда читает физический пиксель без преобразования VIEW, WINDOW, CAMERA или VIEWPORT.
Рисующие операторы PSET, PRESET и PAINT на том же холсте принимают мировые координаты и учитывают камеру и область.
Некоторые операции обновляют графическую позицию. Её последующее значение используется формой STEP, строкой DRAW и вызовом POINT(selector).
Дуги и отсечение фигур
Оператор CIRCLE рисует короткую дугу с теми же правилами выбора пикселей, что и соответствующую часть полной окружности. Пример: short_arc.axm.
Оператор LINE отсекает невидимую часть линии или прямоугольника до перебора пикселей. Диагональ сохраняет те же видимые пиксели, которые получились бы при построении целой линии; новая линия между округлёнными точками пересечения не строится. Полностью невидимая фигура не рисуется, но конечная точка по-прежнему становится текущей графической позицией. Пример с большой диагональю и преобразованием координат: clipped_bounds.axm.
Аргументы точек, линий и окружностей
Координаты PSET, PRESET, LINE, CIRCLE и PAINT приводятся к LONG; у PSET, PRESET, LINE и CIRCLE цвет приводится к INTEGER и обозначает индекс палитры, нормализованный как ABS(значение) MOD 256. У LINE начальная точка может быть пропущена: тогда берётся текущая графическая позиция. STEP у второй точки отсчитывается от уже вычисленной первой точки. Суффиксы B и BF выбирают соответственно рамку и заполненный прямоугольник.
У CIRCLE радиус, углы и отношение осей приводятся к DOUBLE. Радиус должен быть конечным неотрицательным числом, отношение осей — конечным числом больше нуля и не больше 1000000. Углы измеряются в радианах; отрицательный угол дополнительно соединяет соответствующий конец дуги с центром. Ошибка этих условий сообщает MB3007.
Форма POINT с двумя координатами возвращает INTEGER — индекс 0..255; за границами доступного пикселя возвращается 0. Форма с одним селектором возвращает INTEGER: 0 и 1 выбирают X и Y в системе графической области, 2 и 3 — X и Y текущей логической позиции. Недопустимый селектор сообщает MB3007. Рисование SCREEN сразу изменяет активную страницу; если она является видимой, результат появляется в окне; рисование CANVAS — после PRESENT.
Пример
SCREEN 1
PSET (10, 10), 12
LINE (20, 20)-(120, 20), 14
LINE (30, 30)-(90, 70), 11, B
CIRCLE (160, 90), 24, 10
PAINT (160, 90), 9, 10
PRINT "Цвет точки:"; POINT(10, 10)
SLEEP
Диагностика
MB3010: операторыPSET,PRESETиPAINTвызваны без активного графического режимаSCREENи без активногоCANVAS.MB3010: операторыLINE,CIRCLE,DRAWи формаPOINT(selector)вызваны без активного графического режимаSCREEN 1..10.MB3010: формаPOINT(x, y)вызвана без активного графического режимаSCREENилиCANVAS.MB3007: оператор получил недопустимые координаты, радиус, селектор или другой числовой аргумент вне поддерживаемого договора.
Заливка совпадающего узора и большие окружности
Узорная форма оператора PAINT обходит всю связанную область до граничного цвета, даже если отдельные исходные пиксели уже совпадают с соответствующими битами узора. Каждый пиксель области обрабатывается не более одного раза. Начальная точка на границе не закрашивается. При заданном фоновом узоре сохраняются дополнительные правила выбора исходной области.
Очень большие окружности и эллипсы строятся по видимым строкам и столбцам. Удалённый центр не приводит к преждевременному обрыву контура: видимые точки касания сохраняются; ограничения дуги продолжают действовать.
SCREEN 1
COLOR 6, 0
LINE (20, 60)-(29, 69), 9, B
PAINT (22, 62), CHR(170) & CHR(85), 9
CIRCLE (-1000000, 100), 1000000, 12
SLEEPВнутри рамки получается шахматный узор из 32 цветных и 32 чёрных пикселей. Окружность касается левого края окна в точке (0, 100).