С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Andrew771,
Я имел ввиду -- зачем считать каждую линию, да ещё дважды? Давай представим спрайт в виде параллельных линий. Тогда мы можем его рисовать линия за линией. Каждая линия, естественно, состоит из точек. Каждая последующая смещена относительно предыдущей, следовательно, чтобы поставить следующую точку достаточно знать на сколько нужно сместиться по у при смещении по х на 1 пиксель. Это смещение равно тангенсу угла наклона линии к горизонтали. Поскольку все линии параллельны, то у них один и тот же угол наклона, мы можем его посчитать один-единственный раз. А дальше прибавлять смещение, и если результат получится больше 1, уменьшать его на 1. Угол наклона -- это и есть угол поворота спрайта относительно начального положения. Он известен, берём тангенс из таблицы.
Для перехода к следующей строке нужно знать смещение её начала относительно предыдушей линии. Это есть котангенс нашего угла поворота. Тоже берём из таблицы (быстрее если у нас две таблицы, но можно обойтись и одной, сэкономив немного памяти).
Т. е. сложность - 2 извлечения из таблицы + суммирование и проверка для каждого пикселя.
Примерно, также мыслю.
Спрайт - прямоугольник с геометрическим центром в точке вращения. Впишем его в окружность. Таким образом, точка ЛВУ спрайта в в каждой позиции поворота будет принадлежать данной окружности.
Для каждого значения угла поворота строим таблицу, которая содержит:
1) координаты ЛВУ спрайта,
2) приращения по оси ординат для начальной левой точки каждой последующей горизонтальной линии спрайта относительно вышележащей линии,
3) приращения по оси ординат для каждой последующей точки горизонтальной линии спрайта,
4) Значение шага - число точек, после отрисовки которых пропускается точка в иходном спрайте.
Для чего нужен это шаг? - Пиксели в мониторе квадратные, а гипотенуза всегда длиннее любого из катетов. Поэтому во избежании искажения размеров спрайта при повороте придётся "прорежать" линии, чтобы их длина по диагонали визуально соответствовала горизонтальной линии. При этом изображение спрайта, конечно, пострадает. Хотя, наверное, можно пойти по другому: добавлять точки по мере приближения к горизонтали.
Углов поворота, кстати, не может быть больше, чем число пикселей, лежащих на окружности, в которую вписан спрайт.
А выбор оси приращений и направления рисования в зависимости от положения ЛВУ, думаю, сходен с таковым для рисования окружностей.
Последний раз редактировалось Sergey; 12.08.2015 в 08:25.
С уважением,
Gris / Red Triangle.
_____________________________________
ZX-EVO/TS-Labs config/NGS/HDD/SD-card
Amiga A1200/Blizzard 1230@50/32/60GB
Amiga A1200/Apollo 1260@66/32/60GB
UnAmiga (C5) AGA GM7123 VideoDAC
Хранить, всё-таки, готовые спрайты для каждой фазы, но в пакованном виде. Не думаю, что распаковка займет больше времени, чем поворот.
Последний раз редактировалось Sergey; 11.08.2015 в 16:00.
С уважением,
Gris / Red Triangle.
_____________________________________
ZX-EVO/TS-Labs config/NGS/HDD/SD-card
Amiga A1200/Blizzard 1230@50/32/60GB
Amiga A1200/Apollo 1260@66/32/60GB
UnAmiga (C5) AGA GM7123 VideoDAC
вообще говоря, речь была про цветные спрайты. 8bpp...ты как считаешь сколько займет по времени поворот чернобелого спрайта на произвольный угол?
для начала надо просто их настроить для поворотов и вапще с графикой засада.пошаговую стратегию делаешь?
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)