Рубрики

Алгоритм генерации линии DDA в компьютерной графике

В любой двумерной плоскости, если мы соединяем две точки (x0, y0) и (x1, y1), мы получаем отрезок. Но в случае компьютерной графики мы не можем напрямую соединить любые две координатные точки, для этого мы должны вычислить координату промежуточной точки и поставить пиксель для каждой промежуточной точки желаемого цвета с помощью таких функций, как putpixel (x, y, K ) в C , где (x, y) — наша координата, а K обозначает некоторый цвет.

Примеры:

Input: For line segment between (2, 2) and (6, 6) :
we need (3, 3) (4, 4) and (5, 5) as our intermediate
points.

Input: For line segment between (0, 2) and (0, 6) :
we need (0, 3) (0, 4) and (0, 5) as our intermediate
points.

Для использования графических функций наш экран вывода системы обрабатывается как система координат, где координата верхнего левого угла равна (0, 0), и когда мы движемся вниз, наша ордината увеличивается, а когда мы движемся вправо, наша координата увеличивается для любой точки (х, у).
Теперь для генерации любого отрезка нам нужны промежуточные точки, а для их расчета мы можем использовать базовый алгоритм, называемый алгоритмом генерации линий DDA (Цифровой дифференциальный анализатор) .

Алгоритм DDA:
Рассмотрим одну точку линии как (X0, Y0), а вторую точку линии как (X1, Y1).

// calculate dx , dy
dx = X1 - X0;
dy = Y1 - Y0;

// Depending upon absolute value of dx & dy
// choose number of steps to put pixel as
// steps = abs(dx) > abs(dy) ? abs(dx) : abs(dy)
steps = abs(dx) > abs(dy) ? abs(dx) : abs(dy);

// calculate increment in x & y for each steps
Xinc = dx / (float) steps;
Yinc = dy / (float) steps;

// Put pixel for each step
X = X0;
Y = Y0;
for (int i = 0; i <= steps; i++)
{
    putpixel (X,Y,WHITE);
    X += Xinc;
    Y += Yinc;
}

// C программа для генерации линии DDA
#include<stdio.h>
#include<graphics.h>

  
// Функция для нахождения абсолютного значения

int abs (int n)

{

    return ( (n>0) ? n : ( n * (-1)));

}

  
// Функция DDA для генерации линии

void DDA(int X0, int Y0, int X1, int Y1)

{

    // вычисляем dx & dy

    int dx = X1 - X0;

    int dy = Y1 - Y0;

  

    // вычисляем шаги, необходимые для генерации пикселей

    int steps = abs(dx) > abs(dy) ? abs(dx) : abs(dy);

  

    // вычисляем приращение x & y для каждого шага

    float Xinc = dx / (float) steps;

    float Yinc = dy / (float) steps;

  

    // Положить пиксель для каждого шага

    float X = X0;

    float Y = Y0;

    for (int i = 0; i <= steps; i++)

    {

        putpixel (X,Y,RED);  // поместить пиксель в (X, Y)

        X += Xinc;           // увеличиваем x на каждом шаге

        Y += Yinc;           // увеличиваем y на каждом шаге

        delay(100);          // для визуализации строки

                             // шаг за шагом

    }

}

  
// Драйвер программы

int main()

{

    int gd = DETECT, gm;

  

    // Инициализация графической функции

    initgraph (&gd, &gm, "");   

  

    int X0 = 2, Y0 = 2, X1 = 14, Y1 = 16;

    DDA(2, 2, 14, 16);

    return 0;

Выход:



Алгоритм генерации линии Брезенхэма

Эта статья предоставлена Шивам Прадхан (anuj_charm) . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Алгоритм генерации линии DDA в компьютерной графике

0.00 (0%) 0 votes