Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КГ.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
595.52 Кб
Скачать

Алгоритм dda-линии:

Алгоритм DDA-линии растеризует отрезок прямой между двумя заданными точками, используя вычисления с вещественными числами. Аббревиатура DDA в названии этого алгоритма машинной графики происходит от англ. Digital Differential Analyzer (цифровой дифференциальный анализатор) — вычислительное устройство, применявшееся ранее для генерации векторов...

Целочисленный алгоритм dda-линии

Основным недостатком алгоритма, приведенного выше является работа с числами в формате плавающей точкой. Этого можно избежать, используя арифметику с фиксированной точкой (см. Числа с фиксированной точкой).    Модифицированный алгоритм выглядит следующим образом:   #include "fixed.h"   #define roundf(x) floor(x + 0.5f)   void line_DDA_fixed(HDC hdc, float x1, float y1, float x2, float y2) {       // (1) Целочисленные значения координат начала и конца отрезка,        // округленные до ближайшего целого       int iX1 = roundf(x1);       int iY1 = roundf(y1);       int iX2 = roundf(x2);       int iY2 = roundf(y2);         // (2) Длина и высота линии       int deltaX = abs(iX1 - iX2);       int deltaY = abs(iY1 - iY2);         // (3) Считаем минимальное количество итераций, необходимое       // для отрисовки отрезка. Выбирая максимум из длины и высоты       // линии, обеспечиваем связность линии       int length = max(deltaX, deltaY);         // особый случай, на экране закрашивается ровно один пиксел       if (length == 0)       {             SetPixel(hdc, iX1, iY1, 0);             return;       }         // (4) Вычисляем приращения на каждом шаге по осям абсцисс и ординат       fixed dX = frac_to_fixed(x2 - x1, length);       fixed dY = frac_to_fixed(y2 - y1, length);         // (5) Начальные значения       fixed x = float_to_fixed(x1);       fixed y = float_to_fixed(y1);         // Основной цикл       length++;       while (length--)       {             SetPixel(hdc, round_fixed(x), round_fixed(y), 0);             x += dX;             y += dY;       } }

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

Алгоритм Брезенхе́ма (англ. Bresenham's line algorithm) — это алгоритм, определяющий, какие точки двумерного растра нужно закрасить, чтобы получить близкое приближение прямой линии между двумя заданными точками. Это один из старейших алгоритмов в машинной графике — он был разработан Джеком Е. Брезенхэмом (Jack E. Bresenham) в компанииIBM в 1962 году.    Реализация на C++

void drawLine(int x1, int y1, int x2, int y2) {

const int deltaX = abs(x2 - x1);

const int deltaY = abs(y2 - y1);

const int signX = x1 < x2 ? 1 : -1;

const int signY = y1 < y2 ? 1 : -1;

//

int error = deltaX - deltaY;

//

setPixel(x2, y2);

while(x1 != x2 || y1 != y2) {

setPixel(x1, y1);

const int error2 = error * 2;

//

if(error2 > -deltaY) {

error -= deltaY;

x1 += signX;

}

if(error2 < deltaX) {

error += deltaX;

y1 += signY;

}

}

}

  • Примечание: Описанный выше алгоритм не рисует вертикальных и горизонтальных линий.

Алгоритм Ву — это алгоритм разложения отрезка в растр со сглаживанием. Был предложен У Сяолинем (Xiaolin Wu, отсюда устоявшееся в русском языке название алгоритма) в статье, опубликованной журналом Computer Graphics в июле 1991 года. Алгоритм сочетает высококачественное устранение ступенчатости и скорость, близкую к скорости алгоритма Брезенхема без сглаживания.

10/ Простейшие аффинные преобразования на плоскости. Приведите математические формулы.