Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Вариант оформления титульного листа отчета приведен в Приложении 1. Далее приводится пример содержимого отчета.
Цель работы – практическая реализация алгоритма визуализации отрезков и оценка его быстродействия.
Задание. Используя материал из разд. 1.1 методических указаний к лабораторным работам и курсовому проектированию [3], необходимо разработать алгоритм визуализации отрезков прямых для общего случая. На основании алгоритма нужно разработать программу, обеспечивающую рисование на экране любого количества отрезков. Начальная и конечная точки отрезков должны задаваться интерактивно с помощью мыши.
Разработка алгоритма. Алгоритм, приведенный в методических указаниях, рассчитан лишь на изображение отрезков, угол наклона которых к оси OX меньше или равен 45о, т.е. для случая, когда | ∆x |³ | ∆y | (∆x = x 2– x 1, ∆y= y 2– y 1 – это приращений координат по соответствующим осям).
Для общего случая в алгоритм необходимо добавить вторую часть для случая, когда угол наклона отрезка к оси OX больше 45о.
Доработанный алгоритм приведен ниже.
1. Установить цвет рисования Color.
2. Вычислить:
∆ x = x 2– x 1;∆ y = y 2– y 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!