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

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

Во второй части мы добавим слой геометрии в графическую библиотеку для MetaTrader 5, создаваемую по образцу Cairo. В ней определяется путь из точек с координатами двойной точности, сгруппированных в контуры, сохраняется признак того, является ли контур открытым или замкнутым, а вершины хранятся в плоском массиве с индексами начала контуров. Мы реализуем методы MoveTo, LineTo и Close, добавим базовые вспомогательные методы для построения фигур и демонстрационный пример, который отображает построенную геометрию для визуальной проверки и повторного использования.

Ступенчатость границ в первой части была следствием бинарного подхода к рендерингу и потери субпиксельной информации.

На первом фрагменте рисунка ребро проходит точно по границе пикселя, поэтому при хранении целочисленной координаты информация не теряется. На втором фрагменте исходная координата равна 10,35, но при сохранении в целочисленном формате дробная часть отбрасывается. В результате рендерер в обоих случаях получает одну и ту же сохраненную координату и не может различить эти случаи. На третьем фрагменте координата хранится как число типа double. Это позволяет сохранить информацию о частичном покрытии столбца с индексом 10 и отрисовать ребро в соответствии с геометрией.

Это влечет за собой два практических следствия:

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

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

Работа с кривыми — еще одна причина сохранять координаты с плавающей точкой. При спрямлении кривой вершины полученной ломаной имеют дробные координаты (например, 12,3719… вместо 12). Если бы тип точки не позволял хранить такие значения, координаты кривых еще до рисования квантовались бы с шагом в один пиксель, и сглаживание не смогло бы компенсировать эту потерю точности.


Автор: Sandro Begashvili