Автор работы: Пользователь скрыл имя, 08 Декабря 2013 в 13:49, лабораторная работа
Цель работы: реализация алгоритмов построения отрезков по методу цифрового дифференциального анализатора (ЦДА), алгоритмов Брезенхема (действительного, целочисленного, оптимизированного и с устранением ступенчатости) и Ву, исследование их характеристик и сравнение полученных результатов.
// основная 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=
}
//----------------------------
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,
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=
}
//----------------------------
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),
inLog("Точка в координатах",floor(x),floor(y)
}
putPixel(canvas,floor(x),
inLog("Конец линии");
FPoints->OutTime->Caption=
}
Информация о работе Реализация алгоритмов построения отрезков с помощью различных алгоритмов