Является модификацией алгоритма Сазерленда-Коэна: точки пересечения находятся не непосредственным вычислением, а методом бинарного поиска. Первый и второй случаи обрабатываются аналогично, а в третьем случае отрезок делится пополам, и каждая из частей обрабатывается отдельно. В конце все видимые части склеиваются в один отрезок, который и будет результатом.
Достоинства:
● Используется только целочисленная арифметика (деление на два реализуется как сдвиг вправо на один бит).
Недостатки:
● Большое количество итераций.
Является оптимизацией алгоритма Сазерленда-Коэна.
Все возможные варианты расположения концов отрезка кодируются восьмибитным кодом (по четыре бита для каждого конца), который интерпретируется одним большим switch с 72 вариантами (всего 92=81, из них девять симметричных). Для каждой ситуации реализуется свой, наиболее оптимальный алгоритм нахождения ответа.
Отрезок можно представить в векторно-параметрическом виде:
V(t) = v0 + t(v1 – v0), t ∈ [0,1],
или, покоординатно,
x(t) = x0 + t(x1 – x0) = x0 + tΔx
y(t) = y0 + t(y1 – y0) = y0 + tΔy
Потребуем также, чтобы
x0 ≤ x1
y0 ≤ y1
Рис 1. Резистор
Тогда задача заключается в нахождении t0 и t1, которые будут соответствовать началу и концу видимой части отрезка. Поставим условие видимости:
xЛ ≤ x(t) ≤ xП
yН ≤ y(t) ≤ yВ
или
xЛ ≤ (x0 + tΔx) ≤ xП
yН ≤ (y0 + tΔy) ≤ yВ
что равносильно системе из четырёх неравенств:
-tΔx ≤ x0 - xЛ
tΔx ≤ xП - x0
-tΔy ≤ y0 - yН
tΔy ≤ yВ - y0
Общий вид этих неравенств:
Pit ≤ Qi i=1..4
где
P = {-Δx; Δx; -Δy; Δy}
Q = {x0 - xЛ; xП - x0; y0 - yН; yВ - y0}
Каждое из них соответствует одной из сторон отсекающего окна. Инициализируем t0=0 и t1=1 (что означает, что отрезок полностью виден) и последовательно проверяем все условия:
● Если Pi > 0, то t ≤ Qi / Pi ⇒ t1 ≤ Qi / Pi ⇒ t1 := min(t1, Qi/Pi)
● Если Pi < 0, то t ≥ Qi / Pi ⇒ t0 ≥ Qi / Pi ⇒ t0 := max(t0, Qi/Pi)
● Если Pi = 0, то прямая параллельна стороне отсекающего окна. В этом случае:
○ если Qi ≥ 0, то переходим к следующему неравенству,
○ если Qi < 0, то отрезок полностью не виден. break.