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

Алгоритм работы программы

private void arc(Int32 x0, Int32 y0, Double g1, Double g2, Int32 r1, Int32 xx, Int32 yy)

{

g1 = Convert.ToDouble((Math.PI / 180.0) * g1);

g2 = Convert.ToDouble((Math.PI / 180.0) * g2);

Int32 x = Convert.ToInt32(r1 * Math.Cos(g2));

Int32 y = Convert.ToInt32(r1 * Math.Sin(g2));

p.Color = this.colorDialog1.Color;

Int32 r = Convert.ToInt32(this.textBox6.Text);

Int32 d = (x + 1) * (x + 1) + (y - 1) * (y - 1) - r1 * r1;

Int32 lim = Convert.ToInt32(r * Math.Sin(g1));

Int32 dd;

while (y > lim)

{

PutPixel(xx * x + x0, yy * y + y0);

if (d < 0)

{

dd = 2 * d + 2 * y - 1;

if (dd <= 0) { x++; d += (2 * x + 1); }

else { x++; y--; d += (2 * x - 2 * y + 2); }

}

if (d > 0)

{

dd = 2 * d - 2 * x - 1;

if (dd <= 0) { x++; y--; d += (2 * x - 2 * y + 2); }

else { y--; d += (-2 * y + 1); }

}

if (d == 0) { x++; y--; d += (2 * x - 2 * y + 2); }

}

this.pictureBox1.Image = bmp;

}

private void print(Int32 x0, Int32 y0, Double g1, Double g2, Int32 rad, Int32 Mode)

{

if (Mode == 1)

{

arc(x0, y0, g1, g2, rad, 1, 1);

}

if (Mode == 2)

{

Double gg1 = 180 - g2;

Double gg2 = 180 - g1;

arc(x0, y0, gg1, gg2, rad, -1, 1);

}

if (Mode == 3)

{

Double gg1 = g1 - 180;

Double gg2 = g2 - 180;

arc(x0, y0, gg1, gg2, rad, -1, -1);

}

if (Mode == 4)

{

Double gg1 = 360 - g2;

Double gg2 = 360 - g1;

arc(x0, y0, gg1, gg2, rad, 1, -1);

}

}

private void button3_Click(object sender, EventArgs e)

{

Int32 rad = Convert.ToInt32(this.textBox6.Text);

Int32 x0 = Convert.ToInt32(this.textBox1.Text);

Int32 y0 = Convert.ToInt32(this.textBox2.Text);

Double g1 = Convert.ToDouble(this.textBox4.Text);

Double g2 = Convert.ToDouble(this.textBox5.Text);

Int32[] mas = { 90, 180, 270, 360 };

for (int j = 0; j < 4; j++)

for (int i = 0; i < 4; i++)

{

if (g1 < mas[i])

{

print(x0, y0, g1, Math.Min(g2, mas[i]), rad, i + 1); g1 = Math.Min(g2, mas[i]);

if (g1== Math.Min(g2, mas[i])) { i = 4; }

}

}

}

Работа №4

Задание

Реализовать в виде процедуры «Простой алгоритм заполнения с затравкой».

Обзор теории

Алгоритмы заполнения с затравкой

В обсуждавшихся выше алгоритмах заполнение происходит в порядке сканирования. Иной подход используется в алгоритмах заполнения с затравкой. В них предполагается, что известен хотя бы один пиксел из внутренней области многоугольника. Алгоритм пытается найти и закрасить все другие пикселы, принадлежащие внутренней области. Области могут быть либо внутренне-, либо гранично-определенными. Если область относится к внутренне-определенным, то все пикселы, принадлежащие внутренней части, имеют один и тот же цвет или интенсивность, а все пикселы, внешние по отношению к области, имеют другой цвет. Если область относится к гранично - определенным, то все пикселы на границе области имеют выделенное значение или цвет. Ни один из пикселов из внутренней части такой области не может иметь это выделенное значение. Тем не менее пикселы, внешние по отношению к границе, так же могут иметь граничное значение. Алгоритмы, заполняющие внутренне -определенные области, называются внутренне - заполняющими, а алгоритмы для гранично-определенных областей — гранично-заполняющими. Далее будут обсуждаться гранично-заполняющие алгоритмы, однако соответствующие внутренне - заполняющие алгоритмы можно получить аналогичным образом.

Внутренне - или гранично-определенные области могут быть 4- или 8-связными. Если область 4-связная, то любого пиксела в области можно достичь с помощью комбинации движений только в 4 направлениях: налево, направо, вверх, вниз. Для 8-связной области пиксела можно достичь с помощью комбинации движений в двух горизонтальных, двух вертикальных и 4 диагональных направлениях. Алгоритм заполнения 8-связной области заполнит и 4-связную область, однако обратное неверно. Хотя каждая из подобластей 8-связной области, b является 4- связной, для перехода из одной подобласти в другую требуется 8- связный алгоритм. Однако в ситуации, когда надо заполнить разными цветами две отдельные 4-связные подобласти, использование 8-связного алгоритма вызовет неправильное заполнение обеих областей одним и тем же цветом. Далее речь в основном пойдет об алго-ритмах для 4-связных областей, однако их можно легко переделать для 8-связных областей, если заполнение проводить не в 4, а в 8 направлениях.