Как нарисовать спираль в форме тора

Дмитрий Маштаков
  Можно ли в графическом редакторе сделать спираль в форме тора и снять об этом анимационный фильм?
  Можно, и я сейчас вам об этом расскажу. Но не потому, что задача эта такая уж актуальная, а потому, что в ходе её  решения мы познакомимся с некоторыми способами копирования.

  Скажу прежде всего, что при создании картинок для анимации я не использую исключительно свою собственную  программу MA_Paint, а привлекаю возможности обычного редактора Paint, в частности для того, чтобы рисовать графические примитивы, писать текст, делать исправления в укрупнённом масштабе, делать заливку, копировать фрагменты из общего буфера и переводить файлы из одного формата в другой.
  Нагружать собственный редактор этими функциями совершенно не к чему, поскольку обычный Paint прекрасно с ними справляется. А вот копирования выделенной области на прозрачном фоне с поворотом на произвольный угол в обычном редакторе нет.
  Следовательно завернуть спираль в тор мы не сможем. А вот нарисовать виток спирали, это пожалуйста. С этого и начнём.

  Открываем обычный  редактор Paint и рисуем тонкой линией горизонтально ориентированный овал - будущий виток нашей спирали. И делаем кистью в стороне от овала красную точку. Вокруг этой точки мы будем вращать виток спирали.
   Запоминаем результат в файле рис3.bmp (как 24-х разрядный рисунок).
   Номер рисунка не обязательно 3.   Цифру можно выбрать от 1 до 9 - именно такие названия рисунков используются программой  MA_Paint. Создав файл рис3.bmp, мы запускаем программу MA_Paint и считываем его, установив "3.bmp" и нажав кнопку Load.

   Наш овал был нарисован на белом фоне, поэтому для дальнейших действий удобно сделать так, чтобы белый цвет был фоновым в нашем рисунке.
   Для этого кликаем пару раз по кнопке активного цвета. Кнопка эта расположена в верхней части окна и окружена полем, имеющим цвет фона. Когда на кнопке появляется белый цвет, то кликаем по полю фона чтобы фон и кнопка обменялись цветом.
   Цвет фона стал белым. Теперь мы можем объявить его прозрачным для копирования, для чего в текстовое поле над кнопкой Paste помещаем русскую букву "п". А перед этой буквой поставим очень маленькое число = .0001
   Почему такое число, а не ноль, это я вам сейчас объясню.

   Дело в том, что при копировании с поворотом, а именно его мы собираемся делать, нет однозначного соответствия между пикселями источника и окрашиваемыми пикселями его повёрнутого изображения, и если копировать по принципу "пиксель в пиксель", то некоторые пиксели в изображении пропускаются, а некоторые окрашиваются дважды. В результате в изображении получается мелкая сеточка прорех, сквозь которую проглядывает прежний фон.  Исключение составляют углы поворота 0, 90, 180 и 270 градусов.
   Чтобы такого не наблюдалось, копирование с поворотом делается не "пиксель в пиксель", а "пиксель в 4 пикселя". Эти 4 пикселя составляют квадрат 2х2, с центром смещённым чуть ниже и левее того пикселя, который должен быть окрашен. Таким образом прорехи в изображении заполняются.
   Программа анализирует угол, указываемый перед буквой "п", и если он оказывается равным ровно нолю градусов, то копирование делается по принципу  "пиксель в пиксель", а если нет, то "один пиксель в четыре".
   Мы же собираемся провести копирование дважды - без поворота, и с поворотом на 4 градуса.
   И если указать для первого копирования угол 0, то линии первого изображения нашего овала окажутся тонкими, а линии второго изображения будут вдвое толще. Чтобы этого не произошло мы и указываем для первого копирования угол не ровно 0, а .0001. Разницы в сущности нет, но копирование будет проведено по-другому.
   Однако, может быть нам захочется проводить копирование во всех случаях именно самыми тонкими линиями? Этот случай предусмотрен программой. Установим на кнопке "размер точки" значение 1, и получим тот результат, который мы видим на сером поле на иллюстрации справа внизу.
   Но вернёмся к самой процедуре копирования.

   Как же осуществляется копирование в программе MA_Paint ?
   Вначале, кликами по двум диагональным углам мы обозначаем прямоугольную область, в которой находится копируемое изображение, и затем нажимаем кнопку Copy.  Координаты указанной области запоминаются и будут сохраняться  впредь до проведения нового такого же действия.
   Теперь нам нужно указать вектор переноса, то есть кликнуть последовательно две точки - точку поворота копируемого изображения (в нашем случае - красную точку левее овала) и ту точку, в которой точка поворота должна в результате копирования оказаться. После этого кликаем кнопку Paste, и первое копирование тут же происходит.
   Координаты точек вектора переноса тоже запоминаются и сохраняются впредь до нового клика по рисунку. Поэтому мы не кликаем по рисунку, но изменяем значение угла поворота на текстовом поле - вместо числа .0001 указываем 4. Затем кликаем по кнопке Paste и получаем поверх первой копии вторую копию овала, но уже повёрнутую на угол 4 градуса вокруг точки поворота.
    Заметим, что саму точку поворота мы можем и не включать в копируемую область, но тогда она не будет скопирована, а она нам будет нужна. Поэтому в выделяемую для  Copy прямоугольную область нужно включить овал вместе с красной точкой поворота.

    Нажимаем Save и запоминаем результат в файле рис3.bmp.
    Открываем  рис3.bmp в программе Paint, увеличиваем масштаб и делаем из двух изображений овала виток спирали, разорванный понизу, такой, какой показан на иллюстрации. Результат передвигаем в угол рисунка и запоминаем рисунок.
    Вновь загружаем рисунок в программу, и проделывая  описанные выше операции, делаем на центре рисунка первую копию витка спирали.
    Если мы хотим делать анимацию, то кликаем розовую кнопку записи и запоминаем её первый кадр.

    И дальше продолжим в том же духе. Убираем число .0001 и ставим последовательно 4, 8, 12 и т.д.
    Для этого не обязательно трудиться и ходить на текстовое поле. Можно нажимать на клавиатуре компьютера клавиши  <  и  >.  Каждое такое нажатие будет увеличивать или уменьшать число выставленное в текстовом поле и добавлять следом букву "п", если эта буква в поле стояла. Таким образом, поочерёдно изменяя угол поворота и делая копирование, можно быстро получать изображения навивающейся на тор спирали.

    Но может быть вам хочется перед очередным копированием покликать на поле копирования, чтобы изменить там что-то, например, изменить цвет витка, или его форму, а потом продолжить навивание своей спирали? Для продолжения процесса можно снова кликнуть по красным точкам чтобы вновь задать вектор переноса. Но вы можете немного ошибиться, и вектор переноса будет чуть отличаться от того, который был в предыдущих копированиях.
   Если такая ошибка для вас критична, то не кликайте красные точки, а восстановите тот вектор, который использовался для копирования в прошлый раз. Нажмите клавиши Shift/BackSpace и вектор переноса будет восстановлен.
  Видео смотрим тут - http://yadi.sk/i/allih5g78syjpQ
__________
14.11.2019