
-
Алгоритм роботи програми
Рис. 6 Блок-схема покрокового алгоритму Брезенхема для генерації кола в першому квадранті
Опис системи
Дана программа написана мовою прогармування C# з використанням технології Windows Forms. Згідно з умовою завдання я реалізував два способи заданння параметрів кола:
За допомогою клавіатури
За допомогою миші
Параметри для кола необхідно вводити в текстові поля( Text Box), біля
кожного з них є назви параметрів, які містяться в Label.
Щоб згенерувати коло, після введення параметрів необхідно натиснути на кнопку Paint.
Метод button2_Click забезпечує генерування кола, використовуючи параметри введені з клавіатури. Спочатку зчитуються значення з текстових полів, після цього на головному полі форми генеруються осі координат для перевірки правильності вибору точок кола. Потім викликається метод DrowCircle який використовуючи вище введені параметри малює коло.
Другий спосіб потребує два кліки на головному полі форми( Picture Box).
Перший клік задає центр кола, а другий – точку на колі. Радіус визначається як відстань між цими двома точками.
Метод pictureBox1_MouseUp визначає параметри кола аналізуючи події MouseEventArgs та кількість їх появи. Перша поява( перший клік) визначає координати центра кола, друга визначає координати точки на колі. Після цього обчислюється значення радіуса кола. Обчислені параметри передаються в метод DrowCircle, який і генерує коло.
Метод DrowCircle приймає три параметри: абсциса центра кола, ордината центра кола та радіус. Використовуючи алгоритм Брезенхема генерує коло.
Головна форма програми містить Picture Box де відображаються згенеровані кола, дві кнопки: Paint для малювання кола використовуючи параметри введені з клавіатури та Clear для очистки Picture Box від попередньо згенерованих кіл. Три поля Label містять назви параметрів кола: абсциса центра кола, ордината центра кола та радіус. Три поля Text Box містять їх числові параметри.
Код методів міститься в дотатку.
Рис.7 Дизайн головної форми програми
Скріншоти вікон
Рис. 8 Головна форма програми після запуску
Рис. 9 Генерація кола за допомогою мишки
Рис. 10 Генерація кола за допомогою клавіатури
Рис. 11 Перевірка роботи кнопки Clear
Висновки
Список використаної літератури:
-
Василюк А. С. «Методичні вказівки для виконання розрахункової графічної роботи з дисципліни: Комп’ютерна графіка»
-
Вікіпедія https://uk.wikipedia.org/wiki/
-
Алгоритм Брезенхема http://www.mari-l.ru/mmlab/home/kg/Lection5/3.html
Додатки
Текст програми мовою C#
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
{
private int m_nMouseClickCount;
private Point m_CenterPoint;
public Form1()
{
InitializeComponent();
m_nMouseClickCount = 0;
}
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
Graphics gr = pictureBox1.CreateGraphics();
gr.Clear(Color.White);
gr.DrawLine(new Pen(Color.Black), 200, 0, 200, 400);
gr.DrawLine(new Pen(Color.Black), 0, 200, 400, 200);
}
private void DrowCircle(int _x, int _y, int radius)
{
Graphics gr = pictureBox1.CreateGraphics();
int x = 0, y = radius, gap = 0, delta = (2 - 2 * radius);
int h = radius / 2;
while (y >= 0)
{
gr.FillRectangle(Brushes.Black, _x + x, _y + y, 1, 1);
gr.FillRectangle(Brushes.Black, _x + x, _y - y, 1, 1);
gr.FillRectangle(Brushes.Black, _x - x, _y - y, 1, 1);
gr.FillRectangle(Brushes.Black, _x - x, _y + y, 1, 1);
gap = 2 * (delta + y) - 1;
if (delta < 0 && gap <= 0)
{
x++;
delta += 2 * x + 1;
continue;
}
gap = 2 * (delta - x) - 1;
if (delta >= 0 && gap > 0)
{
y--;
delta -= 2 * y + 1;
continue;
}
x++;
delta += 2 * (x - y);
y--;
}
}
private void pictureBox1_Click(object sender, EventArgs e)
{
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
if (m_nMouseClickCount % 2 == 0)
{
m_nMouseClickCount++;
m_CenterPoint.X = e.X;
m_CenterPoint.Y = e.Y;
Graphics gr = pictureBox1.CreateGraphics();
gr.FillRectangle(Brushes.Black, e.X - 1, e.Y- 1, 2, 2);
}
else
{
m_nMouseClickCount++;
double r = Math.Sqrt(Math.Pow(m_CenterPoint.X - e.X, 2) + Math.Pow(m_CenterPoint.Y - e.Y, 2));
DrowCircle(m_CenterPoint.X, m_CenterPoint.Y, (int)r);
}
}
private void Form1_Load(object sender, EventArgs e)
{
Graphics gr = pictureBox1.CreateGraphics();
gr.Clear(Color.White);
gr.DrawLine(new Pen(Color.Black), 200, 0, 200, 400);
gr.DrawLine(new Pen(Color.Black), 0, 200, 400, 200);
}
private void button2_Click(object sender, EventArgs e)
{
int x = 0, y = 0, r = 0;
try
{
x = Convert.ToInt32(txtX.Text);
y = Convert.ToInt32(txtY.Text);
r = Convert.ToInt32(txtR.Text);
}
catch
{
;
}
Graphics grStart = pictureBox1.CreateGraphics();
grStart.DrawLine(new Pen(Color.Black), 200, 0, 200, 400);
grStart.DrawLine(new Pen(Color.Black), 0, 200, 400, 200);
DrowCircle(x + 200, -y + 200, r);
}
}
}