Войти

Показать полную графическую версию : Алгоритм Люка(растровая графика)


vladis3494
28-12-2019, 11:37
Здравствуйте! Хотел бы разобраться в логике работы алгоритма Люка, имеется в методичке псевдокод, отображающий его работу. и описано краткое описание: Генерация отрезка производится в первом октанте. На каждом шаге выполняется перемещение вдоль оси Х, оценивается возникающая ошибка по ординате Y, которая накапливается. Для ее минимизации модифицируется у (добавляется 1), когда ошибка достигнет или превысит единицу. Вот сам псевдокод алгоритма:

#define Xd 80
#define Yd 245
#define Xf 200
#define Yf 100

int Dx,Dy,Cumul;
int Xinc,Yinc,X,Y;
int col;

{
int Dx,Dy,Cumul;
int Xinc,Yinc,X,Y;
int col;
int i;

X = Xd; Y = Yd; col = 4;
putpixel(X,Y,col);
if (Xd < Xf) Xinc = 1; else Xinc = -1;
if (Yd < Yf) Yinc = 1; else Yinc = -1;
Dx = abs (Xd - Xf);
Dy = abs (Yd - Yf);

if (Dx > Dy)
{
Cumul = Dx/2;
for (i=0; i < Dx; i++)
{
X = X + Xinc;
Cumul = Cumul + Dy;
if ( Cumul >= Dx)
{
Cumul = Cumul - Dx;
Y = Y + Yinc;
}
putpixel(X,Y,col);
}
}
else
{
Cumul = Dy/2;
for (i=0; i < Dy; i++)
{
Y = Y + Yinc;
Cumul = Cumul + Dx;
if ( Cumul >= Dy)
{
Cumul = Cumul - Dy;
X = X + Xinc;
putpixel(X,Y,col);
}
}



Перевел этот алгоритм в C#,ошибок не выдает, но он не работает...

static public void LukLine(Graphics g, Color clr, int Xd, int Xf, int Yd, int Yf)
{
int Dx, Dy, Cumul;
int Xinc, Yinc, X, Y;
int col;
int i;
//int Xd = 80; int Yd = 245; int Xf = 200; int Yf = 100;

X = Xd; Y = Yd; col = 4;
PutPixel(g, clr, X, Y, col);
if (Xd < Xf) Xinc = 1; else Xinc = -1;
if (Yd < Yf) Yinc = 1; else Yinc = -1;
Dx = Math.Abs(Xd - Xf);
Dy = Math.Abs(Yd - Yf);
if (Dx > Dy)
{
Cumul = Dx / 2;
for (i = 0; i < Dx; i++)
{
X = X + Xinc;
Cumul = Cumul + Dy;
if (Cumul >= Dx)
{
Cumul = Cumul - Dx;
Y = Y + Yinc;
}
PutPixel(g, clr, X, Y, col);
}
}
else
{
Cumul = Dy / 2;
for (i = 0; i < Dy; i++)
{
Y = Y + Yinc;
Cumul = Cumul + Dx;
if (Cumul >= Dy)
{
Cumul = Cumul - Dy;
X = X + Xinc;
PutPixel(g, clr, X, Y, col);
}
}
}



}
private void button1_Click(object sender, EventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
LukLine(g, Color.Black, 80, 200, 245, 100);

}




Подскажите,пожалуйста,возможно я неверно использую алгоритм,что неверно?

Busla
28-12-2019, 12:40
Генерация отрезка производится в первом октанте. »
фэйспалм: октанты в трёхмерном пространстве, а алгоритм двумерный

ошибок не выдает, но он не работает... »
вместо/вместе с PutPixel сделайте вывод значений X и Y в файл или на консоль

Iska
28-12-2019, 13:59
Вот сам псевдокод алгоритма: »
«Псевдокод» сильно напоминает обычный C.




© OSzone.net 2001-2012