Работа с графикой

Языки C и C++ не предоставляют средств для работы с графикой, все эти возможности вынесены в отдельные библиотеки (которых существует большое множество). В данной лабораторной работе графики во всех примерах (за исключением первого) будут создаваться с помощью дополнительной библиотеки MathGL, разработанной А.А. Балакиным. Документация по библиотеке доступна здесь.

Идея создания графиков состоит в том, что с помощью средств библиотеки MathGL в памяти компьютреа создаются и настраиваются такие объекты рисунка как кривые, координатные линии, сетка, легенда и т.д., после чего полученный образ рисунка записывается в файл.

Пример 1 - графики в консоли

В некоторых простейших случаях графики можно вывести и на терминал, не пользуясь никакими сторонними библиотеками. При этом все видимое пространство консоли можно рассматривать как "холст", на котором можно оставлять пустые пространства (символами пробелов) и рисовать "точки" (непробельными символами). В данном примере предполагается, что размер консоли стандартный: 80 символов в строке на 25 строк. Если это не так, необходимо соответствующим образом изменить значения макроопределений XMAX и YMAX.

Внимательно изучите и наберите в редакторе исходный текст предлагаемой программы:

$ vim textplot.c

textplot.c.png

Cкомпилируйте и запустите программу:

$ gcc textplot.c -o textplot -lm
$ ./textplot

Попробуйте другие варианты запуска программы:

$ ./textplot 0
$ ./textplot 0 1.5
$ ./textplot 0 1r5
$ ./textplot 1.5 0
$ ./textplot 1 2 3

Объясните, что при этом происходит? Вспомните, как работает функция strtod():

$ man strtod

Зачем были введены целочисленные массивы xx и yy? Что нужно изменить в тексте программы для того, чтобы построить графики других функций?

Пример 2 - простейшие графики

Внимательно изучите и наберите в редакторе исходный текст следующей программы:

$ vim sinplot.c

sinplot.c.png

Cкомпилируйте и запустите программу:

$ gcc sinplot.c -o sinplot -lmgl
$ ./sinplot

Запущенная нами программа ничего не вывела на экран, т.к. её основное назначение состоит в том, чтобы создать файл с графиком. Убедитесь в том, что файл был создан:

$ ls -l

Если программа отработала корректно, в текущем каталоге появится файл plot.png. Теперь нам надо отобразить на экране этот файл для того чтобы полностью убедиться в правильности работы программы. Для этого следует подключиться к рабочему серверу по протоколу FTP (ваш браузер должен поддерживать этот протокол).

Что такое HMGL и HMDT? Каково назначение функций mgl_data_set_double(), mgl_set_range_val(), mgl_label(), mgl_add_legend(), и т.п.? Для ответа на эти вопросы рекомендуется пользоваться документацией по библиотеке MathGL.

Пример 3 - множество кривых на одном графике

Достаточно часто возникает необходимость построить несколько кривых на одном графике. В качестве примера построим траектории лодки, пересекающей реку с постоянной скоростью, направленной в точку с координатами (0,0) при разных отношениях скорости реки к скорости лодки (параметр "бета"). Переменная L - это ширина реки, изначально лодка находилась в положении с координатами (0,L). Внимательно изучите и наберите в редакторе текст программы:

$ vim multiplot.c

multiplot.c.png

Cкомпилируйте и запустите программу:

$ gcc multiplot.c -o multiplot -lmgl
$ ./multiplot

В случае успешного завершения компиляции и выполнения программы выполните те же действия, что и в конце предыдущего примера. Убедитесь в том, что график построен правильно. Если ваша программа отработала корректно, то рисунок должен быть таким:

multiplot.png

Объясните, почему в программе используется так много двумерных массивов? Каково назначение массивов legend, Beta_text и atr? Как работает функция sprintf()?

Пример 4 - Анимация

Идея создания анимации состоит в том, что необходимо сгенерировать серию картинок и последовательно отображать их друг за другом с некоторой задержкой. Это можно сделать и вручную, монтируя из отдельных картинок видеофайл, но средствами библиотеки MathGL удобнее сразу получить файл формата .gif.

Внимательно изучите и наберите в редакторе исходный текст предлагаемой программы:

$ vim gif.c

gif.c.png

Cкомпилируйте и запустите программу:

$ gcc gif.c -o gif -lmgl
$ ./gif

Замечание. Выполнение программы происходит достаточно долго, дождитесь корректного завершения её работы.

Убедитесь в том, что программа создала файл plot.gif. После этого установите права полученного файла на чтение:

$ ls
$ chmod +r plot.gif

Теперь, как и ранее скопируйте полученный файл в общедоступный каталог и пронаблюдайте полученный результат.