Обсуждение статьи "Создание графической библиотеки для MetaTrader 5 по образцу Cairo (Часть 3): Ребра и первая фигура с заливкой"

Опубликована статья Создание графической библиотеки для MetaTrader 5 по образцу Cairo (Часть 3): Ребра и первая фигура с заливкой:

В третьей части реализован построчный растеризатор, написанный целиком на языке MQL5. Мы преобразуем отрезки пути в ребра, записанные в направлении сверху вниз, проходим по каждой строке, сортируем точки пересечения и применяем ненулевое правило заливки, чтобы определить, какие пиксели находятся внутри фигуры. В результате получается метод Fill(path, color, buffer, w, h), который рисует прямоугольники, звезды, глифы или фигуры с 2 000 ребрами без отдельного кода для каждого типа фигуры. Его можно сразу использовать в ваших проектах на языке MQL5.

Каждая фигура в демонстрационном примере этой части рисуется именно этим вызовом и никаким другим. Только в первом ряду расположены шесть фигур; кроме них, в примере есть глиф, веер из тонких треугольников и цветок с 2 000 ребрами. Сравните с первой частью, где для треугольника и круга требовались две отдельные процедуры без единой общей строчки кода.

Для этого нужны две составляющие. Первая — это ребро: отрезок, представленный в форме, позволяющей ответить на единственный вопрос, который задает построчный рендерер. Вторая — это сам построчный проход. В ходе этого прохода буфер обрабатывается строка за строкой: находятся точки пересечения с обводкой, а затем по числу обхода определяются интервалы внутри фигуры.

Обе эти идеи появились раньше, чем большинство программ, которыми вы пользуетесь. Построчная заливка появилась еще в 1960-х годах, и с тех пор заменять этот метод не понадобилось. В следующих частях сглаживание, правила заливки, отсечение и таблица активных ребер усовершенствуют четыре шага, описанные сегодня, но не заменят их.

У этой версии три намеренных ограничения, каждое из которых еще раз отмечено в соответствующем месте кода:

  • для каждой строки берется только одна точка выборки, поэтому любое ребро, не являющееся строго горизонтальным или вертикальным, имеет ступенчатый вид;
  • пиксели перезаписываются без смешивания цветов, поэтому полупрозрачный цвет не смешивается с уже имеющимся под ним изображением;
  • реализовано только ненулевое правило заливки, поэтому буква O заливается целиком, если направление обхода внутреннего контура не противоположно направлению обхода внешнего.

Это не упрощения, за которые нужно оправдываться. За каждым ограничением стоит отдельная идея. Если смешать все эти идеи в одной статье, растеризатор и будет казаться магией, а не механизмом.


Автор: Sandro Begashvili