Bresenham's algorithm используется для рисования линии на квадратной сетке, например, в виде пикселей.Есть ошибка в алгоритме Брешенема из Википедии?
Алгоритм частично основан на разбиении плоскости на 8 частей, называемых октантами.
Хитрость заключается в том, чтобы использовать симметрии обобщить алгоритм, независимо от того, где расположен второй момент: во-первых, мы «двигаться» его на первом октанте, то расчеты, и, наконец, очки генерироваться преобразуются обратно в исходный октант.
В Википедии есть basic function, чтобы выполнить трюк.
function switchToOctantZeroFrom(octant, x, y)
switch(octant)
case 1: return (x, y)
case 2: return (y, x)
case 3: return (y, -x)
case 4: return (-x, y)
case 5: return (-x, -y)
case 6: return (-y, -x)
case 7: return (-y, x)
case 8: return (x, -y)
Кроме того, написано, что мы должны просто:
флипом система координируют на входе и выходе
Это основано на том факте, что эти транспозиции фактически являются involutions: f(f(x)) = x
Не обращая на это особого внимания, я сначала подумал, что это сработает.
Но для случаев 3 и 7 это не работает, потому что это не инволюция.
Например:
Case 4: (-5, 1) => (5, 1) => (-5, 1) // Good
Case 3: (-1, 5) => (5, 1) => (1, -5) // Not good
Мы должны сделать трюк еще раз:
Case 3: (-1, 5) => (5, 1) => (1, -5) => (-5, -1) => (-1, 5) // Good
Так, я что-то неправильно?
Или это на самом деле недостаток точности при составлении статьи в Википедии, и кто-то должен ее улучшить?
Нет ли лучшего способа сделать эти переходы без этого, мне нужно использовать две функции switchToOctant_onInput
и switchToOctant_onOutput
(очевидное решение этой проблемы, которое я вижу сейчас)?
Ваши октанты не соответствуют Википедии, и нигде она не говорит, что функция является эвольвентной. – stark
* Это основано на том, что эти транспозиции являются фактически инволюциями: 'f (f (x)) = x' * Как вы достигли такого вывода? –
@stark Почему вы сказали, что это не соответствует? Википедия начинает отсчет с 0, я начинаю с 1, это единственное отличие, которое я вижу. – Delgan