3.1.1 Использование окон MathGL

“Интерактивный” способ использования MathGL состоит в создании окна с помощью классов mglQT, mglFLTK или mglGLUT (см. “Оконные” классы) и последующем рисовании в этом окне. Соответствующий код выглядит так:

#include <mgl2/qt.h>
int sample(mglGraph *gr)
{
  gr->Rotate(60,40);
  gr->Box();
  return 0;
}
//-----------------------------------------------------
int main(int argc,char **argv)
{
  mglQT gr(sample,"MathGL examples");
  return gr.Run();
}

Здесь используется callback функция sample, выполняющая собственно рисование. Функция main – точка входа в программу – создает окно (объект gr типа mglQT) и запускает цикл обработки сообщений (вызов gr.Run()). Для компиляции достаточно выполнить команду

gcc test.cpp -lmgl-qt5 -lmgl

Вы можете использовать "-lmgl-qt4" вместо "-lmgl-qt5", если установлен Qt4.

Альтернативный способ состоит в использовании класса, производного от mglDraw с переопределенной функцией Draw():

#include <mgl2/qt.h>
class Foo : public mglDraw
{
public:
  int Draw(mglGraph *gr);
};
//-----------------------------------------------------
int Foo::Draw(mglGraph *gr)
{
  gr->Rotate(60,40);
  gr->Box();
  return 0;
}
//-----------------------------------------------------
int main(int argc,char **argv)
{
  Foo foo;
  mglQT gr(&foo,"MathGL examples");
  return gr.Run();
}

Или в использовании функций С:

#include <mgl2/mgl_cf.h>
int sample(HMGL gr, void *)
{
  mgl_rotate(gr,60,40,0);
  mgl_box(gr);
}
int main(int argc,char **argv)
{
  HMGL gr;
  gr = mgl_create_graph_qt(sample,"MathGL examples",0,0);
  return mgl_qt_run();
/* generally I should call mgl_delete_graph() here,
 * but I omit it in main() function. */
}

Похожий код получается и при использовании окон mglFLTK, mglGLUT (функция sample() та же):

#include <mgl2/glut.h>
int main(int argc,char **argv)
{
  mglGLUT gr(sample,"MathGL examples");
  return 0;
}

The rotation, shift, zooming, switching on/off transparency and lighting can be done with help of tool-buttons (for mglWindow) or by hot-keys: ‘a’, ‘d’, ‘w’, ‘s’ for plot rotation, ‘r’ and ‘f’ switching on/off transparency and lighting. Press ‘x’ for exit (or closing the window).

In this example function sample rotates axes (Rotate(), see Матрица преобразования) and draws the bounding box (Box()). Drawing is placed in separate function since it will be used on demand when window canvas needs to be redrawn.