Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Алгоритмы Брезенхейма для вывода отрезка прямой.Стр 1 из 3Следующая ⇒
Лабораторная работа № 3 Цель работы: изучить алгоритмы растровой графики (Брезенхейма) для изображения отрезка прямой и окружности. Справочный материал Базовые растровые алгоритмы. Отрезок прямой. В качестве линии на растровой сетке выступает набор пикселов Pi, Pi+1 …, такой, где любые два пиксела являются соседними в смысле заданной связности. Пикселы (x1y1) и (x2y2) могут считаться соседними в следующих случаях:
В качестве 4-х связной линии на растровой сетке выс-тупает набор пикселов такой, что: |X i+1-X i|+| Y i+1-Y i |≤ 1
В качестве 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;
} } }
|