[ < ] | [ > ] | [ << ] | [ 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);
При использовании фортрана необходимо также включить библиотеку -lstdc++
. Кроме того, если библиотека была собрана с опцией enable-double=ON
(по умолчанию в версии 2.1 и более поздних), то все вещественные числа должны быть типа real*8
. Это можно включить по умолчанию опцией -fdefault-real-8
.
Функции-члены класса в С++ имеют “скрытый” параметр – указатель на экземпляр класса и их прямое использование невозможно. Решением будет определение интерфейсной функции:
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 Парные графики). В последнем случае обеспечивается еще и плавность включения прозрачности.
Начиная с версии 2.0, рекомендуемый к использованию класс mglGraph (заголовочный файл #include <mgl2/mgl.h>
) содержbn только с inline
функции и может использоваться с любым компилятором без перекомпиляции бинарной версии библиотеки. Однако, если Вы планируете использовать низкоуровневые возможности (т.е. классы mglBase, mglCanvas и т.д.), то Вам следует перекомпилировать библиотеку MathGL с использованием Вашего компилятора.
Отмечу, что использование предоставляемых динамических библиотек *.dll требует создания библиотек импорта (import library *.lib). Эта процедура зависит от используемого компилятора – обратитесь к документации по Вашему компилятору. Например для VisualStudio это можно сделать командой lib.exe /DEF:libmgl.def /OUT:libmgl.lib
.
Простейший путь – использование комбинации CMake и MinGW. Также Вам может потребоваться дополнительные библиотеки, такие как GSL, PNG, JPEG и пр. Все они могут быть найдены на http://gnuwin32.sourceforge.net/packages.html. После установки всех компонент, просто запустите конфигуратор CMake и соберите MathGL командой make.
Следует создать отдельный поток для обработки сообщений в окно. Кросс-платформенный путь – использование библиотеки pthread
. Обновление данных в окне можно выполнить вызовом функции mglGraphFLTK::Update()
. Пример код имеет вид:
//----------------------------------------------------------------------------- #include <mgl2/window.h> #include <pthread.h> mglPoint pnt; // some global variable for changable data //----------------------------------------------------------------------------- int sample(mglGraph *gr) { 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) { mglWindow gr(0,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 } //-----------------------------------------------------------------------------
В случае если требуется вывести статичную картинку с текущими результатами расчетов, то достаточно передать NULL
вместо функции рисования и вызывать Update()
по мере необходимости для обновления графика. Такой способ подходит и для пользователей фортрана.
//----------------------------------------------------------------------------- #include <mgl2/window.h> //----------------------------------------------------------------------------- int sample(mglGraph *gr) { 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) { mglWindow gr(0,NULL,"test"); // create window 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); sample(&gr); // draw picture gr.Update(); // update window } return 0; // finish calculations and close the window } //-----------------------------------------------------------------------------
Большую часть библиотеки написал один человек. Это результат примерно года работы на написание ядра библиотеки и базовых функций (в основном вечерами и по выходным). Процесс усовершенствования продолжается и теперь :). Скрипты сборки в основном написаны Д.Кулагиным, а экспорт в PRC/PDF написан М.Видассовым.
Можно импортировать ее в экземпляр mglData
и построить с помощью функции Dens()
. Например, для черно-белого рисунка можно использовать код: mglData bmp; bmp.Import("fname.png","wk"); gr->Dens(bmp,"wk");
.
Есть специальные классы (виджеты) для этих библиотек: QMathGL для Qt, Fl_MathGL для FLTK и т.д. Если Вы не нашли подходящий класс, то можете создать свой собственный виджет, рисующий растровое изображение из mglCanvas::GetBits().
Используйте функцию WritePRC
(), которая создаст PDF файл если MathGL был собран с enable-pdf=ON.
Используйте функцию WriteTEX
(), которая создаст LaTeX файлы с собственно рисунком ‘fname.tex’, с цветами MathGL ‘mglcolors.tex’ и основной файл ‘mglmain.tex’, который может использоваться для просмотра изображения и/или генерации PDF с помощью команды типа pdflatex mglmain.tex
.
Да, пример JavaScript файла находится в папке texinfo/ исходных текстов. Для его работы необходимо предоставить JSON данные с 3d изображением (можно создать с помощью WriteJSON
() функции). Скрипт позволяет выполнять базовые операции: приближение/удаление, вращение и сдвиг. Примеры использования JavaScript можно найти в http://mathgl.sf.net/json.html.
Во-первых, надо загрузить файлы отсюда или отсюда. Далее, в экземпляре mglGraph загружаем шрифты: gr->LoadFont(fontname,path);
. Здесь fontname – базовое имя шрифта, например ‘STIX’, и path – путь к папке с файлами шрифтов. Вызовите gr->RestoreFont();
для использования шрифта по умолчанию.
Просто используйте отрицательные значения длины меток, например gr->SetTickLen(-0.1);
.
Просто используйте Aspect(NAN,NAN)
для каждого подграфика, или в начале рисования.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated by Autobuild on September 28, 2013 using texi2html 1.82.