Алгоритм DDA не рисует прямые линии для всех значений координат

Мой код для реализации алгоритма DDA (Digital diffrential Analyzer) работает хорошо для рисования линий с наклоном менее 45o, но не работает на наклонах линий более 45o.

Он ведет себя как ломаная линия для углов> 45o


Код

void dda(int x1,int y1,int x2,int y2)
{
    float x,y,xinc,yinc,dx,dy;
    int k,step;
    dx = x2 - x1;
    dy = y2 - y1;
    step = abs(dx);
    xinc = dx / step;
    yinc = dy / step;
    x = x1;
    y = y1;
    putpixel(x,y,63);
    for(k=1;k<=step;k++)
    {
        x = x + xinc;
        y = y + yinc;
        putpixel(x,y,63);
    }
}

Является ли это недостатком алгоритма DDA или есть какая-то ошибка в моем коде, пожалуйста, помогите мне выяснить причину, которая делает мою программу неэффективной.
Спасибо

3 ответа

Решение

Нет, в алгоритме DDA такого недостатка нет, вам следует использовать следующий код, он точно будет работать.
Будет лучше, если вы будете использовать алгоритм рисования линий Брезенхэма.

Вы используете только dx для вычисления шага для вашего алгоритма, поэтому он рисует линии с углом <45 o.
Вы не используете dy в программном коде для наклона> 45o, поэтому ваши строки ломаются. Добавьте этот код, и ваш код будет работать нормально.

   if(abs(dx)>abs(dy))
       step=abs(dx);
   else
       step=abs(dy);

Если вы хотите нарисовать линии с уклоном> 1, вам нужно перебрать значение y. Это естественно, поскольку в направлении y больше шагов, чем в направлении x.

Как говорит Википедия:

Рассматривая линию с положительным наклоном, если наклон меньше или равен 1, мы производим выборку с интервалами в единицу x...

...

Для линий с наклоном больше 1 мы меняем роль х и у...

Итак, вот ваш ответ. Вам нужно иметь if, проверяя уклон и фиксируя либо dx или же dy 1. Для получения более подробной информации смотрите ссылку на Википедию, которую я разместил выше.

Другие вопросы по тегам