Реализуем в классе painter метод рисования графика, который можно описать следующим образом:
По оси x откладываются временные интервалы, по оси y откладывается некоторое неизменные значение для каждого интервала. Концы каждого интервала соединяются с помощью вертикальной линии.
Рассуждение:
Из условия задачи видно, что каждый временной интервал- это горизонтальная линия. Каждая разработанная нами фигура, имеет свойство «значение», что позволяет использовать его для определения позиции по оси y. Соединение интервалов с помощью вертикальной линии, ничто иное, как рисование линии, началом и концом которой являются координаты 2-х соседних линий.
Лабораторная работа№6.docx
Лабораторная работа№6.
Реализуем в классе painter метод рисования графика, который можно описать
следующим образом:
По оси x откладываются временные интервалы, по оси y откладывается
некоторое неизменные значение для каждого интервала. Концы каждого
интервала соединяются с помощью вертикальной линии.
Рассуждение:
Из условия задачи видно, что каждый временной интервал- это
горизонтальная линия. Каждая разработанная нами фигура, имеет свойство
«значение», что позволяет использовать его для определения позиции по оси
y. Соединение интервалов с помощью вертикальной линии, ничто иное, как
рисование линии, началом и концом которой являются координаты 2-х
соседних линий. Таким образом, для того чтобы нарисовать данный график
нам необходимо лишь знать количество интервалов (и значения в каждом
интервале). А также размер шага в пикселях по оси x и y. Нам не нужно знать
координаты точек начала и конца всех линий, так как они могут быть
высчитаны с помощью входных данных.
Понятие количества интервалов и значения в каждом интервале. Ни что иное.
Как массив значений, где количество элементов в массиве и будет
количеством интервалов.
Вывод: Функция рисования, описанного выше графика должна принимать 3
аргумента: массив значений интервалов, шаг по оси х и шаг по оси у.
Перед началом реализации приведем названия функций и переменных к
общему виду (Публичные функции и переменный назовем с большой буквы,
приватные с маленькой).
Для этого необходимо нажать правой кнопкой мыши на функцию или
переменную и в открывшемся списке выбрать пункт Переименовать. Данный
способ изменит имя во всех местах вызова данной функции или переменной.
Так же при текущей реализации мы не можем нарисовать ось XY и фигуры
одновременно. Необходимо реализовать механизм рисования данной оси,
аналогично механизму рисования сетки. Для этого создадим вспомогательный
класс oXY, который будет содержать в себе точку начала координат, а также
шаги по оси X и Y.
class oXY
{
public Point zeroPosition;
public int StepX;
public int StepY;
public oXY(Point zeroPosition, int stepX, int stepY)
{
this.zeroPosition = zeroPosition;
this.StepX = stepX;
this.StepY = stepY;
}
}
Добавим в класс painter свойство, которое будет отвечать за отоброжение или
не отображение осей X и Y.
public oXY zeroXY { get; set; } Подправим методы init, oXY и draw:
1. init
private void init()
{
this.GridSize = 0;
this.zeroXY = null;
this.Image = new Bitmap(this.Width, this.Height);
this.g = Graphics.FromImage(this.Image);
}
2.oXY
public void oXY ()
{
if (this.zeroXY == null)
{
return;
}
g.DrawLine(new Pen(Brushes.Black, 2), zeroXY.zeroPosition.x, 0, zeroXY.zeroPosition.x,
this.Height);
g.DrawLine(new Pen(Brushes.Black, 2), 0, zeroXY.zeroPosition.y, this.Width,
zeroXY.zeroPosition.y);
for (int i = zeroXY.zeroPosition.y+ zeroXY.StepY; i < this.Height; i += zeroXY.StepY)
{
g.DrawLine(Pens.Black, zeroXY.zeroPosition.x-3, i, zeroXY.zeroPosition.x+2, i);
}
for (int i = zeroXY.zeroPosition.y - zeroXY.StepY; i >= 0; i -= zeroXY.StepY)
{
g.DrawLine(Pens.Black, zeroXY.zeroPosition.x - 3, i, zeroXY.zeroPosition.x+2, i);
}
for (int i = zeroXY.zeroPosition.x+ zeroXY.StepX; i < this.Width; i += zeroXY.StepX)
{
g.DrawLine(Pens.Black, i, zeroXY.zeroPosition.y-3, i, zeroXY.zeroPosition.y+2);
}
for (int i = zeroXY.zeroPosition.x - zeroXY.StepX; i >= 0; i -= zeroXY.StepX)
{
g.DrawLine(Pens.Black, i, zeroXY.zeroPosition.y - 3, i, zeroXY.zeroPosition.y + 2);
}
}
3. draw
public void Draw(bool clear)
{
if (clear)
{
Clear();
}
Grid();
oXY();
foreach (BaseFigure F in this.figures)
{
F.Draw(g);
}
}
Реализуем метод рисования нашего графика: (startXY.x + i * xStep, startXY.y - yStep * data[i]);
(startXY.x + (i + 1) * xStep, startXY.y - yStep * data[i]);
public void DrawChart(Point startXY, int[] data, int xStep, int yStep)
{
this.zeroXY = new oXY(startXY, xStep, yStep);
for(int i = 0; i < data.Length; i++)
{
Point
new
Point
start =
Point
new
Point
end =
Line line = null;
if (i > 0)
{
line = new Line((figures.Last() as Line).end, start);
this.Add(line);
}
line = new Line(start, end);
line.value = data[i];
this.Add(line);
}
this.Draw(false);
}
Важно понимать, что координаты окна формы начинаются в левом верхнем
углу. Ось X растет слева направо, а ось Y сверху вниз. Таким образом, чтобы
корректно отобразить график нам нужно не только все вычисления делать
относительно начала оси XY, но и инвертировать координаты по Y (см.
выделенный фрагмент кода).
Задание:
Реализовать график функции из курсовой работы.
Лабораторная работа №6 C#
Лабораторная работа №6 C#
Лабораторная работа №6 C#
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.