[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
MathGL это ...
1.1 Зачем написана MathGL? | ||
1.2 Возможности MathGL | ||
1.3 Установка MathGL | ||
1.4 Основные принципы | ||
1.5 FAQ | ||
1.6 Интерфейсы | ||
1.7 Благодарности |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Код для создания качественной научной графики на различных платформах. Код для быстрой обработки и отображения больших массивов данных. Код для работы в графическом и консольном режимах и легкого интегрирования в другие программы. Код с большим обновляемым набором графиков и инструментами обработки данных. Именно такого кода мне не хватало в последние годы при работе на персональных компьютерах и на кластерах. И именно такой код я постарался создать в библиотеке MathGL.
На данный момент (версия 1.11) MathGL это более 20000 строк кода, более 40 основных типов графиков для одно-, двух- и трехмерных массивов, возможность экспорта в растровые и векторные (EPS или SVG) файлы, интерфейс для OpenGL и возможность запуска в консольном режиме, функции для обработки данных и даже простейший командный (интерпретируемый) язык MGL для упрощения построения графиков. Кроме того, есть несколько типов прозрачности, гладкое освещение, векторные шрифты, TeX-ие команды в надписях, произвольные криволинейные системы координат и прочие полезные мелочи (см. раздел pictures на домашней странице). Ну, и, естественно, полная переносимость библиотеки и ее свободное распространение под лицензией GPL v.2.0 или более поздней.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Библиотека MathGL позволяет строить широкий класс графиков, включая:
Фактически, я постарался реализовать все известные мне типы научных графиков. Список графиков постоянно пополняется, и если Вам нужен какой-то новый вариант, пишите на e-mail, и в новой версии библиотеки этот график появится.
Я постарался сделать графики максимально красивыми – поверхности могут быть прозрачными и освещены произвольно расположенными источниками света (максимальное их количество 10). Большинство функций рисования имеет два варианта: простой для быстрого построения картинки и более сложный для детальной настройки отображения, включающего в том числе возможность параметрического задания всех массивов. Получившееся изображение можно сохранить в растровом (с помощью классов mglGraphZB, mglGraphGL) формате PNG, JPEG, GIF, TIFF или BMP; в векторном EPS или SVG формате (с помощью класса mglGraphPS) и в IDTF формате (с помощью класса mglGraphIDTF), который можно конвертировать в U3D формат.
Все надписи выводятся векторным шрифтом, что обеспечивает их хорошую масштабируемость и переносимость. Текст может содержать команды для большинства ТеХ-их символов, изменения положения (верхний и нижний индексы) и стиля шрифта внутри строки текста (see section mglFont class). Текст меток поворачивается вместе с осями. На график можно вывести описание кривых (легенду) и поместить надпись в произвольную точку экрана или пустить ее вдоль кривой. Поддерживаются произвольные кодировки текста (с помощью стандартной функции setlocale()
) и текст в кодировке UTF-16.
Для представления данных используется специальный класс mglData (see section Класс mglData). Помимо безопасного создания и удаления массивов, он включает функции по их обработке (дифференцированию, интегрированию, сглаживанию, интерполяции и т.д.) и чтению текстового файла с автоматическим определением размеров данных. Класс mglData позволяет работать с массивами размерности вплоть до 3 (массивы, зависящие от трех независимых индексов a_ijk). Использование массивов с большим числом размерностей нецелесообразно, поскольку я не представляю, как их можно отобразить на экране. Заполнение или изменение значений массива можно выполнить как вручную, так и по формуле, заданной текстовой строкой.
Для быстрого вычисления значения выражения, заданного текстовой строкой, используется класс mglFormula (see section mglFormula class). Он основан на компиляции строки в древоподобную структуру при создании экземпляра класса. На этапе вычисления происходит быстрый обход дерева с выдачей результата для конкретных значений переменных. Помимо изменения значений массива данных, текстовые формулы используются для рисования в произвольной криволинейной системе координат. Набор таких координат ограничивается только фантазией пользователя, а не фиксированным числом (типа полярной, параболической, цилиндрической и т.д.).
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Установка библиотеки возможна 4-мя способами.
./configure
далее make
и, наконец, с правами суперпользователя make install
. Иногда после компиляции библиотеки может потребоваться обновление списка библиотека в системе – выполните команду ldconfig
с правами суперпользователя.
Скрипт ./configure
имеет несколько дополнительных опций, которые по умолчанию отключены. К их числу относятся: --enable-fltk, --enable-glut, --enable-qt
для поддержки FLTK, GLUT и/или Qt окон; --enable-jpeg, --enable-tiff, --enable-hdf5
для поддержки соответствующих форматов; --enable-all
для включения всех возможностей. Для использования типа double
для внутреннего хранения данных используйте опцию --enable-double
. Для создания интерфейсов к другим языкам (кроме С/Фортран/MGL) используйте опции --enable-python, --enable-octave
или --enable-langall
для всех поддерживаемых языков. Полный список опций можно увидеть, выполнив ./configure --help
.
При сборке пользовательской программы достаточно указать ключ -lmgl
для компиляции в консольной программе или с использованием внешней графической библиотеки. При использовании окон FLTK или GLUT надо указать/добавить ключи, включающие соответствующие библиотеки – -lmgl-fltk
или -lmgl-glut
. Для использования в Фортране дополнительно надо указать опцию -lstdc++
для библиотек C++.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Возможности библиотеки MathGL довольно богаты – число только основных типов графиков превышает 50 видов. Кроме того, есть функции для обработки данных, настройки вида графика и пр. и пр. Тем не менее, я старался придерживаться единого стиля в порядке аргументов функций и способе их “настройки”. В основном все ниже сказанное относится к функциям рисования различных графиков.
Всего основных концепций (базисных идей) шесть:
Кроме основных концепций я хотел бы остановиться на нескольких, как оказалось, нетривиальных моментах – способе указания положения графика, осей координат и строковых параметров линий, поверхностей, текста.
1.4.1 Оси координат | ||
1.4.2 Стиль линий | ||
1.4.3 Цветовая схема | ||
1.4.4 Стиль текста | ||
1.4.5 Текстовые формулы |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Представление системы координат в MathGL состоит из двух частей. Вначале координаты нормируются в интервал MinxMax (see section Настройки осей координат). Если флаг Cut установлен, то точки вне интервала отбрасываются, в противном случае, они проецируются на ограничивающий параллелепипед (see section Обрезание). Кроме того, отбрасываются точки внутри границ, определенных переменными CutMinxCutMax и точки, для которых значение функции CutOff
() не равно нулю. После этого формулы перехода в криволинейную систему координат SetFunc()
применяются к каждой точке. Наконец, точка данных отображается с помощью одной из графических функций.
Величины Max, Min можно изменять вручную. Однако, после этого необходимо вызвать функцию RecalcBorder()
для настройки графика. Более удобный и безопасный путь состоит в вызове функций Axis(), SetRanges()
и др. В последнем случае функция RecalcBorder()
вызывается автоматически. Размеры осей можно задавать и автоматически по минимальному и максимальному значениям массива данных. Для этого предназначены функции XRange(), YRange(), ZRange()
. Второй не обязательный аргумент указывает, заменять ли новые значения диапазона изменения оси координат (по умолчанию) или только расширить уже существующий диапазон.
Точка пересечения осей координат задается переменной Org и действует на последующие вызовы функций рисования осей координат и сетки. По умолчанию, если точка пересечения осей координат попадает вне диапазона осей координат, то она проецируется на границу области. Изменить такое поведение можно, задав AutoOrg=false
. В случае, если одно из значений Org равно NAN, то соответствующее значение будет выбрано автоматически.
Кроме привычных осей x, y, z есть еще одна ось – цветовая шкала – ось c. Она используется при окрашивании поверхностей и задает границы изменения функции при окрашивании. При вызове Axis()
ее границы автоматически устанавливаются равными Min.z и Max.z. Возможно и ручное изменение границ цветового интервала посредством вызова функции CAxis()
или изменение границ по заданному массиву CRange()
. Используйте Colorbar()
для отображения цветовой шкалы.
Вид меток по осям определяется функцией SetTicks()
(see section Настройки осей координат). Она имеет 3 аргумента: первый d задает шаг меток (если положительны) или их число (если отрицательны) или логарифмические метки (если равны нулю); второ ns задает число "подметок"; последний определяет начальную точку для меток (по умолчанию это точка пересечения осей). Функция SetTuneTicks включает/выключает выделение общего множителя (большого или малого факторов в диапазоне) для меток осей координат. Наконец, если стандартный вид меток не устраивает пользователя, то их шаблон можно задать явно (можно использовать и ТеХ символы), воспользовавшись функциями SetXTT(), SetYTT(). SetZTT(). SetCTT()
. Кроме того, в качестве меток можно вывести произвольный текст использовав функцию SetTicksVal()
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Стиль линии задается строкой, которая может содержать символ цвета (‘wkrgbcymhRGBCYMHWlenupqLENUPQ’), тип пунктира (‘-|;:ji’ или пробел), ширину линии (‘0123456789’) и тип маркера (‘o+xsd.^v’ и модификатор ‘#’). Если пропущен цвет или тип пунктира, то используется значение по умолчанию с последним указанным цветом или значение из палитры (для see section 1D графики). По умолчанию палитры содержит следующие цвета: темно серый ‘H’, синий ‘b’, зеленый ‘g’, красный ‘r’, голубой ‘c’, пурпурный ‘m’, yellow ‘y’, серый ‘h’, сине-зеленый ‘l’, небесно-синий ‘n’, оранжевый ‘q’, желто-зеленый ‘e’, сине-фиолетовый ‘u’, фиолетовый ‘p’.
Символы цвета: ‘k’ -- черный, ‘r’ -- красный, ‘R’ -- темно красный, ‘g’ -- зеленый, ‘G’ -- темно зеленый, ‘b’ -- синий, ‘B’ -- темно синий, ‘c’ -- голубой, ‘C’ -- темно голубой, ‘m’ -- пурпурный, ‘M’ -- темно пурпурный, ‘y’ -- желтый, ‘Y’ -- темно желтый (золотой), ‘h’ -- серый, ‘H’ -- темно серый, ‘w’ -- белый, ‘W’ -- светло серый, ‘l’ -- сине-зеленый, ‘L’ -- темно сине-зеленый, ‘e’ -- желто-зеленый, ‘E’ -- темно желто-зеленый, ‘n’ -- небесно-синий, ‘N’ -- темно небесно-синий, ‘u’ -- сине-фиолетовый, ‘U’ -- темно сине-фиолетовый, ‘p’ -- фиолетовый, ‘P’ -- темно фиолетовый, ‘q’ -- оранжевый, ‘Q’ -- темно оранжевый (коричневый).
Тип пунктира: пробел -- нет линии (для рисования только маркеров), ‘-’ -- сплошная линия (■■■■■■■■■■■■■■■■), ‘|’ -- длинный пунктир (■■■■■■■■□□□□□□□□), ‘;’ -- пунктир (■■■■□□□□■■■■□□□□), ‘=’ -- короткий пунктир (■■□□■■□□■■□□■■□□), ‘:’ -- точки (■□□□■□□□■□□□■□□□), ‘j’ -- пунктир с точками (■■■■■■■□□□□■□□□□), ‘i’ -- мелкий пунктир с точками (■■■□□■□□■■■□□■□□).Типы маркеров: ‘o’ – окружность, ‘+’ – крест, ‘x’ – косой крест, ‘s’ - квадрат, ‘d’ - ромб, ‘.’ – точка, ‘^’ – треугольник вверх, ‘v’ – треугольник вниз, ‘<’ – треугольник влево, ‘>’ – треугольник вправо, ‘#*’ – знак Y, ‘#+’ – крест в квадрате, ‘#x’ – косой крест в квадрате, ‘#.’ – точка в окружности. Если в строке присутствует символ ‘#’, то используются символы с заполнением.
Стили линий и маркеров.
На конце и в начале линии можно выводить специальный символ (стрелку), если в строке указать один из символов: ‘A’ – стрелка наружу, ‘V’ – стрелка внутрь, ‘I’ – поперечная черта, ‘K’ – стрелка с чертой, ‘T’ – треугольник, ‘S’ – квадрат, ‘D’ – ромб, ‘O’ – круг, ‘_’ – нет стрелки (по умолчанию). При этом действует следующее правило: первый символ определяет стрелку на конце линии, второй символ – стрелку в начале линии. Например, ‘r-A’ – красная сплошная линия со стрелкой на конце, ‘b|AI’ – синий пунктир со стрелкой на конце и чертой вначале, ‘_O’ – линия с текущим стилем и кружком вначале. Эти стили действуют и при построении графиков (например, 1D графики).
Стили стрелок.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Цветовая схема используется для определения цвета поверхностей, линий уровня и пр. Цветовая схема задается строкой s, которая содержит символы цвета (see section Стиль линий) или символы ‘d#:|’. Символ ‘d’ указывает на определение цвета в зависимости от положения точки в пространстве, а не по амплитуде данных. Символ ‘#’ переключает рисование поверхности на сетчатое (для трехмерных поверхностей) или включает рисование сетки на поверхности. Символ ‘|’ отключает интерполяцию цвета в цветовой схеме. Это может быть полезно для “резких” цветов, например, при рисовании матриц. Если в строке встречается символ ‘:’, то он принудительно заканчивает разбор строки для стиля поверхности. После этого символа могут идти описание стиля текста или оси вращения кривой/линий уровня. Цветовая схема может содержать до 32 значений цвета.
В цветовой схеме можно использовать тональные (“подсвеченные”) цвета (не в стиле линий!). Тональный цвет задается двумя символами: первый – обычный цвет, второй – его яркость цифрой. Цифра может быть в диапазоне ‘1’...‘9’. При этом ‘5’ соответствует нормальному цвету, ‘1’ – очень темная версия цвета (почти черный), ‘9’ – очень светлая версия цвета (почти белый). Например цветовая схема может быть ‘b2b7wr7r2’.
Цвета и их идентификаторы.
При определении цвета по амплитуде (наиболее часто используется) окончательный цвет определяется путем линейной интерполяции массива цветов. Массив цветов формируется из цветов, указанных в строке спецификации. Аргумент – амплитуда, нормированная между Cmin – Cmax (see section Настройки осей координат). Например, строка из 4 символов ‘bcyr’ соответствует изменению цвета от синего (минимальное значение) через голубой и желтый (промежуточные значения) к красному (максимальное значение). Строка ‘kw’ соответствует изменению цвета от черного (минимальное значение) к белому (максимальное значение). Строка из одного символа (например, ‘g’) соответствует однотонному цвету (в данному случае зеленому).
Есть несколько полезных цветовых схем. Строка ‘kw’ дает обычную серую (черно-белую) схему, когда большие значения светлее. Строка ‘wk’ представляет обратную серую схему, когда большие значения темнее. Строки ‘kRryw’, ‘kGgw’, ‘kBbcw’ представляют собой хорошо известные схемы hot, summer и winter. Строки ‘BbwrR’ и ‘bBkRr’ позволяют рисовать двухцветные фигуры на белом или черном фоне, когда отрицательные значения показаны синим цветом, а положительные – красным. Строка ‘BbcyrR’ дает цветовую схему, близкую к хорошо известной схеме jet.
Наиболее популярные цветовые схемы.
При определении цвета по положению точки в пространстве окончательный цвет определяется по формуле c=x*c[1] + y*c[2] + z*c[3]. Здесь c[1], c[2], c[3] – первые три цвета в цветовом массиве; x, y, z – координаты точки, нормированные на MinxMax. Такой тип определения цвета полезен, например, при построении поверхностей уровня, когда цвет дает представление о положении точки в пространстве.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Стиль текста задается строкой, которая может содержать несколько символов: тип шрифта (‘ribwou’) и/или выравнивания (‘LRC’), а также цвет текста ‘wkrgbcymhRGBCYMHW’ (see section Стиль линий) после символа ‘:’. Например, ‘biC:b’ соответствует жирному курсиву с выравниванием по центру синего цвета.
Начертания шрифта: ‘r’ – прямой шрифт, ‘i’ – курсив, ‘b’ – жирный. По умолчанию используется прямой шрифт. Типы выравнивания текста: ‘L’ – по левому краю (по умолчанию), ‘C’ – по центру, ‘R’ – по правому краю. Дополнительные эффекты шрифта: ‘w’ – контурный, ‘o’ – надчеркнутый, ‘u’ – подчеркнутый.
Синтаксический разбор LaTeX-их команд по умолчанию включен. Это команды смены стиля текста (например, \b для жирного текста): \a или \overline – надчеркивание, \b или \textbf – жирный, \i или \textit – курсив, \r или \textrm – прямой (отменяет стили жирного и курсива), \u или \underline – подчеркнутый, \w или \wire – контурный, \big – большего размера, @ – меньшего размера. Нижний и верхний индексы задаются символами ‘_’ и ‘^’. При этом изменение стиля применяется только к следующему символу или к символам в фигурных скобках {}, которые понимаются как единый блок. Например, сравните строки ‘sin (x^{2^3})’ и ‘sin (x^2^3)’. Можно также менять цвет текста внутри строки с помощью команд #? или \color?, где ‘?’ – символ цвета (see section Стиль линий). Например, слова ‘Blue’ и ‘red’ будут окрашены в соответствующий цвет в строке ‘#b{Blue} and \colorr{red} text’. Большинство функций понимает символ новой строки ‘\n’ и позволяет выводить много строчный текст. Наконец, можно использовать символы с произвольным UTF кодом с помощью команды \utf0x????
. Например, \utf0x3b1
даст символ
α.
Распознаются также большинство символов TeX и AMSTeX, команды смены стиля текста (\textrm, \textbf, \textit, \textsc, \overline, \underline), акценты (\hat, \tilde, \dot, \ddot, \acute, \check, \grave, \bar, \breve) и корни (\sqrt, \sqrt3, \sqrt4). Полный список содержит около 2000 символов. Отмечу, что первый пробел (пробел, табуляция и пр.) после команды игнорируется, а все остальные пробелы печатаются обычным образом. Например, следующие строки дают одинаковый результат \tilde a: ‘\tilde{a}’; ‘\tilde a’; ‘\tilde{}a’.
В частности, распознаются греческие буквы: α – \alpha, β – \beta, γ – \gamma, δ – \delta, ε – \epsilon, η – \eta, ι – \iota, χ – \chi, κ – \kappa, λ – \lambda, μ – \mu, ν – \nu, o – \o, ω – \omega, ϕ – \phi, π – \pi, ψ – \psi, ρ – \rho, σ – \sigma, θ – \theta, τ – \tau, υ – \upsilon, ξ – \xi, ζ – \zeta, ς – \varsigma, ɛ – \varepsilon, ϑ – \vartheta, φ – \varphi, ϰ – \varkappa; A – \Alpha, B – \Beta, Γ – \Gamma, Δ – \Delta, E – \Epsilon, H – \Eta, I – \Iota, C – \Chi, K – \Kappa, Λ – \Lambda, M – \Mu, N – \Nu, O – \O, Ω – \Omega, Φ – \Phi, Π – \Pi, Ψ – \Psi, R – \Rho, Σ – \Sigma, Θ – \Theta, T – \Tau, Υ – \Upsilon, Ξ – \Xi, Z – \Zeta.Еще примеры наиболее общеупотребительных TeX-их символов: ∠ – \angle, ⋅ – \cdot, ♣ – \clubsuit, ✓ – \checkmark, ∪ – \cup, ∩ – \cap, ♢ – \diamondsuit, ◇ – \diamond, ÷ – \div, ↓ – \downarrow, † – \dag, ‡ – \ddag, ≡ – \equiv, ∃ – \exists, ⌢ – \frown, ♭ – \flat, ≥ – \ge, ≥ – \geq, ≧ – \geqq, ← – \gets, ♡ – \heartsuit, ∞ – \infty, ∫ – \int, \Int, ℑ – \Im, ♢ – \lozenge, ⟨ – \langle, ≤ – \le, ≤ – \leq, ≦ – \leqq, ← – \leftarrow, ∓ – \mp, ∇ – \nabla, ≠ – \ne, ≠ – \neq, ♮ – \natural, ∮ – \oint, ⊙ – \odot, ⊕ – \oplus, ∂ – \partial, ∥ – \parallel, ⊥ –\perp, ± – \pm, ∝ – \propto, ∏ – \prod, ℜ – \Re, → – \rightarrow, ⟩ – \rangle, ♠ – \spadesuit, ~ – \sim, ⌣ – \smile, ⊂ – \subset, ⊃ – \supset, √ – \sqrt or \surd, § – \S, ♯ – \sharp, ∑ – \sum, × – \times, → – \to, ∴ – \therefore, ↑ – \uparrow, ℘ – \wp.
Размер текста может быть задан явно (если size>0) или относительно базового размера шрифта для рисунка |size|*FontSize при size<0. Значение size=0 указывает, что соответствующая строка выводиться не будет. Базовый размер шрифта измеряется во внутренних единицах. Специальные функции SetFontSizePT(), SetFontSizeCM(), SetFontSizeIN()
позволяют задавать его в более “привычных” единицах.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
MathGL имеет быстрый парсер текстовых формул (see section mglFormula class) , понимающий большое число функций и операций. Базовые операции: ‘+’ – сложение, ‘-’ – вычитание, ‘*’ – умножение, ‘/’ – деление, ‘^’ – возведение в целосичленную степень. Также есть логические операции: ‘<’ – истина если if x<y, ‘>’ – истина если x>y, ‘=’ – истина если x=y, ‘&’ – истина если x и y оба не равны нулю, ‘|’ – истина если x или y не нуль. Логические операции имеют наинизший приоритет и возвращают 1 если истина или 0 если ложно.
Базовые функции: ‘sqrt(x)’ – квадратный корень из x, ‘pow(x,y)’ – x в степени y, ‘ln(x)’ – натуральный логарифм x, ‘lg(x)’ – десятичный логарифм x, ‘log(a,x)’ – логарифм по основанию a от x, ‘abs(x)’ – модуль x, ‘sign(x)’ – знак x, ‘mod(x,y)’ – остаток от деления x на y, ‘step(x)’ – ступенчатая функция, ‘int(x)’ – целая часть x, ‘rnd’ – случайное число, ‘pi’ – число π = 3.1415926…
Тригонометрические функции: ‘sin(x)’, ‘cos(x)’, ‘tan(x)’ (или ‘tg(x)’). Обратные тригонометрические функции: ‘asin(x)’, ‘acos(x)’, ‘atan(x)’. Гиперболические функции: ‘sinh(x)’ (или ‘sh(x)’), ‘cosh(x)’ (или ‘ch(x)’), ‘tanh(x)’ (или ‘th(x)’). Обратные гиперболические функции: ‘asinh(x)’, ‘acosh(x)’, ‘atanh(x)’.
Специальные функции: ‘gamma(x)’ – гамма функция Γ(x) = ∫0∞ tx-1 exp(-t) dt, ‘psi(x)’ – дигамма функция ψ(x) = Γ′(x)/Γ(x) для x≠0, ‘ai(x)’ – Эйри функция Ai(x), ‘bi(x)’ – Эйри функция Bi(x), ‘cl(x)’ – функция Клаузена, ‘li2(x)’ (или ‘dilog(x)’) – дилогарифм Li2(x) = -ℜ∫0xds log(1-s)/s, ‘sinc(x)’ – функция sinc(x) = sin(πx)/(πx) для любых x, ‘zeta(x)’ – зета функция Римана ζ(s) = ∑k=1∞k-s для s≠1, ‘eta(x)’ – эта функция η(s) = (1 - 21-s)ζ(s) для произвольного s, ‘lp(l,x)’ – полином Лежандра Pl(x), (|x|≤1, l≥0), ‘w0(x)’, ‘w1(x)’ – функции Ламберта W. Функции W(x) определены как решение уравнения: W exp(W) = x.
Экспоненциальные интегралы: ‘ci(x)’ – cos-интеграл Ci(x) = ∫0xdt cos(t)/t, ‘si(x)’ – sin-интеграл Si(x) = ∫0xdt sin(t)/t, ‘erf(x)’ – функция ошибки erf(x) = (2/√π) ∫0xdt exp(-t2) , ‘ei(x)’ – интеграл Ei(x) = -PV(∫-x∞dt exp(-t)/t) (где PV обозначает главное значение), ‘e1(x)’ – интеграл E1(x) = ℜ∫1∞dt exp(-xt)/t, ‘e2(x)’ – интеграл E2(x) = ℜ∫1∞dt exp(-xt)/t2, ‘ei3(x)’ – интеграл Ei3(x) = ∫0xdt exp(-t3) для x≥0.
Функции Бесселя: ‘j(nu,x)’ – функция Бесселя первого рода, ‘y(nu,x)’ – функция Бесселя второго рода, ‘i(nu,x)’ – модифицированная функция Бесселя первого рода, ‘k(nu,x)’ – модифицированная функция Бесселя второго рода.
Эллиптические интегралы: ‘ee(k)’ – полный эллиптический интеграл E(k) = E(π/2,k), ‘ek(k)’ – полный эллиптический интеграл K(k) = F(π/2,k), ‘e(phi,k)’ – эллиптический интеграл E(φ,k) = ∫0φdt √(1 - k2sin2(t)), ‘f(phi,k)’ – эллиптический интеграл F(φ,k) = ∫0φdt 1/√(1 - k2sin2(t))
Функции Якоби: ‘sn(u,m)’, ‘cn(u,m)’, ‘dn(u,m)’, ‘sc(u,m)’, ‘sd(u,m)’, ‘ns(u,m)’, ‘cs(u,m)’, ‘cd(u,m)’, ‘nc(u,m)’, ‘ds(u,m)’, ‘dc(u,m)’, ‘nd(u,m)’.
Некоторые из функций могут быть недоступны если флаг NO_GSL был определен при компиляции библиотеки MathGL.
При разборе формул нет различия между верхним и нижним регистром. Если аргумент лежит вне области определения функции, то возвращается NaN.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Проверьте, что точки графика находятся внутри ограничивающего параллелепипеда, при необходимости увеличьте его с помощью функции Axis()
. Проверьте, что размерность массива правильная для выбранного типа графика. Убедитесь, что функция Finish()
была вызвана после построения графика (или график был сохранен в файл). Иногда отражение света от плоских поверхностей (типа, Dens()
) может выглядеть как отсутствие графика.
Многие “новые” графики можно строить, используя уже существующие функции. Например, поверхность вращения кривой относительно оси можно построить, используя специальную функцию Torus()
, а можно построить как параметрически заданную поверхность Surf()
. См. также Hints и MathGL examples MathGL. Если же нужного типа графика все равно нет, то пишите мне e-mail и в следующей версии этот график появится.
Нет. Библиотека MathGL самодостаточна и не требует знания сторонних библиотек.
Ядро библиотеки написано на С++. Кроме него, есть интерфейсы для чистого С, фортрана, паскаля, форта и собственный командный язык MGL. Также есть поддержка большого числа интерпретируемых языков (Python, Java, ALLEGROCL, CHICKEN, Lisp, CFFI, C#, Guile, Lua, Modula 3, Mzscheme, Ocaml, Octave, Perl, PHP, Pike, R, Ruby, Tcl). Эти интерфейсы написаны с помощью SWIG (и функции чистого С и классы). Однако на данный момент только интерфейсы для Python и Octave включены в скрипты сборки. Причина в том, что я не знаю других языков, чтобы проверить качество интерфейса :(. Замечу, что большинство прочих языков могут использовать С функции напрямую.
Библиотеку MathGL можно использовать как есть с компилятором gfortran
поскольку он использует по умолчанию AT&T нотацию для внешних функций. Для других компиляторов (например, Visual Fortran) необходимо включить использование AT&T нотации вручную. AT&T нотация требует, чтобы имя функции завершалось символом ‘_’, аргументы функции передавались по указателю и длины строк передавались в конце списка аргументов. Например:
C функция – void mgl_fplot(HMGL graph, const char *fy, const char *stl, int n);
AT&T функция – void mgl_fplot_(uintptr_t *graph, const char *fy, const char *stl, int *n, int ly, int ls);
Функции-члены класса в С++ имеют “скрытый” параметр – указатель на экземпляр класса и их прямое использование невозможно. Решением будет определение интерфейсной функции:
int foo_draw(mglGraph *gr, void *par) { ((Foo *)foo)->draw(gr); } |
и подстановка именно ее в вызов функции Window()
:
gr->Window(argc,argv,foo_draw,"Title",this); |
Можно также наследовать Ваш класс от класса mglDraw
и использовать функцию типа gr->Window(argc, argv, foo, "Title");
.
Стандартный путь состоит в использовании кодировки UTF-8 для вывода текста. Кроме того, все функции вывода текста имеют интерфейс для 8-битных (char *) строк. Однако в последнем случае Вам может потребоваться установить используемую в исходном тексте локаль. Например, для русского языка в кодировке CP1251 можно использовать setlocale(LC_CTYPE, "ru_RU.cp1251");
(под MS Windows имена локали другие – setlocale(LC_CTYPE, "russian_russia.1251")
). Настоятельно не рекомендую использовать константу LC_ALL
, поскольку при этом меняется и формат чисел (в частности, десятичная точка), что может, например, вызвать сложности (неудобство) при написании формул и чтении текстовых файлов. Например, программа ожидает ‘,’ в качестве разделителя целой и дробной части, а пользователь вводит ‘.’.
Есть три основных способа. Во-первых, можно вырезать точку, задав одну из ее координат равной NAN
. Во-вторых, можно воспользоваться функцией SetCutBox()
или CutOff()
для удаления точек из некоторой области (see section Обрезание). Наконец, можно сделать эти точки прозрачными (невидимыми) с помощью функций SurfA()
, Surf3A()
(see section Парные графики). В последнем случае обеспечивается еще и плавность включения прозрачности.
Начиная с версии 1.10, можно использовать заголовочный файл #include <mgl/mgl_w.h>
, содержащий C++ классы только с inline
функциями. Такие классы должны быть совместимы с любым компилятором. Отмечу, что эти "интерфейсные" классы не совместимы с классами в обычных заголовочных файлах и использоваться должны только одни из них! Я рекомендую использовать обычные заголовочные классы для компиляторов GNU (например для MinGW).
Простейший путь – использование комбинации CMake и MinGW. Также Вам может потребоваться дополнительные библиотеки, такие как GSL, PNG, JPEG и пр. Все они могут быть найдены на http://gnuwin32.sourceforge.net/packages.html. После установки всех компонент, просто запустите конфигуратор CMake и соберите MathGL командой make.
Следует создать отдельный поток для обработки сообщений в окно. Кросс-платформенный путь – использование библиотеки pthread
. Обновление данных в окне можно выполнить вызовом функции mglGraphFLTK::Update()
. Пример код имеет вид:
//----------------------------------------------------------------------------- #include <mgl/mgl_fltk.h> #include <pthread.h> #include <unistd.h> mglPoint pnt; // some global variable for changable data //----------------------------------------------------------------------------- int sample(mglGraph *gr, void *) { gr->Box(); gr->Line(mglPoint(),pnt,"Ar2"); // just draw a vector return 0; } //----------------------------------------------------------------------------- void *mgl_fltk_tmp(void *) { mglFlRun(); return 0; } int main (int argc, char ** argv) { mglGraphFLTK gr; gr.Window(argc,argv,sample,"test"); // create window static pthread_t tmp; pthread_create(&tmp, 0, mgl_fltk_tmp, 0); pthread_detach(tmp); // run window handling in the separate thread for(int i=0;i<10;i++) // do calculation { sleep(1); // which can be very long pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1); gr.Update(); // update window } return 0; // finish calculations and close the window } //-----------------------------------------------------------------------------
Большую часть библиотеки написал один человек. Это результат примерно года работы на написание ядра библиотеки и базовых функций (в основном вечерами и по выходным). Процесс усовершенствования продолжается и теперь :). Скрипты сборки в основном написаны Д.Кулагиным, а экспорт в IDTF написан М.Видассовым.
Можно импортировать ее в экземпляр mglData
и построить с помощью функции Dens()
. Например, для черно-белого рисунка можно использовать код: mglData bmp; bmp.Import("fname.png","wk"); gr->Dens(bmp,"wk");
.
Есть специальные классы (виджеты) для этих библиотек: QMathGL для Qt, Fl_MathGL для FLTK и т.д. Если Вы не нашли подходящий класс, то можете создать свой собственный виджет, рисующий растровое изображение из mglGraphAB::GetBits().
Процедура состоит из двух шагов: создания файла IDTF и его конвертация в U3D. Можно использовать U3D tools для конвертации IDTF в U3D. Ему требуется библиотека libharu 2.1.0 или более поздняя. Для установки используйте обычную процедуру ./bootstrap, ./configure, make, sudo make install
. В результате появится программа IDTFConverter для конвертации файлов *.idtf в бинарные файлы *.u3d. Последние можно включить в PDF.
Во-первых, надо загрузить файлы отсюда или отсюда. Далее, в экземпляре mglGraph загружаем шрифты: gr->SetFont(new mglFont(fontname,path));
. Здесь fontname – базовое имя шрифта, например ‘STIX’, и path – путь к папке с файлами шрифтов. Вызовите gr->SetFont(NULL);
для использования шрифта по умолчанию.
Просто используйте отрицательные значения длины меток, например gr->SetTickLen(-0.1);
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Библиотека MathGL имеет интерфейсы к целому ряду языков программирования. Большинство из них базируется на С интерфейсе и построены с помощью инструментария SWIG. Сюда входят Python, Java, Octave, Lisp, C#, Guile, Lua, Modula 3, Ocaml, Perl, PHP, Pike, R, Ruby, Tcl. Кроме того, есть отдельный интерфейс к Фортрану, имеющий похожий набор функций, но со слегка различным типом аргументов (использованы целые вместо указателей). Функции С и Фортран интерфейса помечены [функции С]. Некоторое из языков представленных выше поддерживают объектное программирование (классы). Для них написан собственная оболочка и соответствующие функции/методы помечены (Python). Функции и методы доступные в С++ помечены (С++). Наконец, специальный командный язык MGL был написан для быстрого доступа к функциям C++ со всеми их возможностями. Скрипты MGL могут быть выполнены как из внешних программ (UDAV, mgl2png, mgl2eps и т.д.) так и из кода на C++/C/Python и пр. (see section mglParse class). Подробно эти команды описаны в Язык MGL.
1.6.1 C интерфейс | ||
1.6.2 Python интерфейс |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
C интерфейс является базовым для большинства других интерфейсов. Он содержит функции на чистом C для большинства методов классов MathGL. В отличие от членов-функций C++ классов, C функции в качестве аргументов должны явно иметь переменные типа HMGL (для графики) и/или HMDT (для массивов данных) для указания объекта рисования или данных. Таким образом, первым вызовом пользователя должно быть создание этих объектов с помощью функций mgl_create_*()
, а последним – их удаление с помощью функций mgl_delete_*()
.
Все функции описанны в заголовочном файле #include <mgl/mgl_c.h>
и используют переменные для идентификаторов объектов рисования/данных следующих типов:
HMGL
— Указатель на класс mglGraph
(see section Ядро MathGL).
HMDT
— Указатель на класс mglData
(see section Класс mglData).
HMPR
— Указатель на класс mglParse
(see section mglParse class)..
Эти переменные содержат идентификаторы объектов графики или данных.
Фортрановские функции имеют те же имена, что и функции C. Однако, есть различие: переменные типов HMGL, HMDT
должны быть объявлены как целые достаточной разрядности (integer*4 на 32-битных системах или integer*8 на 64-битных системах). Все С функции являются процедурами для Фортрана (должны вызываться с помощью оператора call). Исключение составляют функции, возвращающие переменные типа HMGL
или HMDT
. Последние должны быть объявлены целыми для использования в фортрановском коде. Также помните, что строки в фортране обозначаются одинарной кавычкой </samp>’
, а не двойной "
как в С/С++.
Создание и удаление графического объекта
HMGL
mgl_create_graph_zb (int
width, int
height)Создает экземпляр класса mglGraphZB с указанными размерами.
HMGL
mgl_create_graph_glut (int (*
draw)(HMGL gr, void *p)
, const char *
title, void *
par)Создает экземпляр класса mglGraphGLUT и связанное с ним окно. Одновременно может быть открыто только одно окно. Описание аргументов функции см. в Класс mglGraphAB.
HMGL
mgl_create_graph_fltk (int (*
draw)(HMGL gr, void *p)
, const char *
title, void *
par)Создает экземпляр класса mglGraphFLTK и связанное с ним окно. Одновременно может быть открыто несколько окно. Однако Вы должны вызвать функцию mgl_fltk_run()
для начала обработки сообщений окну. Описание аргументов функции см. в Класс mglGraphAB. Замечу, что параметр draw может быть равным NULL
для отображения текущей статической картинки (анимация и слайды не доступны).
HMGL
mgl_create_graph_qt (int (*
draw)(HMGL gr, void *p)
, const char *
title, void *
par)Создает экземпляр класса mglGraphQT и связанное с ним окно. Одновременно может быть открыто несколько окно. Однако Вы должны вызвать функцию mgl_qt_run()
для начала обработки сообщений окну. Описание аргументов функции см. в Класс mglGraphAB. Замечу, что параметр draw может быть равным NULL
для отображения текущей статической картинки (анимация и слайды не доступны).
void
mgl_fltk_run ()Запускает цикл обработки сообщений FLTK. Обычно программа завершает функцию main() вызовом return mgl_fltk_run();
.
void
mgl_fltk_thread ()Запускает цикл обработки сообщений FLTK. В отличие от mgl_fltk_run()
цикл запускается в отдельном потоке, так что основная программа продолжает выполнение сразу.
void
mgl_qt_run ()Запускает цикл обработки сообщений Qt. Обычно программа завершает функцию main() вызовом return mgl_qt_run();
.
void
mgl_qt_thread ()Запускает цикл обработки сообщений Qt. В отличие от mgl_qt_run()
цикл запускается в отдельном потоке, так что основная программа продолжает выполнение сразу.
void
mgl_set_show_mouse_pos (HMGL
graph, int
enable)Switch to show or not in the widget the last mouse click position.
void
mgl_get_last_mouse_pos (HMGL
graph, float *
x, float *
y, float *
z)Last position of mouse click.
void
mgl_calc_xyz (HMGL
graph, int
xs, int
ys, float *
x, float *
y, float *
z)Calculate 3D coordinate {x,y,z} for screen point {xs,ys}. At this moment it ignore perspective and transformation formulas (curvilinear coordinates). The calculation are done for the last used InPlot (see section Матрица преобразования).
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
MathGL provide the interface to a set of languages via SWIG library. Some of these languages support classes. The typical example is Python – which is denoted in the chapter title.
To use Python classes just execute ‘import mathgl’. The simplest example will be:
import mathgl a=mathgl.mglGraph() a.Box() a.WritePNG(</samp>’test.png</samp>’)
Alternatively you can import all classes from mathgl
module and easily access MathGL classes:
from mathgl import * a=mglGraph() a.Box() a.WritePNG(</samp>’test.png</samp>’)
It become useful if you will create many mglData
object, for example.
There are 2 classes in Python interface:
mglGraph
– provide practically the same functionality as C++ class mglGraph
(see section Ядро MathGL). But it is not abstract class and it allows one to select at construction stage which plotter (ZB or PS and so on) will be used.
mglData
– is absolutely the same class as C++ mglData
(see section Класс mglData). But an additional feature to acess data values is added. You can use construction like this: dat[i]=sth;
or sth=dat[i]
at this flat representation of data is used (i.e., i can be in range 0...nx*nx*nz-1. Also you can import NumPy arrays as input arguments: mgl_dat = mglData(numpy_dat);
.
To use Python classes just execute ‘import mathgl’. The simplest example will be:
import mathgl a=mathgl.mglGraph() a.Box() a.WritePNG(</samp>’test.png</samp>’)
Alternatively you can import all classes from mathgl
module and easily access MathGL classes:
from mathgl import * a=mglGraph() a.Box() a.WritePNG(</samp>’test.png</samp>’)
It become useful if you will create many mglData
object, for example.
There are 2 classes in Python interface:
mglGraph
– provide practically the same functionality as C++ class mglGraph
(see section Ядро MathGL). But it is not abstract class and it allows one to select at construction stage which plotter (ZB or PS and so on) will be used.
mglData
– is absolutely the same class as C++ mglData
(see section Класс mglData). But an additional feature to acess data values is added. You can use construction like this: dat[i]=sth;
or sth=dat[i]
at this flat representation of data is used (i.e., i can be in range 0...nx*nx*nz-1.
There is main difference from C++ classes – Python class mglGraph
don</samp>’t have variables (options). All corresponding features are moved to methods.
The core of MathGL Python class is mglGraph class. It contains a lot of plotting functions for 1D, 2D and 3D plots. So most of sections is describe its methods. Its constructor have following arguments:
mglGraph (int
kind=0
, int
width=600
, int
height=400
)Create the instance of class mglGraph with specified sizes width and height. Parameter type may have following values: ‘0’ – use mglGraphZB
plotter (default), ‘1’ – use mglGraphPS
plotter, ‘2’ – use mglGraphGL
plotter, ‘3’ – use mglGraphIDTF
plotter.
There is main difference from C++ classes – Python class mglGraph
don</samp>’t have variables (options). All corresponding features are moved to methods. The core of MathGL Python class is mglGraph class. It contains a lot of plotting functions for 1D, 2D and 3D plots. So most of sections is describe its methods. Its constructor have following arguments:
mglGraph (int
kind=0
, int
width=600
, int
height=400
)Create the instance of class mglGraph with specified sizes width and height. Parameter type may have following values: ‘0’ – use mglGraphZB
plotter (default), ‘1’ – use mglGraphPS
plotter, ‘2’ – use mglGraphGL
plotter, ‘3’ – use mglGraphIDTF
plotter.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated on March 1, 2016 using texi2html 1.82.