Линия соединяет две точки. Это основной элемент в графике. Чтобы нарисовать линию, вам нужно две точки, между которыми вы можете нарисовать линию. В следующих трех алгоритмах мы обозначаем одну точку линии как X0,Y0, а вторую точку линии как X1,Y1.
Алгоритм DDA
Алгоритм цифрового дифференциального анализатора (DDA) — это простой алгоритм генерации линий, который объясняется здесь шаг за шагом.
Шаг 1 — Получить ввод двух конечных точек (X0,Y0) и (X1,Y1).
Шаг 2 — Рассчитайте разницу между двумя конечными точками.
dx = X 1 - X 0 dy = Y 1 - Y 0
Шаг 3 — Исходя из рассчитанной разницы в шаге 2, вам нужно определить количество шагов для помещения пикселя. Если dx> dy, то вам нужно больше шагов в координате x; в противном случае по координате у.
if (absolute(dx) > absolute(dy)) Steps = absolute(dx); else Steps = absolute(dy);
Шаг 4 — Рассчитать приращение по координате х и координате у.
Xincrement = dx / (float) steps; Yincrement = dy / (float) steps;
Шаг 5 — Поместите пиксель, успешно увеличивая координаты x и y соответственно, и завершите рисование линии.
for(int v=0; v < Steps; v++) { x = x + Xincrement; y = y + Yincrement; putpixel(Round(x), Round(y)); }
Линия Брезенхэма
Алгоритм Брезенхэма — это еще один алгоритм преобразования инкрементного сканирования. Большим преимуществом этого алгоритма является то, что он использует только целочисленные вычисления. Перемещаясь по оси x в единичных интервалах и на каждом шаге выбирайте между двумя разными координатами y.
Например, как показано на следующем рисунке, из позиции (2, 3) необходимо выбрать между (3, 3) и (3, 4). Вам бы хотелось, чтобы точка была ближе к исходной линии.
В позиции выборки Xk+1, вертикальное отделение от математической линии обозначено как dupper и dlower.
На приведенном выше рисунке координата y на математической линии в xk+1 равна —
Y = m (Xk + 1) + b
Итак, dupper и dlower определяются следующим образом:
dlower=y−yk
=m(Xk+1)+b−Yk
а также
dupper=(yk+1)−y
=Yk+1−m(Xk+1)−b
Вы можете использовать их, чтобы принять простое решение о том, какой пиксель ближе к математической линии. Это простое решение основано на разнице между двумя позициями пикселей.
dнижний−dверхний=2м(xk+1)−2yk+2b−1
Заменим m на dy / dx, где dx и dy — различия между конечными точками.
dx(dнижний−dверхний)=dx(2 frac mathrmdy mathrmdx(xk+1)−2yk+2b−1)
=2dy.xk−2dx.yk+2dy+2dx(2b−1)
=2dy.xk−2dx.yk+C
Таким образом, параметр решения Pk для k- го шага вдоль линии определяется как —
pk=dx(dнижний−dверхний)
=2dy.xk−2dx.yk+C
Знак параметра решения Pk совпадает со знаком dlower−dupper.
Если pk отрицательно, выберите нижний пиксель, в противном случае выберите верхний пиксель.
Помните, что изменения координат происходят вдоль оси x с шагом в единицу, поэтому вы можете делать все с помощью целочисленных вычислений. На этапе k + 1 параметр решения задается как —
pk+1=2dy.xk+1−2dx.yk+1+C
Вычитая из этого pk, мы получаем —
pk+1−pk=2dy(xk+1−xk)−2dx(yk+1−yk)
Но xk+1 — это то же самое, что и (xk)+1. Итак —
pk+1=pk+2dy−2dx(yk+1−yk)
Где Yk+1−Yk равно 0 или 1, в зависимости от знака Pk.
Первый параметр решения p0 оценивается как (x0,y0) и определяется как —
p0=2dy−dx
Теперь, имея в виду все вышеперечисленные моменты и расчеты, вот алгоритм Брезенхема для наклона m <1 —
Шаг 1 — Введите две конечные точки линии, сохраняя левую конечную точку в (x0,y0).
Шаг 2 — Постройте точку (x0,y0).
Шаг 3 — Рассчитайте константы dx, dy, 2dy и (2dy — 2dx) и получите первое значение для параметра решения как —
p0=2dy−dx
Шаг 4 — На каждом Xk вдоль линии, начиная с k = 0, выполните следующий тест —
Если pk <0, следующая точка на графике — это (xk+1,yk) и
pk+1=pk+2dy В противном случае,
(xk,yk+1)
pk+1=pk+2dy−2dx
Шаг 5 — Повторите шаг 4 (дх — 1) раз.
При m> 1 выясните, нужно ли увеличивать x при каждом увеличении y.
После решения уравнение для параметра решения Pk будет очень похожим, только x и y в уравнении меняются местами.
Алгоритм средней точки
Алгоритм средней точки обусловлен Брезенхэмом, который был изменен Питтуэем и Ван Акеном. Предположим, что вы уже поместили точку P в координату (x, y), а наклон линии равен 0 ≤ k ≤ 1, как показано на следующем рисунке.
Теперь вам нужно решить, поставить ли следующую точку в точке E или N. Это можно выбрать путем определения точки пересечения Q, ближайшей к точке N или E. Если точка пересечения Q находится ближе всего к точке N, то N рассматривается как следующий пункт; в противном случае Е.
Чтобы определить это, сначала вычислите среднюю точку M (x + 1, y + ½). Если точка пересечения Q линии с вертикальной линией, соединяющей Е и N, находится ниже М, то возьмите Е в качестве следующей точки; в противном случае возьмите N в качестве следующего пункта.
Чтобы проверить это, нам нужно рассмотреть неявное уравнение —
F (x, y) = mx + b — y
Для положительного m в любом данном X,