С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
да почти, add+jump против djnz, но это еще без учёта перезагрузок
Прихожу без разрешения, сею смерть и разрушение...
Небольшое чтиво в тему - описано как избавиться от ветвления в алгоритме Брезенхейма - ну и просто интересная книжка.
Для Спектрума это в чистом виде не очень подходит ввиду большой разрядности констант для сохранения формы линии идентичной стандартной.
А в упрощенном виде это и так (я надеюсь) все, кому не лень пробовали (во всяком случае я), хотя излом линии получался нестандартным, с некоторыми погрешностями.
тут в начале темы спорили как же лучше тестировать скорость рисования линии - как вариант можно сделать как здесь:
Даже исходники есть :
Други, подмогните!
Не могу сообразить как рассчитать шаг линии на один пиксел за раз.
Т.е. не накапливая err.
Делаю так (для 0 октанта):
dx = x - xcnt
dy = y - ycnt
err = dx / dy - dy
x = x - 1
If err < 0
y = y - 1
EndIf
Но работает как-то криво:
Код:function line(x0, x1, y0, y1) int deltax := abs(x1 - x0) int deltay := abs(y1 - y0) real error := 0 real deltaerr := deltay / deltax int y := y0 for x from x0 to x1 plot(x,y) error := error + deltaerr if error >= 0.5 y := y - 1 error := error - 1.0
вот по пунктам как я понимаю:
1. вычисляем dХ и dY
2. определяем которая из них (дельт) больше - например dy
3. переменная err - на входе цикла равна 0
4. делаем цикл на столько итераций сколько в бОльшей дельте for n=0 to (y-1)
5. ставим точку и увеличиваем ту координату, дельта которой больше - y=y+1
6. err = err + dx - прибавляем меньшую дельту к переменной
7. if err > dy then err = err-dy:x=x+1: end if;
Да не пойдёт.
В общем дело так: Есть спрайт (координаты x1,y1 в пикселах).
Есть точка назначения (x2, y2 тоже в пикселах).
Нужна подпрограмма которая сдвигает координаты спрайта (x1,y1) на один шаг (пиксель) в желаемом направлении (x2,y2).
Хранить err не вариант (ведь целевые координаты могут менятся, а спрайт всё равно должен двигатся к точке назначения).
Процедура каждый раз должна вычислять что и как прибавлять.
Т.е. сохранять err никак не полезно (ибо если коорд. изменились то прошлое значение неактуально).
Конечно можно каждый раз рассчитывать всю линию полностью, но сдвигать координаты только один раз, но мне это кажется жутким ламерством и заставить себя так сделать не могу.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)