Студопедия

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

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

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






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






    Лабораторная работа № 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 :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.