Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Алгоритмы Брезенхейма для вывода отрезка прямой.






Лабораторная работа № 3

Цель работы: изучить алгоритмы растровой графики (Брезенхейма) для изображения отрезка прямой и окружности.

Справочный материал

Базовые растровые алгоритмы.

Отрезок прямой.

В качестве линии на растровой сетке выступает набор пикселов Pi, Pi+1 …, такой, где любые два пиксела являются соседними в смысле заданной связности. Пикселы (x1y1) и (x2y2) могут считаться соседними в следующих случаях:

Y         4-х связная линия
      Y+1  
                 
      X+!        
                     
           
          B
           
  A                
                X

В качестве 4-х связной линии на растровой сетке выс-тупает набор пикселов такой, что:

|X i+1-X i|+| Y i+1-Y i |≤ 1

 

 

Y         8-ми связная линия
        X+1, Y+1
               
               
                B
             
               
             
  A                
                X

 

В качестве 8-ми связной линии на растровой сетке выступает набор пикселов такой, что |Xi+1-Xi|≤ 1 и(или) |Yi+1-Yi|≤ 1

 

 

Понятие линии базируется на понятии связности и естественно считать, что линия является либо восьмисвязной, либо четырехсвязной, и в общем случае, представление объекта не является единственным.

Алгоритмы Брезенхейма для вывода отрезка прямой.

Восьмисвязная линия (ограничивающее условие: 0< (y1-y2)< (x2-x1))

{ int x1=StrToInt(Form1-> Edit1-> Text); //ввод

int y1=StrToInt(Form1-> Edit2-> Text); //координат

int x2=StrToInt(Form1-> Edit3-> Text); //начальной и

int y2=StrToInt(Form1-> Edit4-> Text); //конечной точек

int dy=y2-y1;

int dx=x2-x1;

int d=(dy< < 1)-dx; // величины d, d1, d2 - результат

int d1=dy< < 1; // преобразования алгоритма

int d2=(dy-dx)< < 1; // срединной точки

int y=y1;

Image1-> Canvas-> Pixels[x1][y1]=clRed;

for(int x=x1+1; x< =x2; x++)

{

if (d> 0)

{d+=d2;

y+=1; }

Else

d+=d1;

Image1-> Canvas-> Pixels[x][y]=clRed; }

}

Четырехсвязная линия (ограничивающее условие: 0< (y1-y2)< (x2-x1))

void __fastcall TForm1:: FormCreate()

{ int x1=StrToInt(Form1-> Edit1-> Text); //ввод

int y1=StrToInt(Form1-> Edit2-> Text); //координат

int x2=StrToInt(Form1-> Edit3-> Text); //начальной и

int y2=StrToInt(Form1-> Edit4-> Text); //конечной точек

int dy=y2-y1; int dx=x2-x1;

int d=0;

int d1=dy< < 1; int d2=-(dx< < 1);

Image1-> Canvas-> Pixels[x1][y1]=clRed;

for(int x=x1, y=y1, i=1; i< =dx+dy; i++) {

if(d> 0) // приращения по X и по Y разнесены

{d+=d2; // в зависимости от выполнения

y+=1; } //условия d> 0

Else

{d+=d1;

x+=1; }

Image1-> Canvas-> Pixels[x][y]=clRed; }

}

Приведенные алгоритмы – достаточно эффективны – не выполняют операции над действительными числами с плавающей точкой, не используют операций умножения и деления, выполняют сравнение с нулем. Но обладают существенным недостатком – не позволяют рисовать линию под произвольным углом (ограничивающее условие: 0< (y1-y2)< (x2-x1).

Общий случай произвольного отрезка сводится к рассмотренному выше, если иметь в виду, что при выполнении неравенства |y2-y1|> =|x2-x1 необходимо x и y поменять местами.

namespace brez_laba

{

public partial class Form1: Form

{

public Form1()

{

InitializeComponent();

}

Bitmap b = new Bitmap(400, 300);

private void Form1_Load(object sender, EventArgs e)

{

 

}

public void brez(int x1, int y1, int x2, int y2)

{

int dx = Math.Abs(x2 - x1);

int dy = Math.Abs(y2 - y1);

int sx = x2 > = x1? 1: -1;

int sy = y2 > = y1? 1: -1;

if (dy < = dx)

{

int d = (dy < < 1) - dx;

int d1 = dy < < 1;

int d2 = (dy - dx) < < 1;

b.SetPixel(x1, y1, Color.Red);

 

for (int x = x1 + sx, y = y1, i = 1; i < = dx; i++, x += sx)

{

if (d > 0)

{

d += d2;

y += sy;

}

else

d += d1;

b.SetPixel(x, y, Color.Red);

 

}

}

else

{

int d = (dx < < 1) - dy;

int d1 = dx < < 1;

int d2 = (dx - dy) < < 1;

b.SetPixel(x1, y1, Color.Red);

for (int x = x1, y = y1 + sy, i = 1; i < = dy; i++, y += sy)

{

if (d > 0)

{

d += d2;

x += sx;

}

else

d += d1;

b.SetPixel(x, y, Color.Red);

}

}

}

 

private void button1_Click(object sender, EventArgs e)

{

int x1, x2, y1, y2;

x1 = Convert.ToInt32(textBox1.Text);

y1 = Convert.ToInt32(textBox2.Text);

x2 = Convert.ToInt32(textBox3.Text);

y2 = Convert.ToInt32(textBox4.Text);

brez(x1, y1, x2, y2);

pictureBox1.Image = b;

 

}

}

}






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.