extern mglTeXsymb mgl_tex_symb[];
int test(mglGraphAB *gr)
{
- int N[5] = {0, 28, 52, 73, 85};
- char text[256];
- float tmin = -900, tmax = -400, dt = 100;
- double amp[5] = {1., 1.62, 3.98, 5.53, 8.54};
- double z0 = 0.031;//0.063
- gr->SetSize(2400,800);
- gr->Clf(); gr->RotatedText = false; gr->TuneTicks = false;
- gr->InPlot(0,0.3,0.15,1);
- gr->Axis(mglPoint(tmin,-1,-0.65),mglPoint(tmax,1,1),mglPoint(tmin,0,0));
- gr->CAxis(0,1); gr->Light(true); gr->Alpha(true); gr->AlphaDef = 0.6;
- gr->Rotate(75-7*1*0-5*1,365);
- sprintf(text,"\\i z = %g z_R",N[0]*z0);
- gr->Puts(mglPoint(0.5*(tmin+tmax),-1,-0.8),text,"rC");
- sprintf(text,"\\i I_{max}=%g",amp[0]);
- gr->Puts(mglPoint(0.5*(tmax+tmin),0,1.1),text,"rC");
- gr->Light(false); gr->Alpha(false);
- gr->Line(mglPoint(tmin,-1,0),mglPoint(tmax,-1,0),"r5");
- gr->dz = 0.2; gr->dx = dt;
- gr->Min.z = 0;
- //gr->Axis("_yz");
- float size = gr->FontSize; gr->FontSize = 4;
- gr->Axis("_y"); gr->Axis("z");
- gr->Org = mglPoint(tmin,-1,0); gr->Axis("x"); gr->FontSize = size;
- gr->Min.z = -0.65;
- gr->Org = mglPoint(tmin,0,-0.65); gr->Axis("_xy");
- //------------------------------------------------------------------------------------
- //-----------------------------Второй график-----------------------------------------
- gr->InPlot(0.172,0.472,0.135,0.985);
- gr->Axis(mglPoint(tmin,-1,-0.65),mglPoint(tmax,1,1),mglPoint(tmin,0,0));
- gr->CAxis(0,1); gr->Light(true); gr->Alpha(true); gr->AlphaDef = 0.6;
- gr->Rotate(75-7*1*0-5*1,365);
- sprintf(text,"\\i z = %g z_R",N[1]*z0);
- gr->Puts(mglPoint(0.5*(tmin+tmax),-1,-0.8),text,"rC");
- sprintf(text,"\\i I_{max}=%g",amp[1]);
- gr->Puts(mglPoint(0.5*(tmax+tmin),0,1.1),text,"rC");
- gr->Light(false); gr->Alpha(false);
- gr->Line(mglPoint(tmin,-1,0),mglPoint(tmax,-1,0),"r5");
- gr->Min.z = 0;
- gr->Axis("_xyz");
- gr->Min.z = -0.65;
- gr->Org = mglPoint(tmin,0,-0.65); gr->Axis("_xy");
-/* //------------------------------------------------------------------------------------
- //-----------------------------Третий график-----------------------------------------
- u->ReadHDF(_sprintf("%d.h5",N[2]),"/Real(E)"); u->Transpose();
- intensity( Nt, Nr, k, w0, u->a ); (V+2)->Set(u->a,Nt,Nr);
- std::cout<<"Max = "<<V[2].Maximal()/max<<std::endl;
- (V+2)->Norm(0,1); (V+5)->Set((V+2)->a,Nt,1);
- gr->InPlot(0.344,0.644,0.12,0.97);
- gr->Axis(mglPoint(tmin,-1,-0.65),mglPoint(tmax,1,1),mglPoint(tmin,0,0));
- gr->CAxis(0,1); gr->Light(true); gr->Alpha(true); gr->AlphaDef = 0.6;
- gr->Rotate(75-7*1*0-5*1,365);
- sprintf(text,"\\i z = %g z_R",N[2]*z0);
- gr->Puts(mglPoint(0.5*(tmin+tmax),-1,-0.8),text,"rC");
- sprintf(text,"\\i I_{max}=%g",amp[2]);
- gr->Puts(mglPoint(0.5*(tmax+tmin),0,1.1),text,"rC");
- gr->Surf(V[0],V[1],V[2],"wyrRk"); gr->Surf(V[0],V[3],V[2],"wyrRk");
- gr->Plot(V[0],V[4],V[5],"b3");
- gr->Cont(V[0],V[1],V[2],"wyrRk",20); gr->Cont(V[0],V[3],V[2],"wyrRk",20);
- gr->Light(false); gr->Alpha(false);
- (V+2)->Norm(0,1);
- gr->Dens(V[0],V[1],V[2],"wyrRk"); gr->Dens(V[0],V[3],V[2],"wyrRk");
- gr->Line(mglPoint(tmin,-1,0),mglPoint(tmax,-1,0),"r5");
- gr->Min.z = 0;
- gr->Axis("_xyz");
- gr->Min.z = -0.65;
- gr->Org = mglPoint(tmin,0,-0.65); gr->Axis("_xy");
- //------------------------------------------------------------------------------------
- //-----------------------------Четвертый график-----------------------------------------
- u->ReadHDF(_sprintf("%d.h5",N[3]),"/Real(E)"); u->Transpose();
- intensity( Nt, Nr, k, w0, u->a ); (V+2)->Set(u->a,Nt,Nr);
- std::cout<<"Max = "<<V[2].Maximal()/max<<std::endl;
- (V+2)->Norm(0,1); (V+5)->Set((V+2)->a,Nt,1);
- gr->InPlot(0.516,0.816,0.105,0.955);
- gr->Axis(mglPoint(tmin,-1,-0.65),mglPoint(tmax,1,1),mglPoint(tmin,0,0));
- gr->CAxis(0,1); gr->Light(true); gr->Alpha(true); gr->AlphaDef = 0.6;
- gr->Rotate(75-7*1*0-5*1,365);
- sprintf(text,"\\i z = %g z_R",N[3]*z0);
- gr->Puts(mglPoint(0.5*(tmin+tmax),-1,-0.8),text,"rC");
- sprintf(text,"\\i I_{max}=%g",amp[3]);
- gr->Puts(mglPoint(0.5*(tmax+tmin),0,1.1),text,"rC");
- gr->Surf(V[0],V[1],V[2],"wyrRk"); gr->Surf(V[0],V[3],V[2],"wyrRk");
- gr->Plot(V[0],V[4],V[5],"b3");
- gr->Cont(V[0],V[1],V[2],"wyrRk",20); gr->Cont(V[0],V[3],V[2],"wyrRk",20);
- gr->Light(false); gr->Alpha(false);
- (V+2)->Norm(0,1);
- gr->Dens(V[0],V[1],V[2],"wyrRk"); gr->Dens(V[0],V[3],V[2],"wyrRk");
- gr->Line(mglPoint(tmin,-1,0),mglPoint(tmax,-1,0),"r5");
- gr->Min.z = 0;
- gr->Axis("_xyz");
- gr->Min.z = -0.65;
- gr->Org = mglPoint(tmin,0,-0.65); gr->Axis("_xy");
- //------------------------------------------------------------------------------------
- //-----------------------------Пятый график-----------------------------------------
- u->ReadHDF(_sprintf("%d.h5",N[4]),"/Real(E)"); u->Transpose();
- intensity( Nt, Nr, k, w0, u->a ); (V+2)->Set(u->a,Nt,Nr);
- std::cout<<"Max = "<<V[2].Maximal()/max<<std::endl;
- (V+2)->Norm(0,1); (V+5)->Set((V+2)->a,Nt,1);
- gr->InPlot(0.688,0.988,0.09,0.94);
- gr->Axis(mglPoint(tmin,-1,-0.65),mglPoint(tmax,1,1),mglPoint(tmin,0,0));
- gr->CAxis(0,1); gr->Light(true); gr->Alpha(true); gr->AlphaDef = 0.6;
- gr->Rotate(75-7*1*0-5*1,365);
- sprintf(text,"\\i z = %g z_R",N[4]*z0);
- gr->Puts(mglPoint(0.5*(tmin+tmax),-1,-0.8),text,"rC");
- sprintf(text,"\\i I_{max}=%g",amp[4]);
- gr->Puts(mglPoint(0.5*(tmax+tmin),0,1.1),text,"rC");
- gr->Surf(V[0],V[1],V[2],"wyrRk"); gr->Surf(V[0],V[3],V[2],"wyrRk");
- gr->Plot(V[0],V[4],V[5],"b3");
- gr->Cont(V[0],V[1],V[2],"wyrRk",20); gr->Cont(V[0],V[3],V[2],"wyrRk",20);
- gr->Light(false); gr->Alpha(false);
- (V+2)->Norm(0,1);
- gr->Dens(V[0],V[1],V[2],"wyrRk"); gr->Dens(V[0],V[3],V[2],"wyrRk");
- gr->Line(mglPoint(tmin,-1,0),mglPoint(tmax,-1,0),"r5A");
- gr->Puts(mglPoint(1.1*tmax,-1,-0.15),"\\tau","rR",-1.6);
- gr->Puts(mglPoint(0.9*tmax,0,-0.1),"\\rho","rR",-1.6);
- gr->Min.z = 0;
- gr->Axis("_xyz");
- gr->Min.z = -0.65;
- gr->Org = mglPoint(tmin,0,-0.65); gr->Axis("_xy");
-*/
- return 0;
-
-
-
-
-
-
-
-
mglParse par;
par.AllowSetSize = true;
FILE *fp=fopen("test.mgl","rt");
else gr->SetSize(width,height);
if(dotest)
- { test(gr); gr->WriteEPS("test.eps"); gr->WritePNG("test.png","",false); return 0; }
+ {
+ mglTestMode=true; test(gr);
+ gr->WriteEPS("test.eps"); gr->WritePNG("test.png","",false);
+ return 0;
+ }
if(srnd) mgl_srnd(1);
gr->VertexColor(false); gr->TextureColor(true); gr->Compression(false);
@menu
* Why I have written MathGL?::
* MathGL features::
-* Installation and using::
+* Installation and usage::
* General concepts::
* FAQ::
* Interfaces::
На данный момент (версия @value{VERSION}) MathGL это более 20000 строк кода, более 40 основных типов графиков для одно-, двух- и трехмерных массивов, возможность экспорта в растровые и векторные (EPS или SVG) файлы, интерфейс для OpenGL и возможность запуска в консольном режиме, функции для обработки данных и даже простейший командный (интерпретируемый) язык MGL для упрощения построения графиков. Кроме того, есть несколько типов прозрачности, гладкое освещение, векторные шрифты, TeX-ие команды в надписях, произвольные криволинейные системы координат и прочие полезные мелочи (см. раздел pictures на @uref{http://mathgl.sf.net/, домашней странице}). Ну, и, естественно, полная переносимость библиотеки и ее свободное распространение под лицензией GPL v.2.0 или более поздней.
-@node MathGL features, Installation and using, Why I have written MathGL?, Overview
+@node MathGL features, Installation and usage, Why I have written MathGL?, Overview
@section Возможности MathGL
Библиотека MathGL позволяет строить широкий класс графиков, включая:
Для @emph{быстрого} вычисления значения выражения, заданного текстовой строкой, используется класс mglFormula (@pxref{mglFormula class}). Он основан на компиляции строки в древоподобную структуру при создании экземпляра класса. На этапе вычисления происходит быстрый обход дерева с выдачей результата для конкретных значений переменных. Помимо изменения значений массива данных, текстовые формулы используются для рисования в @emph{произвольной} криволинейной системе координат. Набор таких координат ограничивается только фантазией пользователя, а не фиксированным числом (типа полярной, параболической, цилиндрической и т.д.).
-@node Installation and using, General concepts, MathGL features, Overview
+@node Installation and usage, General concepts, MathGL features, Overview
@section Установка MathGL
-Установка библиотеки возможна тремя способами.
+Установка библиотеки возможна 4-мя способами.
@enumerate
@item
Скомпилировать библиотеку непосредственно из исходных файлов. С библиотекой поставляется стандартный скрипт для autoconf/automake. Для его запуска достаточно в командной строке выполнить 3 команды: сначала @code{./configure} далее @code{make} и, наконец, с правами суперпользователя @code{make install}. Иногда после компиляции библиотеки может потребоваться обновление списка библиотека в системе -- выполните команду @code{ldconfig} с правами суперпользователя.
Скрипт @code{./configure} имеет несколько дополнительных опций, которые по умолчанию отключены. К их числу относятся: @code{--enable-fltk, --enable-glut, --enable-qt} для поддержки FLTK, GLUT и/или Qt окон; @code{--enable-jpeg, --enable-tiff, --enable-hdf5} для поддержки соответствующих форматов; @code{--enable-all} для включения всех возможностей. Для использования типа @code{double} для внутреннего хранения данных используйте опцию @code{--enable-double}. Для создания интерфейсов к другим языкам (кроме С/Фортран/MGL) используйте опции @code{--enable-python, --enable-octave} или @code{--enable-langall} для всех поддерживаемых языков. Полный список опций можно увидеть, выполнив @code{./configure --help}.
+
+@item
+В случае если инструменты autoconf/automake не доступны (например, при компиляции под Windows или MacOS), то можно воспользоваться системой сборки cmake. В данном случае будет недоступна сборка документации, но сборка самой библиотеки и утилит возможна и не на GNU компиляторах.
+
@item
-Использовать предварительно скомпилированные файлы -- с библиотекой поставляются файлы для MinGW (платформа Win32). В скомпилированной версии достаточно распаковать заголовочные файлы в папку с заголовочными файлами и библиотеку libmgl.a в папку с библиотеками. По умолчанию, скомпилированная версия включают поддержку GSL (www.gsl.org) и PNG. Соответственно, при сборке программы эти библиотеки должны быть установлены (их можно найти на @uref{http://gnuwin32.sf.net}).
+Использовать предварительно скомпилированные файлы -- с библиотекой поставляются файлы для MinGW (платформа Win32). В скомпилированной версии достаточно распаковать заголовочные файлы в папку с заголовочными файлами и библиотеку libmgl.a в папку с библиотеками. По умолчанию, скомпилированная версия включают поддержку GSL (www.gsl.org), PNG, GIF и JPEG. Соответственно, при сборке программы эти библиотеки должны быть установлены (их можно найти на @uref{http://gnuwin32.sourceforge.net/packages.html}).
@item
Установить из стандартных пакетов (RPM, deb, DevPak и пр.).
@end enumerate
При сборке пользовательской программы достаточно указать ключ @code{-lmgl} для компиляции в консольной программе или с использованием внешней графической библиотеки. При использовании окон FLTK или GLUT надо указать/добавить ключи, включающие соответствующие библиотеки -- @code{-lmgl-fltk} или @code{-lmgl-glut}. Для использования в Фортране дополнительно надо указать опцию @code{-lstdc++} для библиотек C++.
-@node General concepts, FAQ, Installation and using, Overview
+@node General concepts, FAQ, Installation and usage, Overview
@section Основные принципы
Возможности библиотеки MathGL довольно богаты -- число только основных типов графиков превышает 50 видов. Кроме того, есть функции для обработки данных, настройки вида графика и пр. и пр. Тем не менее, я старался придерживаться единого стиля в порядке аргументов функций и способе их ``настройки''. В основном все ниже сказанное относится к функциям рисования различных графиков.