Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
(Румянцев)Задания к лабораторным.doc
Скачиваний:
5
Добавлен:
22.12.2018
Размер:
641.02 Кб
Скачать

Работа №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);

}