- •Печатается по решению методического совета факультета автоматики и информационных технологий Введение
- •1Лабораторные работы
- •1.1. Общие требования к выполнению лабораторных работ
- •1.2. Лабораторная работа № 1
- •1.3.Пример отчета к лабораторной работе № 1
- •1.4. Лабораторная работа № 2
- •1.5.Оформление отчета по лабораторной работе № 2
- •1.6.Лабораторная работа № 3
- •1.7.Оформление отчета по лабораторной работе № 3
- •1.8. Лабораторная работа № 4
- •1.9.Оформление отчета по лабораторной работе № 4
- •1.10. Лабораторная работа № 5
- •1.11.Оформление отчета по лабораторной работе № 5
- •1.12. Лабораторная работа № 6
- •1.13.Оформление отчета по лабораторной работе № 5
- •1.14. Лабораторная работа № 7
- •1.15.Оформление отчета по лабораторной работе № 7
- •1.16. Лабораторная работа № 8
- •1.17.Оформление отчета по лабораторной работе № 8
- •2Курсовое проектирование
- •2.1. Общие требования к выполнению курсовой работы
- •2.2. Техническое задание для курсовой работы
- •2.3.Пояснительная записка
- •2.4.Порядок защиты курсовой работы
- •Библиографический список
- •Приложение 1. Образец титульного листа к лабораторным работам
- •Отчет по лабораторной работе № ___ «Название лабораторной работы»
- •Приложение 2. Образец титульного листа к курсовой работе
- •Курсовая работа
- •Векторный графический редактор
- •Графические системы компьютеров
- •443100, Г. Самара, ул. Молодогвардейская, 244. Главный корпус
1.2. Лабораторная работа № 1
Тема: «Визуализация отрезков прямых»
Цель работы – практическая реализация алгоритма визуализации отрезков и оценка его быстродействия.
Программное обеспечение. Для выполнения лабораторной работы на компьютере должен быть установлен пакет программ Microsoft Visual Studio.
Порядок проведения работы
Используя материал из разд. 1.1 методических указаний к лабораторным работам и курсовому проектированию [3], необходимо разработать алгоритм визуализации отрезков прямых для общего случая, когда начальная и конечная точки отрезка располагаются на плоскости произвольным образом. На основании алгоритма нужно разработать программу, обеспечивающую рисование на экране любого количества отрезков. Начальная и конечная точки отрезков должны задаваться интерактивно с помощью мыши.
Быстродействие алгоритма следует оценивать по числу операций, приходящихся на вывод пикселя в наилучшем и наихудшем случае.
После завершения разработки программа должна быть протестирована на всех возможных вариантах взаимного расположения начальной и конечной точек отрезка.
1.3.Пример отчета к лабораторной работе № 1
Вариант оформления титульного листа отчета приведен в Приложении 1. Далее приводится пример содержимого отчета.
Цель работы – практическая реализация алгоритма визуализации отрезков и оценка его быстродействия.
Задание. Используя материал из разд. 1.1 методических указаний к лабораторным работам и курсовому проектированию [3], необходимо разработать алгоритм визуализации отрезков прямых для общего случая. На основании алгоритма нужно разработать программу, обеспечивающую рисование на экране любого количества отрезков. Начальная и конечная точки отрезков должны задаваться интерактивно с помощью мыши.
Разработка алгоритма. Алгоритм, приведенный в методических указаниях, рассчитан лишь на изображение отрезков, угол наклона которых к оси OX меньше или равен 45о, т.е. для случая, когда |∆x| |∆y| (∆x = x2 – x1, ∆y = y2 – y1 – это приращений координат по соответствующим осям).
Для общего случая в алгоритм необходимо добавить вторую часть для случая, когда угол наклона отрезка к оси OX больше 45о.
Доработанный алгоритм приведен ниже.
1. Установить цвет рисования Color.
2. Вычислить:
∆x = x2 – x1; ∆y = y2 – y1;
sx = sign(∆x); sy = sign(∆y);
Если sx > 0, тогда ∆Fx = ∆y, иначе ∆Fx = - ∆y. Если sy > 0, тогда ∆Fy = ∆x, иначе ∆Fy = - ∆x.
x = x1; y = y1; // начальные координаты текущей точки F = 0. // начальное значение оценочной функции
3. Если |∆x| |∆y|, то выполнить п. 3.1 – 3.6
3.1 Вывести пиксель с координатами (x, y) цветом Color.
3.2 Если x = x2 , то – конец алгоритма.
3.4 Вычислить:
Fx = F + ∆Fx; F = Fx – ∆Fy; x = x + sx.
3.5 Если Fx < F , то вычислить F = Fx,
иначе – вычислить y = y + sy.
3.6 Перейти к п. 3.1.
иначе выполнить п. 3.7 – 3.11.
3.7 Вывести пиксель с координатами (x, y) цветом Color.
3.8 Если y = y2 , то – конец алгоритма.
3.9 Вычислить:
Fy = F + ∆Fy; F = Fy – ∆Fx; y = y + sy.
3.10 Если Fy < F , то вычислить F = Fy,
иначе – вычислить x = x + sx.
3.11 Перейти к п. 3.7.
Для решения поставленной задачи в Visual Studio создан новый проект в виде Windows-приложения (рис. 1.1).
Рис. 1.1
При создании нового проекта Windows-приложения системой Visual Studio автоматически создаются файлы Program.cs и Form1.cs стандартного содержания для дальнейшей разработки программного кода. Ниже приведено первоначальное содержимое файла Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
Для вывода графики на форме Form1 с помощью панели Все формы Windows Forms создана панель (panel) с именем panel1, на которой с помощью панели Стандартные элементы управления создана область pbDrawLine рисования типа PictureBox. В свойствах pbDrawLine установлен цвет фона BackGround = Window и BordeStyle = Fixed3D.
Для выбора цвета рисования форме с помощью панели стандартных элементов управления на форме Form1 добавлены два элемента выбора типа ComboBox: cbLineColor и cbWeight для выбора цвета рисования и толщины линии соответственно, а также кнопка (Button) btClear для очистки формы, а также (рис. 1.2).
Рис. 1.2
Событие Click для кнопки btClear обрабатывается процедурой button1_Click.
В свойствах элемента cbLineColor задана коллекция значений (рис. 1.3), а также обработчик cbLineColor_SelectionChangeCommitted события SelectionChangeCommitted (рис. 1.4).
Рис. 1.3
Рис. 1.4
Аналогичные настройки сделаны для элемента управления cbWeight. Обработчиком события SelectionChangeCommitted для этого элемента служит процедура cbLineWeight_SelectionChangeCommitted.
Ввод координат начальной и конечной точек отрезка производится по нажатию левой кнопки мыши, а визуализация отрезка – по отпусканию левой кнопки после ввода конечной точки. Для этого элементу pbDrawLine созданы обработчики pictureBox_MouseDown и pictureBox_MouseUp соответствующих событий.
Процедура визуализации отрезка, разработанная в соответствии с приведенным выше алгоритмом, а также с учетом описанного контекста, названа ProcDrawLine.
Полный текст файла Form1.cs, включающий перечисленные разработки, приведен ниже.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Line
{
public partial class Form1 : Form
{
Point P1, P2;
Boolean FirstPoint = true;
uint w = 1; // Толщина линии
Graphics g;
Pen DrawPen = new Pen(Color.Black, 1);
//
public Form1()
{
InitializeComponent();
g = pbDrawLine.CreateGraphics(); //инициализация компонента
}
// Обработчик события выбора цвета в элементе ComboBox cbLineColor
private void cbLineColor_SelectionChangeCommitted(object sender, EventArgs e)
{
switch (cbLineColor.SelectedIndex) // выбор цвета
{
case 0: DrawPen.Color = Color.Black;
break;
case 1: DrawPen.Color = Color.Red;
break;
case 2: DrawPen.Color = Color.Green;
break;
case 3: DrawPen.Color = Color.Blue;
break;
}
}
// Обработчик события выбора толщины в элементе ComboBox cbLineWeight
private void cbLineWeight_SelectionChangeCommitted(object sender, EventArgs e)
{
switch (cbLineWeight.SelectedIndex) // выбор толщины линии
{
case 0: w = 1;
break;
case 1: w = 2;
break;
case 2: w = 3;
break;
case 3: w = 15;
break;
}
}
// Очистка окна
private void button1_Click(object sender, EventArgs e)
{
g.Clear(Color.White);
}
// Визуализация отрезка
public void ProcDrawLine(Pen DrPen, int x1, int y1, int x2, int y2)
{
int x, y, dx, dy, Sx = 0, Sy = 0;
int F = 0, Fx = 0, dFx = 0, Fy = 0, dFy = 0;
dx = x2 - x1;
dy = y2 - y1;
bool tr = true;
Sx = Math.Sign(dx);
Sy = Math.Sign(dy);
if (Sx > 0) dFx = dy;
else dFx = -dy;
if (Sy > 0) dFy = dx;
else dFy = -dx;
x = x1; y = y1;
F = 0;
if (Math.Abs(dx) >= Math.Abs(dy)) // угол наклона <= 45 градусов
{
do
{
//Вывести пиксель с координатами х, у
Draw(DrPen, x, y);
if (x == x2) break;
Fx = F + dFx;
F = Fx - dFy;
x = x + Sx;
if (Math.Abs(Fx) < Math.Abs(F))
F = Fx;
else
y = y + Sy;
} while (tr);
}
else // угол наклона > 45 градусов
{
do
{
//Вывести пиксель с координатами х, у
Draw(DrPen, x, y);
if (y == y2) break;
Fy = F + dFy;
F = Fy - dFx;
y = y + Sy;
if (Math.Abs(Fy) < Math.Abs(F))
F = Fy;
else
x = x + Sx;
} while (tr);
}
}
// Вывод точки (квадрата)
public void Draw(Pen Brush, int x, int y)
{
g.DrawRectangle(Brush, x, y, w, w);
}
// Обработчик нажатия левой кнопки мыши
private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
// получение координат поставленных точек
g.DrawEllipse(DrawPen, e.X, e.Y, w, w);
if (FirstPoint)
{ P1.X = e.X; P1.Y = e.Y; }
else
{ P2.X = e.X; P2.Y = e.Y; }
}
// Обработчик отпускания левой кнопки мыши
private void pictureBox_MouseUp(object sender, MouseEventArgs e)
{
bool tr = true;
bool fls = false;
if (!FirstPoint) // Если не первая точка
{
ProcDrawLine(DrawPen, P1.X, P1.Y, P2.X, P2.Y);
FirstPoint = tr;
}
else
{
FirstPoint = fls;
}
}
}
}
На рис. 1.5 приведен вид окна разработанного приложения Line в процессе тестирования приложения.
Рис. 1.5
Тестирование проводилось для частных случаев расположения отрезка: с углом наклона к оси OX меньше и больше 45о, а также для различных направлений от начальной точки к конечной. При тестировании окончательного варианта программы не выявлено ошибок и ситуаций, приводящих к аварийному ее завершению.
