
- •Результаты обработки векторных изображений не зависят от разрешающей способности оборудования, качество изображения не ухудшится, если вы будете изменять размер, цвет и т.Д..
- •Масштабирование
- •Свойства
- •Типы аффинных преобразований
- •Список алгоритмов рисования отрезков
- •Алгоритм dda-линии:
- •Целочисленный алгоритм dda-линии
- •Алгоритм Брезенхэма:
- •Аффинное преобразование и его матричное представление
Алгоритм 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/ Простейшие аффинные преобразования на плоскости. Приведите математические формулы.