[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4. Классы для отрисовки

Класс mglGraph (see section Ядро MathGL) обеспечивает базовые функции для создания научной графики, но это абстрактный класс. Причина в том, что существует несколько возможностей вывода/отображения получившегося рисунка: в растровый или в векторный файлы, используя OpenGL и т.д. В результате, для конечной отрисовки необходимо использовать производные классы. В принципе, можно наследовать непосредственно mglGraph (и так было до версии 1.6). Однако, я рекомендую использовать в качестве базового класс mglGraphAB для большего единообразия получающейся графики в различных классах. Класс mglGraphAB – другой абстрактный класс, обеспечивающий преобразование координат, базовые функции рисования и сохранения в растровое изображение. Он требует доопределения функций рисования линий, треугольников и четырехугольников. Ниже приведены классы “отрисовки” с короткими комментариями.

Класс: mglGraphAB

Абстрактный класс, обеспечивающий отрисовку по глубине, преобразование к экранным координатам, сохранение в растровое изображение и т.д. Класс определен в #include <mgl/mgl_ab.h>.

Класс: mglGraphZB

Реализует растровую отрисовку изображения используя Z-Buffer. Можно использовать для рисования в памяти (или в консоли/SSH терминале). Также этот класс используется как базовый для рисования в окне (например, используя FLTK, Qt, wxWidgets библиотеки и пр.). При экспорте в EPS формат сохраняется растровая картинка. Получающийся рисунок лучшего качества, но рисуется медленнее чем в классе mglGraphPS. Класс определен в #include <mgl/mgl_zb.h>.

Класс: mglGraphPS

Реализует векторную отрисовку изображения с возможностью сохранения в векторный PostScript или SVG файл. Можно использовать для рисования в памяти (или в консоли/SSH терминале). Замечу, что сглаживание цвета не поддерживается, а при экспорте в EPS не поддерживается и прозрачность (в силу ограничения формата). В результате рисунок получается быстрее, но более низкого качества чем в классе mglGraphZB. Класс определен в #include <mgl/mgl_eps.h>.

Класс: mglGraphGL

Реализует векторную графику с использованием OpenGL. Класс не может быть использован для рисования в консоли. В силу ограничения OpenGL возможна проблема корректного отображения нескольких перекрывающихся поверхностей. Класс определен в #include <mgl/mgl_gl.h>.

Класс: mglGraphIDTF

Реализует экспорт графики в IDTF формате, который затем можно преобразовать в формат U3D. Класс определен в #include <mgl/mgl_idtf.h>.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1 Класс mglGraphAB

Вообще говоря это чуть “менее абстрактный” класс чем mglGraph (see section Ядро MathGL). Он предоставляет много методов для обработки промежуточных данных и требует в производных классах определения только нескольких методов для отрисовки примитивов. Разработчикам, наследующим этот класс, следует посмотреть файл ‘mgl_ab.h’ и комментарии в нем или обратиться к автору.

Ниже я только перечислю основные общедоступные методы класса mglGraphAB. В первую очередь это функции, возвращающие созданный растровый рисунок, его ширину и высоту. В дальнейшем его можно использовать в любой графической библиотеке (см. также, “Оконные” классы) или сохранить в файл (см. также, Экспорт в файл).

Метод класса mglGraphAB (C++): const unsigned char * GetBits ()
Метод класса mglGraph (Python): void GetRGB (char *buf, int size)
Метод класса mglGraph (Python): void GetBGRN (char *buf, int size)
C function: const unsigned char * mgl_get_rgb (HMGL gr)

Возвращает растровое изображение в формате RGB для текущего кадра. Формат каждого элемента (пикселя): {red, green, blue}. Число элементов Width*Height. Положение элемента {i,j} есть [3*i + 3*Width*j] (или [4*i + 4*Width*j] для GetBGRN()). В Python вы должны предоставить буфер buf достаточного размера size, т.е. код должен выглядеть следующим образом

from mathgl import *
gr = mglGraph();
bits='\t';
bits=bits.expandtabs(4*gr.GetWidth()*gr.GetHeight());
gr.GetBGRN(bits, len(bits));
Метод класса mglGraphAB (C++): const unsigned char * GetRGBA ()
Метод класса mglGraph (Python): void GetRGBA (char *buf, int size)
C function: const unsigned char * mgl_get_rgba (HMGL gr)

Возвращает растровое изображение в формате RGBA для текущего кадра. Формат каждого элемента (пикселя): {red, green, blue, alpha}. Число элементов Width*Height. Положение элемента {i,j} есть [4*i + 4*Width*j].

Метод класса mglGraphAB (C++, Python): int GetWidth ()
Метод класса mglGraphAB (C++, Python): int GetHeight ()
C function: int mgl_get_width (HMGL gr)
C function: int mgl_get_height (HMGL gr)

Возвращает ширину и высоту изображения.

Класс mglGraphAB – базовый класс для “оконных классов”. Поэтому он содержит набор функций для создания и управления окном. Большинство из них применимо только в “оконных классах” (типа mglGraphFLTK и др, see section “Оконные” классы). В остальных случаях функции ничего не делают. Если вы создаете оконный класс, то Вам следует предоставить такой же интерфейс для удобства пользователя.

Method on mglGraphAB: void Window (int argc, char **argv, int (*draw)(mglGraph *gr, void *p), const char *title, void *par=NULL, void (*reload)(int next, void *p)=NULL, bool maximize=false)

Создает окно для вывода графика. Параметры argc, argv содержат информацию операционной системы и их слеудет передать в эту функцию из функции main(int argc,char **argv) (хотя они и могут быть равны NULL). Параметр draw – указатель (имя) функции рисования. Есть возможность создания нескольких кадров вначале (требует больше памяти) и их быстрая анимации в дальнейшем. В этом случае функция draw должна возвращать число кадров или ноль для рисования по запросу. Замечу, что draw может быть равна NULL для отображения статической (текущей) картинки. Параметр title задает заголовок окна. Параметр par содержит указатель на данные, передаваемые функции рисования draw. Параметр maximize=true открывает окно раскрытым на весь экран.

В окне просмотра можно использовать клавиши: ’a’, ’d’, ’w’, ’s’ для вращения; ’,’, ’.’ для просмотра предыдущего и следующего кадров; ’r’ для переключения прозрачности; ’f’ для переключения оспещенности; ’x’ для закрытия окна.

ВАЖНО!!! Вам не следует вызывать функцию Rotate() (see section Матрица преобразования) если Вы хотите вращать график.

Method on mglGraphAB: void Window (int argc, char **argv, mglDraw *draw, const char *title, bool maximize=false)

В основном аналогична предыдущей. Основное отличие в том, что функции рисования и обновления данных определены в классе наследнике класса mglDraw. Этот класс определен в #include <mgl/mgl_define.h> и имеет только 2 метода:

class mglDraw
{
public:
    virtual int Draw(mglGraph *) { return 0; };
    virtual void Reload(int) {};
};

Вы можете создать класс-наследник mglDraw и переопределить один или оба метода для использования с данной функцией.

Метод класса mglGraphAB (C++): void ToggleAlpha ()
C function: int mgl_wnd_toggle_alpha (HMGL gr)

Включает/выключает прозрачность, но не перезаписывает настройки пользовательской функции рисования.

Метод класса mglGraphAB (C++): void ToggleLight ()
C function: int mgl_wnd_toggle_light (HMGL gr)

Включает/выключает освещение, но не перезаписывает настройки пользовательской функции рисования. Switch on/off lighting but do not overwrite switches in user drawing function.

Метод класса mglGraphAB (C++): void ToggleZoom ()
C function: int mgl_wnd_toggle_zoom (HMGL gr)

Включает/выключает приближение выбранного мышью области рисунка.

Метод класса mglGraphAB (C++): void ToggleRotate ()
C function: int mgl_wnd_toggle_rotate (HMGL gr)

Включает/выключает режим вращения мышью. Обычно левая кнопка вращает график, средняя сдвигает, правая приближает и меняет перспективу.

Метод класса mglGraphAB (C++): void ToggleNo ()
C function: int mgl_wnd_toggle_no (HMGL gr)

Выключает режим приближения/вращения и восстанавливает вид по умолчанию. Switch off all zooming and rotation and restore initial state.

Метод класса mglGraphAB (C++): void Update ()
C function: int mgl_wnd_update (HMGL gr)

Обновляет содержимое окна.

Метод класса mglGraphAB (C++): void ReLoad (bool o)
C function: int mgl_wnd_reload (HMGL gr, int val)

Перезагружает данные пользователя и обновляет картинку.

Метод класса mglGraphAB (C++): void Adjust ()
C function: int mgl_wnd_adjust (HMGL gr)

Подгоняет размер картинки под размер окна (виджета).

Метод класса mglGraphAB (C++): void NextFrame ()
C function: int mgl_wnd_next_frame (HMGL gr)

Показывает следующий кадр.

Метод класса mglGraphAB (C++): void PrevFrame ()
C function: int mgl_wnd_prev_frame (HMGL gr)

Показывает предыдущий кадр. Show previous frame if one.

Метод класса mglGraphAB (C++): void Animation ()
C function: int mgl_wnd_animation (HMGL gr)

Запускает/останавливает слайд-шоу (анимацию) кадров.

C function: int mgl_wnd_set_auto_clf (HMGL gr, int val)
Widget option of mglGraphAB: bool AutoClf

Включает/выключает автоматическую очистку рисунка между перерисовкой. Выключение полезно для рисования с накоплением (например, результатов/точек расчета).

C function: int mgl_wnd_set_delay (HMGL gr, int val)
Widget option of mglGraphAB: float Delay

Задержка анимации в секундах. По умолчанию равно 1 секунде.

Метод класса mglGraphAB (C++, Python): mglPoint CalcXYZ (int xs, int ys)
C function: void mgl_calc_xyz (HMGL gr, int xs, int ys, float *x, float *y, float *z)

Вычисляет 3D координаты {x,y,z} для экранной точки {xs,ys}. В данный момент игнорируется перспектива графика и формулы перехода в криволинейные координаты. Вычисления производятся для последнего использованного InPlot (see section Матрица преобразования).

Метод класса mglGraphAB (C++, Python): mglPoint CalcScr (mglPoint p)
Метод класса mglGraphAB (C++): void CalcScr (mglPoint p, int *xs, int *ys)
C function: void mgl_calc_scr (HMGL gr, float x, float y, float z, int *xs, int *ys)

Вычисляет экранные координаты {xs,ys} для 3D координат {x,y,z}. Вычисления производятся для последнего использованного InPlot (see section Матрица преобразования).

C function: int mgl_wnd_set_show_mouse_pos (HMGL gr, int val)
Widget option of mglGraphAB: float ShowMousePos

Включает/выключает показ координат последнего нажатия кнопки мыши на рисунке.

Widget option of mglGraphAB: mglPoint LastMousePos

Последнее положение нажатия кнопки мыши.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on June 4, 2012 using texi2html 1.82.