Как вы, наверное, знаете, основная идея алгоритмов в стиле Брезенхема заключается в том, что вы делаете серию фиксированных шагов, и на каждом шаге вы принимаете решение.В этом конкретном случае шаги представляют собой x
позиции между 10 и 20, и решение состоит в том, должно ли следующее значение y
быть y
или y - 1
.
.хочу выбрать значение y, которое будет ближе к значению функции для следующей x
координаты: 100 / (x + 1)
.Таким образом, вы выбираете y
, если dist(y, 100 / (x + 1))
меньше, чем dist(y - 1, 100 / (x + 1))
... в противном случае, выбирайте y - 1
.Это решение эквивалентно решению, является ли следующее выражение отрицательным:
err(x, y) = (y - 100 / (x + 1)) ^ 2 - (y - 1 - 100 / (x + 1)) ^ 2
= 2 * (y - 100 / (x + 1)) - 1
= 2 * y - 200 / (x + 1) - 1
Поскольку x + 1
положительно для интересующего нас диапазона, мы можем умножить его на него, чтобы получить эквивалентное значение решения:
err(x, y) = 2 * y * x + 2 * y - 200 - x - 1
= 2 * y * x + 2 * y - x - 201
Это значение решения, которое вы хотите использовать для каждого шага, так что это также формула, которую вы хотите использовать для расчета начального значения решения.Затем вы можете вычислить err(x + 1, y) - err(x, y)
и err(x + 1, y - 1) - err(x, y)
, чтобы получить формулы инкрементного обновления, которые будут использоваться в цикле.
Есть, конечно, и другие формулы, которые также будут работать, и любой данной формуле могут потребоваться некоторыеадаптация, если вы:
- поменяете значение
y
против y - 1
решения - решите вычислить значение решения с использованием значений до обновления и после обновления
x
и y
- хотите нарисовать пиксели с ближайшими центрами к функции против пикселей с ближайшей координатой
Пример скрипта: https://jsfiddle.net/0e8fnk5h/