Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Алгоритм Люка(растровая графика) (http://forum.oszone.net/showthread.php?t=343460)

vladis3494 28-12-2019 11:37 2902628

Алгоритм Люка(растровая графика)
 
Здравствуйте! Хотел бы разобраться в логике работы алгоритма Люка, имеется в методичке псевдокод, отображающий его работу. и описано краткое описание: Генерация отрезка производится в первом октанте. На каждом шаге выполняется перемещение вдоль оси Х, оценивается возникающая ошибка по ординате 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 2902636

Цитата:

Цитата vladis3494
Генерация отрезка производится в первом октанте. »

фэйспалм: октанты в трёхмерном пространстве, а алгоритм двумерный

Цитата:

Цитата vladis3494
ошибок не выдает, но он не работает... »

вместо/вместе с PutPixel сделайте вывод значений X и Y в файл или на консоль

Iska 28-12-2019 13:59 2902642

Цитата:

Цитата vladis3494
Вот сам псевдокод алгоритма: »

«Псевдокод» сильно напоминает обычный C.


Время: 18:46.

Время: 18:46.
© OSzone.net 2001-