Что за зверь — аффинные преобразования? +9


AliExpress RU&CIS

Скорее всего, каждый из Вас хоть раз в жизни слышал термин «аффинные преобразования». Действительно, все постоянно о них говорят: «инвариантность к аффинным преобразованиям», «аугментация с помощью аффинных преобразований», «аффинные преобразования в компьютерной графике» и так далее. Однако, далеко не все могут сходу ответить на простой вопрос: «А расскажите, что такое аффинные преобразования простыми словами».

Вы сможете? В любом случае, давайте немного обсудим этот вопрос.

Что такое аффинное преобразование?

Начнем с классики - определение из Википедии.

Аффинное преобразование (от лат. affinis «соприкасающийся, близкий, смежный») — отображение плоскости или пространства в себя, при котором параллельные прямые переходят в параллельные прямые, пересекающиеся — в пересекающиеся, скрещивающиеся — в скрещивающиеся.

Внесем немного ясности.

Во-первых, что значит «отображение в себя»? Это значит, что если мы находились в пространстве R^n, то после образования мы должны остаться в нем же. Например: если мы применили какое-то преобразование к прямоугольнику и получили параллелепипед, то мы вышли из R^2 в R^3. А вот если из прямоугольника у нас получился другой прямоугольник, то все хорошо, мы отобразили исходное пространство в себя. Формально это описывается так: «преобразование fотображает пространство R^n в R^n». Если записать с помощью формул: f: R^n \rightarrow R^n.

Во-вторых, что такое «скрещивающиеся прямые»? Конечно, все это проходили в школе, но на всякий случай напомним. Прямые называются скрещивающимися, если они не лежат в одной плоскости. Вот если бы они лежали в одной плоскости и пересекались, они назывались бы пересекающимися. А если в разных плоскостях, то скрещивающимися. Пример - на рисунке.

В целом, это определение уже нам что-то говорит и мы начинаем потихоньку рисовать для себя картинку. Как минимум, мы должны остаться в той же плоскости: значит мы представляем себе 2D декартову систему координат. Здесь речь идет о нескольких прямых, так что давайте представим 2 параллельных линии. Из определения мы понимаем, что после преобразования эти линии должны остаться параллельными. Ну что ж, тогда просто сдвигаем их куда-нибудь из исходного местоположения, да и все.

По сути, мы с Вами только что описали один из видов аффинных преобразований - сдвиг.

Но давайте пойдем чуть дальше и дадим еще одно определение (не нами придуманное).

Преобразование плоскости называется аффинным, если оно непрерывно, взаимно однозначно и образом любой прямой является прямая.

Звучит это, пожалуй, чуть сложней и путанней, но дает нам больше конкретной информации, чем предыдущее определение.

Преобразование называется непрерывным, если «близкие точки переходят в близкие». Т.е. иначе - если у нас есть две точки и они находятся рядом, то после преобразования они все равно будут находиться где-то поблизости друг от друга.

Далее - преобразование взаимооднозначно, если разные точки переводятся в разные точки и в каждую точку переводится какая-то точка. Например: если мы отобразили отрезок и он слипся в точку - это не взаимооднозначное преобразование. Из отрезка мы должны получить ровно такой же отрезок, тогда будет взаимооднозначно (если это сработает для всех отрезков, конечно).

Итак, с определениями мы разобрались. Давайте теперь запишем в общем виде, а как выглядит преобразование координат в формульном виде.

Пусть у нас есть исходная система координат. Точка в этой системе характеризуется двумя числами - x и y. Совершить переход к новым координатам x' и y'мы можем с помощью следующей системы:

\begin{cases} x' = \alpha x + \beta y + \lambda \\ y' = \gamma x + \delta y + \mu  \end{cases}

При этом, числа \alpha, \beta, \gamma, \mu должны образовывать невырожденную матрицу:

\begin{pmatrix} \alpha & \beta \\ \gamma & \delta \end{pmatrix}

На всякий случай: матрица называется невырожденной, если ее определитель не равен нулю, т.е.

\begin{vmatrix} \alpha & \beta \\ \gamma & \delta \end{vmatrix} \neq 0

Можно записать и в более общем в виде.

Аффинное преобразование f: R^n \rightarrow R^n- преобразование вида f(x) = Mx +v, где M- обратимая матрица, а v \in R^n. В данном случаеx, само собой, n-мерный вектор.

Примеры аффинных преобразований

Мы с Вами достаточно подробно разобрали, что такое аффинное преобразование и как его можно описать с помощью формул. Давайте теперь рассмотрим популярные примеры.

Приходят ли Вам в голову какие-нибудь претенденты на роль\alpha, \beta, \gamma, \mu, \delta, \lambda? Позвольте мы внесем свои предложения.

Поворот

Пусть \alpha = cos(\alpha), \beta = sin(\alpha), \gamma = -sin(\alpha), \delta = cos(\alpha), \lambda = \mu = 0.

Значит, матрица Mпримет вид:

\begin{pmatrix} cos(\alpha) & sin(\alpha) \\ -sin(\alpha) & cos(\alpha) \end{pmatrix}

И новые координаты будут выглядеть так:

\begin{cases} x' = xcos\alpha + y sin\alpha \\ y' = -xsin\alpha + y cos\alpha  \end{cases}

Ничего не напоминает? Если Вы еще не узнали, то встречайте - это просто повернутая система координат на угол \alpha. Т.е. мы применили аффинное преобразование и наша система координат повернулась. Пример этого Вы можете видеть на графике.

Растяжение-сжатие

Теперь мы предлагаем сконструировать матрицуMнесколько иначе:

\begin{pmatrix} 1/k_x & 0 \\ 0 & 1/k_y \end{pmatrix}

Новые координаты тогда принимают вид:

\begin{cases} x' = x/k_x \\ y' = y/k_y  \end{cases}

В целом, тут даже уже из вида системы уравнений понятно, что мы просто растягиваем наши оси, если коэффициент меньше 1 и сжимаем, если больше 1. Пример на рисунке.

Кстати говоря, а попробуйте поставить вместо k_xчисло -1, а вместо k_yпросто 1. Что получится? Правильно, мы просто отразим нашу систему координат относительно оси OY.

Сдвиг

Ну и давайте напоследок еще один пример.

Пусть теперь матрица Mникак не меняет исходные координаты (т.е. \alpha = \delta = 1 ,beta = \gamma = 0). А вот \lambda пусть равняется -dx, а \mu = -dy.

Таким образом, наша система принимает вид:

\begin{cases} x' = x - dx \\ y' = y - dy  \end{cases}

Если отразить это на графике, то мы просто сдвинули начало координат в точку (dx, dy). Вот, собственно, и вся премудрость.

Эпилог

Эта короткая статья позволит Вам чуть сильней прочувствовать «внутренности» аффинных преобразований (мы надеемся на это). После прочтения попробуйте все-таки ответить на вопрос, который мы ставили в самом начале - «А расскажите, что такое аффинные преобразования простыми словами». Теперь сможете?

P.S. Кстати говоря, было бы неплохо не верить нам на слово и проверить самим - а матрицы M, которые мы использовали - точно невырожденные? Может мы вообще что-то противозаконное сделали?...




Комментарии (18):

  1. GCU
    /#22598530

    Про замену базиса ни слова?

    • ITResume
      /#22600338

      Вообще можно очень долго говорить про эту тему, потому что это основы основ :)

  2. engine9
    /#22598596

    Интуитивно догадываюсь, что эти преобразования производятся в почти каждом 2Д и 3Д редакторе при манипуляциях над объектами. Поворот, смещение, скос, масштабирование.

  3. sshikov
    /#22599186 / +1

    А разве писать это слово с одной буквой Ф правильно?

    • newdya
      /#22599384

      Нет, и автор не только не заметил, что в цитате правильное написание, но и на КДПВ Афина, которая сюда никаким боком.

      • Yaong
        /#22599542 / +1

        для КДПВ можно было сделать анимацию классических игр на консолях. На той же Суперфамиком целый режим бэкграунда mode7 это чистый пример аффинных трансформаций.

        Перспектива добавляется хитрой манипуляцией с каждым сканлайном.

      • ITResume
        /#22600350

        Ну так Афина просто по созвучности, почему бы и нет :) Всяк лучше, чем скучные картинки с прямыми линиями, коих в статье и так предостаточно.

    • ITResume
      /#22600346

      Неправильно! Но что-то пошло не так :)

      • sshikov
        /#22600432

        Да, причем несколько раз (довольно много). Хорошо что поправили)

        • Bhudh
          /#22601046

          Плохо, что не везде.
          Ну, что общий уровень образования плохо, так это уже привычно…

  4. Brak0del
    /#22599946

    К слову, аффинные преобразования популярны в теории компиляторов.

  5. Yermack
    /#22600884

    Здесь на хабре есть еще хорошая статья по теме, а так, вся эта матричная кухня наиболее внятно раскрыта в книжке:
    Роджерс Д., Адамс Дж. Математические основы машинной графики

  6. omxela
    /#22603104

    На мой непросвещенный взгляд, автор (как и многие другие авторы) делает
    методически все наоборот: он начинает с «умных» слов и букв, а заканчивает
    тем, с чего бы следовало начать. Кстати, аффинное или афинное — обе формы
    допустимы, во второй легче делать правильной ударение на «и». По мне так и
    нужно начинать с трех составляющих преобразований — это просто и понятно.
    Потом записать уравнения. Потом матрицу. А потом для ясности можно поговорить
    и про преобразование в математическом смысле. Приведенное автором «популярное»
    определение непрерывности уж слишком, на мой вкус, популярно до неправильности.
    Что такое «точки близко» или «где-то рядом»? Я ведь могу взять две точки сколь
    угодно близко и придумать такое преобразование, которое разносит их по
    краям вселенной. И что? Такое статическое определение не годится. Все дело в том,
    что если я начну сближать мои исходные точки, преобразованные тоже начнут
    сближаться. Если исходное расстояние стремится к 0, то и преобразованное
    расстояние — тоже. Это если есть непрерывность. Это такое локальное предельное
    понятие. Дедушка Фихтенгольц машет ручкой.

    • ITResume
      /#22604462

      В плане непрерывности согласен. Но, опять же, чтобы действительно понять термин «непрерывность» в том смысле, как его используют в функциональном анализе и далее во всех более узких разделах математики, нужно уделить этому особо пристальное внимание. «Точки близко» — скорее некий трюк, который позволяет человеку «прочувствовать» саму суть. Математически это абсолютно нестрого и непонятно, спору нет. Но большинство людей привыкло представлять даже самые сложные абстракции на плоскости (ну в крайнем случае — в 3D). И это позволяет им это сделать: «Ага, точки были близко, потом что-то произошло, и они остались все равно близкими. Примерно представил».

    • ITResume
      /#22604472

      Кстати говоря, по поводу «методически неправильно». Согласен с Вами, можно было пойти в другом порядке и было бы лучше. Наверно, на всех накладывает отпечаток традиционное университетское образование, где все происходит именно так: сначала куча зубодробительных формул, а потом примеры. И то не всегда, к сожалению :(

      • omxela
        /#22607870

        И я с Вами согласен. Я хорошо понимаю, откуда ноги растут. Так получилось,
        что в университете я эту тему прохлопал ушами. А лет аж через 30 пришлось
        заниматься алгоритмами совмещения фрагментов спутниковых снимков,
        сделанных под разными углами. Тут аффинное преобразование вылазит самым
        естественным образом. Пришлось открывать заново, и до моей тупой головы
        все дошло как раз с понимания того, что это сумма трансляций, вращений и
        растяжений. Дальше уже детали.

        • ITResume
          /#22609442

          И так из поколения в поколение :) Наверно, когда-нибудь случится переворот и все станет по-другому. Но это уже совсем другая история… Хотя и хочется верить.

          А с другой стороны, это как задача про курицу и яйцо. Будешь давать много практики и мало теории — уже через десяток лет будет поколение безграмотных «специалистов», которые даже не будут знать, откуда у всех этих методов и алгоритмов ноги растут. Они не смогут сопоставить, например, машинное обучение и статистику. А будешь давать много теории и мало практики — будут голые теоретики, которые, к тому же, ничего не запомнили. А как соблюсти этот баланс?..

  7. Bhudh
    /#22603370

    аффинное или афинное — обе формы
    допустимы
    Только в разных языках.
    Или Вы можете предъявить словарь русского языка со словом афинный?
    Например, gramota.ru не может.