Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы работа с графикой на С.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
413 Кб
Скачать
☆

2.8. Рисуем сетку

Для рисования сетки нам потребуется: цвет и толщина пера, размер массива отображаемых значений и непосредственно функция для рисования сетки. Установку цвета и толщины пера мы уже использовали при рисовании осей, поэтому в функции vCreateLinGr() добавим вновь вызовы:

//Параметры линии для сетки

clPaint.vSetPenWidthLine(1);

clPaint.vSetPenColorLine(Color.Silver);

Для хранения размера массива в классе определим переменную и определим доступ к ней через свойство, а также определим функцию, рисующую сетку viMaxRg*viMaxRg клеток. Рисование сетки сводится к рисованию параллельных осям линий:

//Максимальный размер массива

private int viMaxRg = 20;

public int MaxRg

{

set { viMaxRg=value; }

}

#region Рисование сетки

public void vDravGrid()

{

float x = viDeltaaxisL;

float y = viY - viDeltaaxisH;

float x1 = viX - viDeltaaxisR;

float y1 = viDeltaaxisH;

//Сдвиг линий сетки на один отсчет по Y

float f = (y - y1) / (float)viMaxRg;

//Рисуем горизонтальные линии

for (int i = 1; i < viMaxRg + 1; i++)

{

graph.DrawLine(objPenLine, x, y - f * i, x1, y - f * i);

}

//Сдвиг линий сетки на один отсчет по X

f = (x - x1) / (float)(viMaxRg - 1);

//Рисуем вертикальные линии

for (int i = 1; i < viMaxRg; i++)

{

graph.DrawLine(objPenLine, x - f * i, y, x - f * i, y1);

}

}

#endregion

В функции vCreateLinGr() добавим код и выполним решение:

clPaint.MaxRg = 20;

clPaint.vDravGrid();

Результат показан на Рис.8.:

Рис.8. Рисование сетки

2.8. Рисуем линию графика

Как мы уже делали - зададим цвет и толщину пера. Далее нам понадобятся данные из нашего массива значений непосредственно в классе. Для этого в классе определим массив и доступ к нему:

private string[,] rgsValues = null;

public string[,] RgValue

{

set { rgsValues = value; }

}

В классе создадим функцию рисования линий графика. Линии рисуются по соседним точкам массива:

#region Рисование линий графика для линейного графика

public void vDrawGraphLines()

{

string s = string.Empty;

string s1 = string.Empty;

string s2 = string.Empty;

float f = 0;

float f1 = 0;

float x1 = 0;

float x = viDeltaaxisL;

float y = viY - viDeltaaxisH;

float x2 = 0;

float fMax = float.MinValue;

//Ищем максимальное значение по оси Y

for (int i = 0; i < viMaxRg; i++)

{

s = rgsValues[i, 0];

if (fMax < float.Parse(s)) fMax = float.Parse(s);

}

//Пикселей для рисования по оси х

float fdeltax = viX - viDeltaaxisL - viDeltaaxisR;

//Пикселей на одну единицу массива значения по X

fdeltax = fdeltax / (float)(viMaxRg - 1);

//Пикселей для рисования по оси y

float fdeltay = viY - 2 * viDeltaaxisH;

//Пикселей на одну единицу массива значений по Y

fdeltay = fdeltay / fMax;

for (int i = 0; i < viMaxRg; i++)

{

//Первый раз запоминаем точку старта

if (i == 0)

{

s = rgsValues[i, 0];

s2 = rgsValues[i, 1];

f = y - (float.Parse(s) * fdeltay);

x1 = x;

}

else

{

//Здесь рисуем линии

s1 = rgsValues[i, 0];

f1 = y - (float.Parse(s1) * fdeltay);

x2 = x + (int)(fdeltax * i);

graph.DrawLine(objPenLine, x1, f, x2, f1);

//Запоминаем координаты конечной точки, точки

//начала следующего отрезка линии

s = rgsValues[i, 0];

s2 = rgsValues[i, 1];

f = f1;

x1 = x + (int)(i * fdeltax);

}

}

}

#endregion

Код vCreateLinGr() на данный момент:

private void vCreateLinGr()

{

//Создаем массив значений для вывода на графике

vCreateRg();

//Создаем класс и передаем ему размер холста

PaintCl clPaint = new PaintCl(pictureBox1.Width, pictureBox1.Height);

//Фон холста

clPaint.vSetBackground(Color.White);

//Параметры вызоыва: отступы слева, справа,

//сверху(снизу),Цвет осей, толщина пера

clPaint.vDravAxis(50, 50, 30, Color.Red, 2,true);

//Цвет и толщина пера

clPaint.vSetPenWidthLine(1);

clPaint.vSetPenColorLine(Color.Silver);

clPaint.MaxRg = 20;

//Рисуем сетку

clPaint.vDravGrid();

//Цвет и толщина пера

clPaint.vSetPenWidthLine(2);

clPaint.vSetPenColorLine(Color.Green);

//Передаем массив значений в класс

clPaint.RgValue = rgsValues;

//Рисуем линии графика

clPaint.vDrawGraphLines();

//Принимаем нарисованное в pictureBox

pictureBox1.Image = clPaint.Bmp;

}

Результат выполнения решения на данном этапе показан на Рис.9.:

Рис.9. Рисование линий графика