4 Основные принципы

Возможности библиотеки MathGL довольно богаты – число только основных типов графиков превышает 50 видов. Кроме того, есть функции для обработки данных, настройки вида графика и пр. и пр. Тем не менее, я старался придерживаться единого стиля в порядке аргументов функций и способе их “настройки”. В основном все ниже сказанное относится к функциям рисования различных графиков.

Всего основных концепций (базисных идей) шесть:

  1. Все рисунки создаются в памяти. Это могут быть как растровые картинки (для SetQuality(MGL_DRAW_LMEM) или quality 6), так и векторные списки примитивов (по умолчанию). Дальнейшая судьба рисунков определяется пользователем: можно сохранить в файл, вывести на экран, создать анимацию/кино, дополнительно отредактировать и т.д. Такой подход обеспечивает высокую переносимость библиотеки – один и тот же программный код создаст в точности одинаковый рисунок на любой операционной системе. Кроме того, при таком подходе рисунки можно создавать непосредственно в консольной программе – графическое окно не нужно!
  2. Все настройки графиков (стиль линий, цветовые схемы поверхностей, стиль и цвет текста) задаются строками. Это обеспечивает: удобство для пользователя – короткую строку легче читать и здесь тяжелее ошибиться, чем в большом списке параметров; переносимость – строки выглядят одинаково на всех платформах и не надо заботиться о типе и числе аргументов.
  3. Все функции имеют “упрощенный” и “продвинутый” варианты. Сделано опять из-за удобства. В “упрощенном” варианте для построения графика нужны только один-два массив(а) данных, которые автоматически равнораспределяются в заданном диапазоне осей координат. В “продвинутой” версии можно не только указать явно диапазон построения графика, но и задать его параметрически. Последнее позволяет легко строить довольно сложные кривые и поверхности. В обоих вариантах функций порядок аргументов стандартен: сначала идут массивы данных, потом необязательный строковый параметр стиля графика, а далее строка опций для более точной настройки графика.
  4. Все данные передаются через экземпляры класса mglData(A). Такой подход позволяет избежать ошибок при работе с памятью и единообразно передавать данные разных типов (float, double, данные из файла, заполненных пользователем и пр.) в функции рисования.
  5. Все элементы рисунков векторные. Изначально библиотека MathGL была ориентированна на работу с научными данными, которые по своей природе векторные (линии, грани, матрицы и т.д.). Поэтому векторность используется во всех рисунках! Причем иногда даже в ущерб производительности (например, при выводе шрифтов). Помимо всего прочего, векторность позволяет легко масштабировать рисунок – измените размер картинки в 2 раза, и рисунок пропорционально растянется.
  6. Новые графики не удаляют уже нарисованное. Этот, в чем-то неожиданный, подход позволяет создавать огромное количество “комбинированных” графиков. Например, поверхность с наложенными линиями уровня строится двумя последовательными вызовами функций рисования поверхности и линий уровня (в любом порядке). И совершенно не надо писать специальную функцию (как в Matlab и некоторых других программах) для рисования этого графика.

Кроме основных концепций я хотел бы остановиться на нескольких, как оказалось, нетривиальных моментах – способе указания положения графика, осей координат и строковых параметров линий, поверхностей, текста.