- •Работа №1 Постановка задачи
- •Краткие теоретические сведения
- •Алгоритм работы программы
- •Работа №2 Постановка задачи
- •Краткие теоретические сведения
- •Работа №3 Постановка задачи
- •Обзор теории
- •Алгоритм работы программы
- •Простой алгоритм заполнения с затравкой
- •Работа №5 Задание
- •Обзор теории
- •Код программ
- •Работа №5 Задание
- •Обзор теории
- •Код программы
- •Работа №6 Задание
- •Обзор теории
- •Графика и случайные числа
- •Кривые Гильберта
- •Фракталы
- •Код программы
- •Кривая Безье
Работа №1 Постановка задачи
Написать программу, выводящую на экран:
-
оси координат X и Y (без стрелок, белого цвета);
-
несколько отрезков в системе координат OXY.
Система координат OXY связана с экранной системой координат OUV следующим образом: оси OX и OY проходят через центр экрана, ось OX направлена слева направо, ось OY снизу вверх. Переход от координат (x, y) координатам (u, v) реализовать с помощью процедур и функций.
Реализовать в виде процедуры CDA алгоритм «Цифровой дифференциальный анализатор».
Предполагается, что:
-
(x1, y1) — начальная точка отрезка;
-
(x2, y2) — конечная точка отрезка;
-
IntRe(x) — функция, преобразующая вещественные числа в целые;
-
Sign(x) — функция, возвращающая -1, 0, 1 для отрицательного, нулевого и положительного аргументов соответственно;
-
Plot(x,y) — функция, отображающая на экране точку с координатами (x, y).
Краткие теоретические сведения
Один из методов разложения отрезка в растр состоит в решении дифференциального уравнения, описывающего этот процесс, Для прямой линии имеем
или
Решение представляется в виде
(1)
где , и , — концы разлагаемого отрезка — начальное знамение для очередного шага вдоль отрезка, Фактически уравнение (1) представляет собой рекуррентное соотношение для последовательных значений вдоль нужного отрезка. Этот метод, используемый для разложения в растр отрезков, называется цифровым дифференциальным анализатором (ЦДА), В простом ЦДА. либо , либо (большее из приращений) выбирается в качестве единицы растра. Ниже приводится простой алгоритм, работающий во всех квадрантах.
Алгоритм работы программы
private void button1_Click(object sender, EventArgs e)
{
Double x1 = (Convert.ToDouble(this.textBox1.Text) + this.pictureBox1.Width / 2);
Double y1 = (Convert.ToDouble(this.textBox2.Text) * (-1) + this.pictureBox1.Height / 2);
Double x2 = (Convert.ToDouble(this.textBox3.Text) + this.pictureBox1.Width / 2);
Double y2 = (Convert.ToDouble(this.textBox4.Text) * (-1) + this.pictureBox1.Height / 2);
Double L;
if ((Math.Abs(x2 - x1) > Math.Abs(y2 - y1)) || (Math.Abs(x2 - x1) == Math.Abs(y2 - y1)))
{
L = Math.Abs(x2 - x1);
}
else { L = Math.Abs(y2 - y1); }
Double dx = (x2 - x1) / L;
Double dy = (y2 - y1) / L;
Double x = x1 + 0.5 * sign(dx);
Double y = y1 + 0.5 * sign(dy);
Int32 i = 1;
while ((i < L) || (i == L))
{
plot(Gr, bmp, x, y);
x = x + dx;
y = y + dy;
i++;
}
this.pictureBox1.Image = bmp;
}
private Double sign(Double x)
{
if (x > 0) { return 1; };
if (x == 0) { return 0; };
return -1;
}
private void plot(Graphics Gr, Bitmap bmp, Double x, Double y)
{
Pen x1 = new Pen(Color.Black); x1.Width = 1;
Gr.DrawRectangle(x1, Convert.ToInt32(x), Convert.ToInt32(y), 1, 1);
}