Bresenham
У старі часи, коли люди ще писали власні основні відеопрограми для малювання ліній та кіл, було нечувано використовувати алгоритм рядків Брезенхема.
Брезенхем вирішує цю проблему: ви хочете намалювати лінію на екрані, яка переміщує dx
пікселі в горизонтальному напрямку, в той же час обертаючи dy
пікселі у вертикальному напрямку. Існує притаманний "плаваючий" персонаж рядкам; навіть якщо у вас є цілі пікселі, ви закінчуєте раціональні нахили.
Але алгоритм повинен бути швидким, це означає, що він може використовувати лише цілу арифметику; і воно також відходить без будь-якого множення чи ділення, лише додавання і віднімання.
Ви можете адаптувати це до свого випадку:
- Ваш "х напрямок" (з точки зору алгоритму Брезена) - ваш годинник.
- Ваш "y напрямок" - це значення, яке ви хочете збільшити (тобто, позиція вашого персонажа - обережно, це насправді не "y" вашого спрайту чи іншого на екрані, більше абстрактне значення)
"x / y" тут - не розташування на екрані, а значення одного з ваших вимірів у часі. Очевидно, якщо ваш спрайт працює в довільному напрямку по екрану, у вас буде кілька бресенхамів, які працюють окремо, 2 для 2D, 3 для 3D.
Приклад
Скажімо, ви хочете перемістити свого персонажа простим рухом від 0 до 25 вздовж однієї з осей. Коли він рухається зі швидкістю 2,5, він прибуде туди в кадрі 10.
Це те саме, що "малювання лінії" від (0,0) до (10,25). Візьміть алгоритм лінійки Брезенама і нехай він працює. Якщо ви зробите це правильно (і коли ви вивчите це, дуже швидко стане зрозуміло, як ви це зробите правильно), тоді він створить для вас 11 "балів" (0,0), (1,2), (2, 5), (3,7), (4,10) ... (10,25).
Підказки щодо адаптації
Якщо ви перейдете на цей алгоритм Google і знайдете якийсь код (у Вікіпедії є досить великий договір про нього), вам потрібно стежити за деякими речами:
- Це, очевидно, працює для всіх видів
dx
та dy
. Вас зацікавив один конкретний випадок (тобто його ніколи не будете dx=0
).
- Звичайна реалізація матиме кілька різних випадків для квадранта на екрані, в залежності від того ,
dx
і dy
є позитивними, негативними, а також того abs(dx)>abs(dy)
чи ні. Ви, звичайно, також вибираєте те, що вам тут потрібно. Ви повинні переконатися, що напрямок, який збільшується 1
кожним галочкою, завжди є вашим "годинниковим" напрямком.
Якщо застосувати ці спрощення, результат справді буде дуже простим і позбудеться будь-яких результатів.