Лабораторная работа №6 C#
Оценка 4.6

Лабораторная работа №6 C#

Оценка 4.6
Лабораторные работы
docx
информатика
Взрослым
04.04.2018
Лабораторная работа №6 C#
Реализуем в классе 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#

Лабораторная работа №6 C#

Лабораторная работа №6 C#

Лабораторная работа №6 C#
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.
04.04.2018