exam06 - MiAneko24/bmstu-cg GitHub Wiki

06. Основные расчетные соотношения и алгоритм Брезенхема для генерации окружности.

Окружность можно описать:

(x - x0)^2 + (y - y0)^2 = R^2
x^2 + y^2 = R^2
y = sqrt(R^2 - x^2)

Параметрически:

x = x0 + R*cost
y = y0 + R*sint

t ∈ [0, 2pi)

Генерация окружности начинается из точки (0, R). В случае окружности, достаточно определить 1/8 от всей окружности, а остальные получить отражением полученной дуги.

pgh

Вообще, имем только 3 случая выбора пикселя (в выбраном нами направлении от (0, R)):

  • горизонтальный вправо
  • диаганональный вниз и вправо
  • вертикальный вниз

.

x(i - 1), y(i - 1) - нельзя!

Критерий выбора: модуль разности квадратов растоянний от центра окружности до пиксела и до идеальной окружности.

m (право) = |(xi + 1)^2 + (yi)^2 - R^2|
m (диагональ)  = |(xi + 1)^2 + (yi - 1)^2 - R^2|
m (вниз) = |(xi)^2 + (yi - 1)^2 - R^2|

ss

Опять вводят ошибку - разность между квадратами расстояний от центра окружности до диаганального пикселя и от центра до точки на окружности R^2:

Δi = (xi + 1)^2 + (yi -1)^2 - R^2

В окрестности возможны 5 вариантов прохождения окружности:

1. Между горизонтальным (Xi+1, Yi) и диагональным (Xi+1, Yi-1) пикселями.
2. Между горизонтальным (Xi+1, Yi) и другим диагональным (Xi+1, Yi+1) пикселями.
3. Между вертикальным (Xi, Yi-1) и диагональным (Xi+1, Yi-1).
4. Между вертикальным (Xi, Yi-1) и третьим диагональным (Xi-1, Yi-1) пикселями.
5. Прохождение точно через диагональный (Xi+1, Yi-1) пиксель.

1. Δi < 0, выбираем между 1 и 2.

δ1 = |(xi + 1)^2 + (yi)^2 - R^2| - |(xi + 1)^2 + (yi - 1)^2 - R^2|

Если δ1 <= 0, выбираем горизонтальный пиксель (расстояние до диагонального больше). Иначе - диагональный (расстояние до горизонтального больше).

a

2. Δi > 0, выбираем между 3 и 4.

δ2 = |(xi + 1)^2 + (yi - 1)^2 - R^2| - |(xi)^2 + (yi - 1)^2 - R^2|

Если δ2 <= 0, выбираем диагональный (расстояние до вертикального больше). Иначе - вертикальный (расстояние до диагонального больше)

b

3. Δi = 0, выбираем пятый вариант. Окружность проходит через диагональный пиксель.

Вывод x(i+1), y(i+1), и ошибки Δ(i+1):

aaaa

Псевдокод

1. Ввод R, Xc, Yc.
2. X = 0, Y = R, Δ = 2(1-R).
3. Высвечивание текущего пиксела (X,Y).
4. Анализ D:
   4.1 Если Δ < 0, go to 5.
   4.2 если Δ = 0, go to 8.
   4.3 если Δ > 0, go to 6.
5. δ1 = 2Δ + 2Y - 1 и анализ полученного значения:
   5.1 если δ1 =< 0, go to 7.
   5.2 иначе, go to 8.
6. Вычисление параметра δ2 = 2Δ - 2X - 1 и анализ полученного значения:
   6.1 если δ2 =< 0, go to 8
   6.2 иначе, go to 9.
7. Горизонтальный шаг: X = X + 1; Δ = Δ + 2X + 1. go to 3.
8. Диагональный шаг: X = X + 1; Y = Y - 1; Δ = Δ + 2(X - Y + 1). go to 3.
9. Вертикальный шаг: Y = Y - 1; Δ = Δ - 2Y + 1. go to 3.
10. Конец.

Следующий вопрос: 07. Растровая развертка сплошных областей. Алгоритм с упорядоченным списком ребер.

Предыдущий вопрос: 05. Алгоритмы Брезенхема разложения отрезков в растр. Простой алгоритм Брезенхема. Целочисленный алгоритм Брезенхема. Общий алгоритм Брезенхема.