• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Алгоритм Люка(растровая графика)

vladis540

New member
10.08.2019
2
0
BIT
0
Здравствуйте, форумчане, прошу вас помощь мне разобраться с алгоритмом Люка. Есть Алгоритм Люка,про него в методичке сказано, что Генерация отрезка производится в первом октанте. На каждом шаге выполняется перемещение вдоль оси Х, оценивается возникающая ошибка по ординате Y, которая накапливается. Для ее минимизации модифицируется у (добавляется 1), когда ошибка достигнет или превысит единицу.
Есть псевдокод, описывающий данный метод:
C:
#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);
                    }
                }
            }
    LukLine(g, Color.Black, 80, 200, 245, 100);
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!