Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Пример отчета к лабораторной работе № 1



Вариант оформления титульного листа отчета приведен в Приложении 1. Далее приводится пример содержимого отчета.

Цель работы – практическая реализация алгоритма визуализации отрезков и оценка его быстродействия.

Задание. Используя материал из разд. 1.1 методических указаний к лабораторным работам и курсовому проектированию [3], необходимо разработать алгоритм визуализации отрезков прямых для общего случая. На основании алгоритма нужно разработать программу, обеспечивающую рисование на экране любого количества отрезков. Начальная и конечная точки отрезков должны задаваться интерактивно с помощью мыши.

Разработка алгоритма. Алгоритм, приведенный в методических указаниях, рассчитан лишь на изображение отрезков, угол наклона которых к оси OX меньше или равен 45о, т.е. для случая, когда | ∆x |³ | ∆y | (∆x = x 2x 1, ∆y= y 2y 1 – это приращений координат по соответствующим осям).

Для общего случая в алгоритм необходимо добавить вторую часть для случая, когда угол наклона отрезка к оси OX больше 45о.

Доработанный алгоритм приведен ниже.

1. Установить цвет рисования Color.

2. Вычислить:

x = x 2x 1;∆ y = y 2y 1;

sx = sign(∆ x); sy = sign(∆y);

Если sx > 0, тогда ∆ Fx = ∆ y, иначе ∆ Fx = - ∆ y.
Если sy > 0, тогда ∆ Fy = ∆ x, иначе ∆ Fy = - ∆ x.

x = x 1; y = y 1; // начальные координаты текущей точки
F = 0. // начальное значение оценочной функции

3. Если |∆ x | ³ |∆ y |, то выполнить п. 3.1 – 3.6

3.1 Вывести пиксель с координатами (x, y) цветом Color.

3.2 Если x = x 2, то – конец алгоритма.

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 = y 2, то – конец алгоритма.

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о, а также для различных направлений от начальной точки к конечной. При тестировании окончательного варианта программы не выявлено ошибок и ситуаций, приводящих к аварийному ее завершению.





Дата публикования: 2015-04-07; Прочитано: 252 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.019 с)...