- •Основы работа с графикой на с#
- •Глава 1. Использование графики в Windows приложениях
- •Параграф 2. Создание линейных графиков
- •2.1. В качестве постановки задачи
- •2.2. Постановка задачи
- •2.3. Исходные данные
- •2.4. Проект решения
- •2.5. Конструкторы класса
- •2.6. Создаем объект для рисования
- •2.7. Рисуем оси
- •2.8. Рисуем сетку
- •2.8. Рисуем линию графика
- •2.10. Надписи на графике
- •Параграф 3. Создание гистограмм
- •Параграф 5. Базовый класс для рисования графиков
Параграф 2. Создание линейных графиков
2.1. В качестве постановки задачи
Однажды мне пришлось делать задачку, на базе продолжения работы над которой появилась программа "LitFrequencyMeter" - программа определения частоты повторения слов и знаков в литературных произведениях, графики из которой приведены ниже (Рис.3-5.). И когда я приступил к заключительному этапу работы над программой, то понял, что материал главы практически написан в кодах - осталось только его озвучить.
Что и какие аспекты были заложены в программу:
Настройка всего и вся: цветов, шрифтов, фонов, надписей, положения диаграмм на холсте, использование пояснений, легенд, смена числа отсчетов и т.д., и т.п.
Хранение всех настроек (включая шрифты) в реестре.
Создание статистики из .txt, .html, .doc файлов.
Подро первый аспект - как строить грбно рассмотрим графики, приведенные ниже. Чтобы было понятно, что отображено на графиках - приведу полный текст отрывка (надеюсь, он всем знаком с детства):
сказка о царе салтане ,
о сыне его славном и могучем богатыре
князе гвидоне салтановиче и
о прекрасной царевне лебеди
три девицы под окном
пряли поздно вечерком .
" кабы я была царица , -
говорит одна девица , -
то на весь крещеный мир
приготовила б я пир " .
- " кабы я была царица , -
говорит ее сестрица , -
то на весь бы мир одна
наткала я полотна " .
- " кабы я была царица , -
третья молвила сестрица , -
я б для батюшки - царя
родила богатыря " .
только вымолвить успела ,
дверь тихонько заскрыпела ,
и в светлицу входит царь ,
стороны той государь .
Далее результаты анализа в графическом виде (программа представляет и текстовый вариант анализа, но он нам на данном этапе не нужен).
Рис.3. Линейеая диаграмма
Рис.4. Гистограмма
Рис.5. Круговая диаграмма
2.2. Постановка задачи
Стоит задача создать класс для отображения графической информации, который бы мог стать базовым классом для работы с графикой, позволял бы не только выводить различные виды графиков и обладал бы гибкостью настройки форм отображения, но и оставался открытым для дальнейшего его расширения.
Конечная цель - помещение созданного графического изображения в элемент управления PictureBox.
2.3. Исходные данные
Исходные данные перед их отображением могут находиться где угодно (файл, таблица базы данных...). Однако рассматривать чтения из базы данных или из файла значений графиков - только засорять отображение материала. Мы всегда можем прочитать данные с любого источника в массив значений. Автор предпочитает работать со строковым массивом, как позволяющим хранить цифровые и текстовые значения. В примерах, приводимых ниже, используется массив строк string[,] rgsValues. В программе, о которой шла выше речь, этот массив использован для настройки параметров, отображаемых на графике. Заполнять массив будем с помощью датчиков случайных чисел:
private int viNumInRg=20;//20 - начальное значение
private string[,] rgsValues=null;
private int iCreateRg()
{
Random rnd = new Random(DateTime.Now.Millisecond);
Random rnd1 = new Random(DateTime.Now.Millisecond+5);
rgsValues = new string[viNumInRg, 2];
for (int i = 0; i < viNumInRg; i++)
{
rgsValues[i, 0] = Convert.ToString(((float)(rnd.Next(0, 10) * 100) +
(float)rnd1.Next(0, 99)) / (float)100);
rgsValues[i, 1] = "I-" + Convert.ToString(i+1);
}
Предполагается, что значение переменной, определяющий размерность массива хранится в настройках и устанавливается на этапе загрузки приложения.
