User Tag List

Показано с 1 по 2 из 2

Тема: Поворот картинки тремя сдвигами

  1. #1

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,101
    Спасибо Благодарностей отдано 
    1,335
    Спасибо Благодарностей получено 
    322
    Поблагодарили
    151 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    Lightbulb Поворот картинки тремя сдвигами

    Любой поворот можно сделать 3-мя сдвигами. Например горизонтальным, вертикальным, и опять горизонтальным.
    Для 90 градусов, эти сдвиги будут с коэффициентом 1, а значит точные.
    Немного наглядности, для квадратика 4х4
    Код:
    abcd
    efgh  исходный квадрат
    ijkl
    mnop
    
    abcd
    fghe <
    klij <<
    pmno <<< - сдвигаем строки влево
    
    0123 - сдвигаем столбцы вниз
    amie
    fbnj
    kgco
    plhd
    
    miea >>> - сдвигаем строки вправо
    njfb >>
    okgc >
    plhd
     и получили повёрнутый квадрат
    Для 8х8 аналогично получается. Вертикальные сдвиги можно проводить поэтапно: сначала сдвинуть на 1 биты по маске 55H; потом на 2 по маске 33H; и на 4 по маске 0FH.

    Для углов не кратных 90 сдвиги будут давать некоторую погрешность. Но поскольку при сдвигах, ни один пиксель не потеряется, то погрешность отразится на их положении, но не на плотности.

    Эти 5 пользователя(ей) поблагодарили Reobne за это полезное сообщение:

    Black Cat / Era CG(12.07.2022), creator(12.07.2022), Dart Alver(13.07.2022), svofski(12.07.2022), Titus(12.07.2022)

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    20.01.2010
    Адрес
    г. Зеленоград
    Сообщений
    600
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    231
    Поблагодарили
    123 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Да, это знатный метод. Первым его распропагандировал Alan Paeth в статье "A Fast Algorithm for General Raster Rotation".
    Коэффициенты скашивания такие:
    Для первого и третьего сдвигов: -tg(phi/2)
    Для второго: sin(phi)

    Для приведённого выше случая с поворотом на pi/2 (90 градусов) это будут -1 и 1, как и показано на перестановках.

    Однако, надо иметь в виду, что для углов более pi/2 алгоритм применять нежелательно, так как дальше тангенс очень быстро растёт и при pi достигает бесконечности. Поэтому для таких углов лучше текстуру отдельно повернуть на пол-оборота и потом доворачивать на остаток. Или завести отдельный маппер, который сам поворачивает так текстуру.

    Эти 2 пользователя(ей) поблагодарили Sandro за это полезное сообщение:

    Barmaley_m(01.10.2022), Reobne(12.07.2022)

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 1
    Последнее: 20.11.2013, 20:14
  2. Поворот спрайта
    от Soplik в разделе Программирование
    Ответов: 22
    Последнее: 03.10.2011, 21:53
  3. Поворот спрайта
    от acidrain в разделе Графика
    Ответов: 9
    Последнее: 06.12.2008, 14:27
  4. 2 картинки
    от hi_soft в разделе Графика
    Ответов: 17
    Последнее: 18.06.2006, 17:23

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •