четверг, 5 февраля 2009 г.

[Разминка для ума] Отсечение отреза брезенхема.

Посты с пометкой с тегом [Разминка для ума] содержат простые задачи на программирование, решение которых не тривиально.

Дано:
Отрезок, аппроксимированный алгоритмом Брезенхема на двумерной дискретной плоскости. Иными словами - последовательность пикселов изображения, аппроксимирующих отрезок прямой.
У отрезка есть начальные координаты int X, Y; и конечные int X_last, Y_last.
Для простоты будем считать, что 0=Y=X, Y < Y_last, X < X_last и Y_last < X_last. Т.е все безобразие происходит в нижней восьмушке первого квадранта и дальнейшие выкладки сильно упрощены.
Дабы не было недопонимания - я пользую метод Брезенхема в котором:
на 0ой итерации
 di = 2*Y_last - X_last;

на каждой следующей итерации
 if(di >= 0){
di -= 2*X_last;
Y += 1;
}
X += 1;
di += 2*Y_last;


Задача1:
Для любого X <= int X` <= X_last найти соответствующий ему Y` и di.

Задача2:
Для любого Y <= int Y` <= Y_last найти соответствующий ему наименьший X` и di.

Условие - не использовать итеративный метод. Т.е. цикл Брезенхема от начала до точки X` (Y`) не считается (слишком дорого). Нужно решение фиксированной сложности.

В чем подвох: Т.к. di может быть и положительным и отрицательным и принимать достаточно большие значения как "туда" так и "обратно" не совсем понятно что надо делить и как потом "подправлять".

У меня на первую головоломку ушло чуть меньше 2х дней. Решение простое, но не тривиальное. Вторую буду решать завтра. Надеюсь, что решение будет аналогичным.

Комментариев нет:

Отправить комментарий