Реализация алгоритмов построения отрезков с помощью различных алгоритмов

Автор работы: Пользователь скрыл имя, 08 Декабря 2013 в 13:49, лабораторная работа

Описание работы

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

Файлы: 1 файл

Лабораторная работа №1 по дисциплине «Компьютерная графика».docx

— 500.14 Кб (Скачать файл)

        // основная  x

                i=hx;

                j=0;

                oi=Lx;

                oj=Ly;

        } else {

        // основная y

                i=0;

                j=hy;

                oi=Ly;

                oj=Lx;

        }

 

        int m=2*oj;

        int f=2*oj-oi;

        inLog("Ошибка",f);

 

        for (int k=1; k<=oi; k++){

                if (f>=0){

                        x+=hx;

                        y+=hy;

                        f-=2*oi;

                } else {

                        x+=i;

                        y+=j;

                }

                f+=m;

                putPixel(canvas,x,y);

                inLog("Точка в координатах",x,y);

                inLog("Ошибка",f);

        }

        inLog("Конец линии");

        FPoints->OutTime->Caption=IntToStr(timeGetTime()-time);

 

}

//---------------------------------------------------------------------------

void paintBrezWSLine(TCanvas* canvas)

{

        int time = timeGetTime();

        inLog("Новая линия, алгоритм Брезенхема с устранением ступенчатости");

        inLog("Координаты начала",x1,y1);

        inLog("Координаты конца",x2,y2);

 

        int dy = y2-y1;

        int dx = x2-x1;

        inLog("Глобальные приращения",dx,dy);

        int x=x1,y=y1;

        int hy = sign(dy);

        int hx = sign(dx);

        inLog("Локальные приращения",hx,hy);

 

        int Ly = abs(dy);

        int Lx = abs(dx);      // шаги по основной и дополнительной оси

        int i,j;               // длины по основной и дополнительной

        int oi,oj;

 

        if (Lx>Ly){    // определяем основную и дополнительную ось

                i=hx;

                j=0;

                oi=Lx;

                oj=Ly;  // основная x

        } else {

                i=0;

                j=hy;

                oi=Ly;

                oj=Lx;  // основная y

        }

        int In = 5;                     // число уровней интенсивности

        int dx1 = In*oi;

        int dy1 = In*oj;

 

        int m=2*oj*In;                  // скорректированный тангенс угла наклона

        int W = abs(2*In*(oj-oi));      // коэффициент изменения угла

        int f=oi*In;                    // начальная ошибка

        inLog("Тангенс угла наклона",f);

        inLog("Предел ошибки",W);

        inLog("Интенсивнось",In);

        int firstColor = 2*100/In;

        putPixel(canvas,x,y,firstColor);

        inLog("Цвет, %",firstColor);

 

        for (int k=1; k<=oi; k++){  // цикл по пикселям основной оси

                if (f>=2*dx1-2*dy1){         // если ошибка больше

                        x+=hx;

                        y+=hy;

                        inLog("Корректировка, ошибка",f);

                        f=f-2*dx1+2*dy1;

                } else {

                        x+=i;

                        y+=j;

                        f+=2*dy1;

                }

                int color = 100-100*(f/(2*oi))/In;

                if (color==100) color=100-100/In;

                putPixel(canvas,x,y,color);

                inLog("Точка в координатах",x,y);

                inLog("Цвет, %",color);

                inLog("Ошибка",f);

        }

        inLog("Конец линии");   

        FPoints->OutTime->Caption=IntToStr(timeGetTime()-time);

 

}

//---------------------------------------------------------------------------

void paintDDALine(TCanvas* canvas)

{

        int time = timeGetTime();

        inLog("Новая линия, алгоритм ЦДА");

        inLog("Координаты начала",x1,y1);

        inLog("Координаты конца",x2,y2);

        putPixel(canvas,x1,y1);

 

        int Ly = abs(y2-y1);

        int Lx = abs(x2-x1);

 

        // количество шагов

        int L = (Lx>Ly)? Lx : Ly;

        if (!L)

                return;

 

        double dx = 1.0*(x2-x1)/L;

        double dy = 1.0*(y2-y1)/L;

 

        double x = x1+0.5;

        double y = y1+0.5;

 

        while (L--)

        {

                x+=dx ; y+=dy;

                inLog("Рассчитано",x,y);

                putPixel(canvas,floor(x),floor(y));

                inLog("Точка в координатах",floor(x),floor(y));

        }

        putPixel(canvas,floor(x),floor(y));

        inLog("Конец линии");   

        FPoints->OutTime->Caption=IntToStr(timeGetTime()-time);

}


Информация о работе Реализация алгоритмов построения отрезков с помощью различных алгоритмов